基于浏览器外部协议(URL Procotol)打开本地exe文件

news/2024/7/7 21:00:24

首次接到“利用网页打开本地exe文件”这个任务时,还真有点摸不着头脑,后来细想,在淘宝上点击卖家的旺旺能开启本地的旺旺,这不就是利用的网页打开本地exe文件吗?
了解这种实实在在存在的合理需求后,开始调查。经过网上搜索查询,主要归纳为两种实现方式,
方式一:利用JS打开本地exe文件。一般浏览器,由于安全问题,都会禁止掉这个特性,这就导致部分浏览器不支持该种方式。
方式二:利用浏览器外部协议(URL Procotol)打开本地exe文件。用这种方式实现,任何浏览器都兼容。
在实际开发中,当然首选方式二。

一、利用注册表文件将外部协议写入注册表

[HKEY_CLASSES_ROOT\PCTV]
@="PCTVProtocol"
"URL Protocol"="\"C:\\Program Files (x86)\\PCTV双模软终端_64位\\PCTV.exe\""
[HKEY_CLASSES_ROOT\PCTV\DefaultIcon]
@="\"C:\\Program Files (x86)\\PCTV双模软终端_64位\\PCTV.exe,1\"" 
[HKEY_CLASSES_ROOT\PCTV\shell] 
[HKEY_CLASSES_ROOT\PCTV\shell\open] 
[HKEY_CLASSES_ROOT\PCTV\shell\open\command]
@="\"C:\\Program Files (x86)\\PCTV双模软终端_64位\\PCTV.exe\" \"%1\""

将以上代码存入reg文件中,双击文件执行即可。在浏览器中输入 “pctv://” 或 “pctv://param1,param2” ,执行后即可打开对应路径下的exe文件。

二、 在安装exe文件时将外部协议写入注册表

在实际部署中,不会让客户安装完程序再手动单击注册表文件将安装路径写入注册表,最容易让人接受的方式就是在安装exe文件时将安装路径写入注册表。利用Inno Setup打包exe文件时,在脚本中加入如下代码即可:

[Registry] 
Root:HKCR;Subkey:"PCTV";ValueType:string;ValueName:"URL Protocol";ValueData:"{app}\{#MyAppExeName}";Flags:createvalueifdoesntexist uninsdeletekey
Root:HKCR;Subkey:"PCTV\DefaultIcon";ValueType:string;ValueData:"{app}\{#MyAppExeName}";Flags:createvalueifdoesntexist uninsdeletekey  
Root:HKCR;Subkey:"PCTV\shell";Flags:createvalueifdoesntexist uninsdeletekey
Root:HKCR;Subkey:"PCTV\shell\open";Flags:createvalueifdoesntexist uninsdeletekey
Root:HKCR;Subkey:"PCTV\shell\open\command";ValueType:string;ValueData:"{app}\{#MyAppExeName} ""%1""";Flags:createvalueifdoesntexist uninsdeletekey

这样,在浏览器中输入 “pctv://” 或 “pctv://param1,param2” ,执行后即可打开对应路径下的exe文件。
以上两种写入注册的方式,允许在外部协议中带参数。

三、遇到的问题

在利用外部协议打开本地exe文件时,通过查看日志记录,看到会出现路径不对的问题。通过查看代码在程序中用Environment.CurrentDirectory获取可执行文件的路径,但是通过浏览器打开exe文件时,Environment.CurrentDirectory获取的是浏览器exe文件的路径,这样在程序中就会报错。解决方法是将Environment.CurrentDirectory修改为Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory)即可。


http://lihuaxi.xjx100.cn/news/1788757.html

相关文章

KT148A语音芯片的下载用的是串口,测试可以直接串口发指令控制吗

一、问题简介 KT148A语音芯片的下载用的是串口,那我实际测试是不是可以直接串口发指令测试控制?就不用单独写程序去模拟一线串口的时序了 详细描述 首先看一下KT148A芯片的参考设计原理图:其中芯片的2脚和3脚就是串口,注意下载语…

Springboot+vue的企业员工薪酬关系系统(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频: Springbootvue的企业员工薪酬关系系统(有报告)。Javaee项目,springboot vue前后端分离项目 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳…

用二维码展示产品,随时查看图文并茂的介绍

传统的产品宣传方式,往往以产品手册、宣传单等纸质物料为主,不仅会造成客户获取和携带上的不便,一旦内容需要更新,就必须重新印刷,造成不必要的浪费,而且老用户看到的仍然是旧内容。 其实可以用二维码进行…

爱上C语言:整型和浮点型在内存中的存储(进制转换,原码,反码,补码以及大小端)

🚀 作者:阿辉不一般 🚀 你说呢:生活本来沉闷,但跑起来就有风 🚀 专栏:爱上C语言 🚀作图工具:draw.io(免费开源的作图网站) 如果觉得文章对你有帮助的话,还请…

SPringBoot项目调用本地python算法

在Spring Boot项目中调用本地Python算法的方法通常是通过使用Spring的Java-Python交互功能,以及通过Spring的依赖注入将Python函数注入到Java对象中。下面是一种可能的方法: 首先,你需要在你的Spring Boot项目中配置Python解释器。你可以使用…

【go】报错整理与解决

文章目录 依赖下载失败checksum mismatch启动报错missing go.sum 依赖下载失败checksum mismatch > go get github.com/hibiken/asynqmon go: downloading github.com/hibiken/asynqmon v0.7.2 go: github.com/hibiken/asynqmonv0.7.2: verifying module: checksum mismatc…

C 语言实现 UDP

广播 发送广播信息&#xff0c;局域网中的客户端都可以接受该信息 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <arpa/inet.h>int main() {// 1.创建一个通信的socketint fd socket(PF_INET, …

静态方法获取HttpServletRequest以及HttpServletResponse

public static HttpServletRequest getRequest() {ServletRequestAttributes servletRequestAttributes (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();if (servletRequestAttributes null) {throw (new NotWebContextException("非 web 上下…