-
2020-07-20 17:35:41
1. 背景
项目中常用浏览器有Chrome和IE,对于web端启动本地exe客户端。早期,Chrome和IE都提供了ActiveXObject对象,以它的exec接口,只需传入本地exe客户端所在安装路径为参数便可启动客户端。现今,Chrome摒弃了该方式,IE仍有保留。
2. 案例使用场景
本案例主要实现兼容当前Chrome和IE浏览器,web端启动本地exe客户端的一种实现方案。
3. 案例实现
3.1 原理
在注册表中注入自定义的协议,然后web端通过该协议调用启动客户端。
3.2 批处理生成注册表文件
以下批处理示例文件,实现生成打开记事本notepad.exe所需注册表文件,记事本安装目录为“C:\Windows\system32”,批处理文件命令行内容如下:
OpenClient.bat文件:
1.setlocal enabledelayedexpansion 2.rem 如果注册表文件存在则删除 3.del OpenClient.reg 4.set str1=^\ 5.set str2=^\^\ 6.for /f "tokens=*" %%i in ("%~dp0") do ( 7.set regs=%%i 8.set regs=!regs:%str1%=%str2%! 9. 10.echo Windows Registry Editor Version 5.00>>OpenClient.reg 11.echo [HKEY_CLASSES_ROOT\OpenClient]>>OpenClient.reg 12.echo @="OpenClient Protocol">>OpenClient.reg 13.echo "URL Protocol"="">>OpenClient.reg 14. 15.echo [HKEY_CLASSES_ROOT\OpenClient\DefaultIcon]>>OpenClient.reg 16.echo [HKEY_CLASSES_ROOT\OpenClient\shell]>>OpenClient.reg 17.echo [HKEY_CLASSES_ROOT\OpenClient\shell\open]>>OpenClient.reg 18.echo [HKEY_CLASSES_ROOT\OpenClient\shell\open\command]>>OpenClient.reg 19.rem 客户端exe文件具体所在目录 20.echo @="!regs!notepad.exe">>OpenClient.reg 21.)
批处理关键命令解释:
命令 解释 rem 注释 echo 测试>>test.txt 把“测试”写入到文件test.txt中 %~dp0 获取当前批处理文件所在的目录 for循环 把获取的Window下当前路径中的”\”全部替换成”\\” !regs! 通过for循环处理过后的exe所在路径 3.3 注册自定义协议
双击运行批处理文件之后生成的注册文件内容如下:
OpenClient.reg文件:
1.Windows Registry Editor Version 5.00 2.[HKEY_CLASSES_ROOT\OpenClient] 3.@="OpenClient Protocol" 4."URL Protocol"="" 5.[HKEY_CLASSES_ROOT\OpenClient\DefaultIcon] 6.[HKEY_CLASSES_ROOT\OpenClient\shell] 7.[HKEY_CLASSES_ROOT\OpenClient\shell\open] 8.[HKEY_CLASSES_ROOT\OpenClient\shell\open\command] 9.@=" C:\\Windows\\system32\\notepad.exe"
生成注册表文件内容说明:
命令 解释 Windows Registry Editor Version 5.00 注册表的版本 @=” OpenClient Protocol” 指定对应协议类型为OpenClient Command 要执行的命令 @=” C:\\Windows\\system32\\notepad.exe” 命令值 双击运行生成的OpenClient.reg文件,把生成的值和项添加到注册表中
3.4 web调用启动客户端
成功把自定义的协议写入到注册表之后,便可以在web端通过链接的方式,访问启动exe客户端:
OpenClient.html文件:
1.<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2.<html xmlns="http://www.w3.org/1999/xhtml"> 3.<head> 4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 5.</head> 6.<body> 7.<div> 8. <a href="OpenClient://"> 9. 启动客户端 10. </a> 11.</div> 12.</body> 13.</html>
双击运行OpenClient.html文件,点击“启动客户端” 后效果图如下,选中“始终在关联应用中打开这些类型的链接”,再点击“打开记事本”便可。
3.5 提示
有的Chrome浏览器版本,没有选择“始终在关联应用中打开这些类型的链接”,每次打开都提示是否打开,该问题可通过更换浏览器版本解决。
4. 总结
在web端启动本地安装的exe客户端,以上方案可以满足当前主流的Chrome和IE浏览器。由于第三方客户端安装目录不定,所以当安装目录变更时,需要再到exe文件所在目录下重新注册自定义协议,确保协议中command的命令值更新,能够找到需要启动的客户端。
世界这么大,我只是一个永远需要不断学习和思考的小学生,感谢所有的挫折和困难。
如果文章中一个点或者一句话对您有一点点帮助或者启发,请您点赞、评论或收藏一下,小伙伴们的智慧【三连】是对黔仔我最大的鼓励,谢谢。
更多相关内容 -
ppty客户端安装包,深信服web调用客户端工具CRT、xshell配置安装控件
2022-02-20 06:38:26ppty客户端安装包,深信服web调用客户端工具CRT、xshell配置安装控件 -
web调用客户端程序
2017-08-28 20:25:27最近做一个集成需求,我们是B/S架构的,对方是C/S架构的,对方直接扔过来一个EXE连OCX都没有,让我们调用,也就是说,我们需要通过js程序去调用他们的客户端程序并传入多个参数,当时内心是崩溃的,网上查了些资料,...背景
最近做一个集成需求,我们是B/S架构的,对方是C/S架构的,对方直接扔过来一个EXE连OCX都没有,让我们调用,也就是说,我们需要通过js程序去调用他们的客户端程序并传入多个参数,当时内心是崩溃的,网上查了些资料,发现还真的可以!下面开始。
原理
1.在注册表中把需要调用的exe注册一个调用协议 2.在浏览器中通过<a>标签来直接调用
设置注册表调用协议
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Browser] @="" "URL Protocol"="" [HKEY_CLASSES_ROOT\Browser\DefaultIcon] @="D:\\MyCode\\learnTest\\RegisterURI\\wrapper.exe" [HKEY_CLASSES_ROOT\EmrBrowser\Shell] @="" [HKEY_CLASSES_ROOT\Browser\Shell\Open] @="" [HKEY_CLASSES_ROOT\Browser\Shell\Open\Command] @="D:\\MyCode\\learnTest\\RegisterURI\\wrapper.exe %1"
说明:
Browser:自定义的协议名称;
D:\MyCode\learnTest\RegisterURI\wrapper.exe :调用的exe文件路径;
%1 :代表传入的参数;
以上内容可以直接保存到记事本里,修改为.reg文件,双击执行即可。
当然,也可以regedit直接进注册表一级一级的设置,具体修改注册表自行搜索。
文章末尾有demo可以下载参考。效果如图:
如何调用
1.一个<a>标签即可: <a href="Browser:// 0000513082 R475323015">测试调用EXE</a> 2.使用JQuery创建a标签调用: function sendReportsToPrinter() { var link = $('<a href="Browser:// 0000513082 R475323015"></a>'); $('body').append(link); link.get(0).click(); link.remove(); }
说明:
(敲黑板~)此处重点,重点,重点
Browser:// 定义的注册表协议名,会作为第一个参数传入,多个参数用空格分割即可,看下图,最后一个参数会自动添加/需要单独处理。
执行效果:
参考链接
1.https://msdn.microsoft.com/en-us/library/aa767914.aspx#app_ex (msdn强烈推荐) 2.http://www.cnblogs.com/hwade/archive/2008/01/08/1029686.html
Demo下载
-
网页端调用客户端的cs 程序
2021-08-18 14:23:19网页端调用客户端的cs 程序 -
web通过注册表调用Bs客户端
2015-04-14 10:34:55web通过注册表调用BS客户端,修改注册表,通过注册程序调用本机BS客户端程序 -
web服务器端调用客户端可执行文件
2018-11-05 16:21:11利用服务器端调用客户端可执行文件,本人测试过,完全可用. -
文件在线预览插件.rar web应用客户端调用本地应用打开文件
2019-06-03 22:10:40文件在线预览插件.rar web应用客户端调用本地应用打开文件,执行onlinePreviewFile-plugin.exe,在js中使用 location.href="onlinePreviewFile://... -
WebService客户端调用WebService服务示例代码——java
2019-01-03 17:01:13WebService客户端调用WebService服务示例代码,java代码,纯手工,包括直接httpClient直接发送Saop报文调用和利用wsimport -keep 生成客户端代码后调用两种方式的示例。因涉及商务账户密码隐私,因此代码中的有些账号... -
Web页面调用本地客户端程序并传参
2019-05-17 11:13:15翻了不少资料,总的来说好像都要操作注册表调用客户端以及传参。 1.写了一个简单的WPF的Demo来接收参数,当接收到参数时弹出消息框。(只要是客户端应该都有个主入口来接收参数的) public partial class App...好久没跟新博客了,今天跟新2019年的第一篇博客,最近在做项目,需求就是Web页面调用本地客户端程序并传参,传参是为了避免客户端再次输入账号密码,直接跳过登录。
翻了不少资料,总的来说好像都要操作注册表调用客户端以及传参。
1.写了一个简单的WPF的Demo来接收参数,当接收到参数时弹出消息框。(只要是客户端应该都有个主入口来接收参数的)
public partial class App : Application { protected override void OnStartup(StartupEventArgs e) { if (e.Args.Length > 0) { var window = new WPFDemo(); window.ShowEx(e.Args[0]); } } }
/// <summary> /// 获取启动参数 /// </summary> /// <param name="args"></param> public void ShowEx(string args) { MessageBox.Show(args); }
2.往注册表写入信息,客户端文件路径以及参数占位符(个人理解)。
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\WPFDemo]
@=""
"URL Protocol"=""
[HKEY_CLASSES_ROOT\WPFDemo\DefaultIcon]
@=C:\\Users\\Administrator\\Desktop\\新建文件夹\\WpfApp1.exe,1"
[HKEY_CLASSES_ROOT\WPFDemo\shell]
@=""
[HKEY_CLASSES_ROOT\WPFDemo\shell\open]
@=""
[HKEY_CLASSES_ROOT\WPFDemo\shell\open\command]
@="\"C:\\Users\\Administrator\\Desktop\\新建文件夹\\WpfApp1.exe\" \"%1\""绿色的是注册表中的项值,红色的是你要调用的客户端路径,注意双斜扛。%1应该代表的是你要传的参。
新建个txt文本,把以上文本复制进去保存。跟改下txt后缀名为reg,双击运行即可注册进注册表。
然后win+R,输入regedit,打开注册表。检查注册成功了没,如下图注册成功。
3.建个web页面测试下。WPFDemo要写你注册表中注册的项值,后面写传递给客户端的参数。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <div> <a href="WPFDemo://admin,123456"> open exe </a> </div> </body> </html>
4.运行html,测试下是否成功。客户端弹出所传参数,说明接收成功了。到此web端调用本地客户端程序传参完成,后续客户端接收参数跳过登录也好,做其它操作也好都行了。
好久没写博客了,正好项目需要研究这个问题,记录下来,以便以后自己遇到相同问题有个参照,当然能帮助到其他人就更好了。代码学习感觉是个长期积累的过程,不能松懈。
-
Springboot整合CXF发布Web service和客户端调用(用户和密码验证)
2019-10-16 17:07:04Springboot整合CXF发布Web service和客户端调用(用户和密码验证)打开及用 -
webservices客户端方式调用接口
2016-04-27 11:24:26调用接口方法之一,客户端方式调用,测试开发的webservices接口 -
SignalR Winform服务端、客户端实现,附带web端调用Demo
2018-06-21 11:21:47SignalR Winform服务端、客户端实现,附带web端调用Demo。案例包含了永久连接以及集线器两种实现方式,以及web端调用、窗体程序下调用方式实现 -
Web客户端:用CC ++编写的与REST API交互的Web客户端
2021-02-09 16:20:59Web客户端:用CC ++编写的与REST API交互的Web客户端 -
基于Delphi的Web Service 客户端调用
2010-11-06 10:19:51概述了Web Service的特点和核心要素, 依据Delphi和Java对Web Service 的支持,给出了基于Java ,Delphi开发Web Service的流程, 并用一个Delphi调用Java开发Web Service应用程序来说明跨平台Web Service应用程序的步骤... -
winform调用webapi获取Token授权案例,webapi使用oauth2.0权限控制
2022-03-01 20:23:50通过winform使用httpclient客户端调用webApi接口,api使用oauth2.0权限控制,调用接口需要进行token获取认证、 -
.NET客户端调用Web API.pdf
2019-11-18 15:59:37.NET客户端调用Web API.pdf -
webservice 客户端调用公共方法
2018-02-02 17:54:18使用URLConnection,JAXB调用webservice的公共方法,简单好用,分享一下! -
iOS使用web端调用客户端APP(支付宝)
2016-11-30 11:15:39这次做支付宝没有做集成,只是调用web端,然后提交form表单,在这里遇到了个问题,如果移动端安装了支付宝的前提下如何在web端调用客户端APP,不多说,直接上方法: 在URL Types里不需要填写任何东西这次做支付宝没有做集成,只是调用web端,然后提交form表单,在这里遇到了个问题,如果移动端安装了支付宝的前提下如何在web端调用客户端APP,不多说,直接上方法:
在URL Types里不需要填写任何东西 -
运维堡垒机深信服平台操作-安装控件调用客户端工具
2022-02-20 04:10:12步骤一: 在l浏览器web中打开堡垒机管理页面,账号登录 步骤二: 选择管理的虚拟机,在红色标记处有多种客户端工具可以管理。 ...客户端工具控件下载 ...控件解压安装,填写...客户端工具调用如下图2 图1 图2 ... -
Web 端调用exe可执行程序
2018-02-02 18:22:52Web客户端端调用带参数的exe可执行程序,js调用的方法 -
WebService客户端调用服务端方法的实例
2015-08-27 11:19:57本实例是通过客户端通过WebService,调用数据库端方法的实例。 例子中包含cxf的jar包,在调用服务器端方法时,首先要在cmd中,通过wsdl生成服务器端的接口、接口实现类等相关的javal类。 cmd WSDL2JAVA ... -
C#创建和调用WebService服务端和客户端代码
2016-07-27 21:56:06开发工具VS2013,.NET4.5. 首先创建一个最基本的web service服务端,再创建一个客户端测试,详细源代码。 -
H5实现web调用摄像头在线照相
2018-11-20 11:25:19web页面在线照相,在线调用客户端摄像头进行拍照,同时支持手机登陆网页调用手机摄像头进行拍照,目前测试用的chrome浏览器,其他的暂时没有测试,欢迎大家提意见,后期会持续更新 -
客户端调用webservice所需完整jar包
2018-06-26 11:43:21客户端调用webservice所需完整jar包,可用,客户端调用webservice所需完整jar包,可用 -
csb-sdk:CSB-SDK是由CSB(云服务总线)产品打开的,用于HTTP或Web服务API的客户端调用SDK。 它负责调用开放...
2021-05-13 14:09:36CSB-SDK是由CSB(云服务总线)产品打开的,用于HTTP或Web服务API的客户端调用SDK。 它负责调用开放的API并签署请求信息。 CSB-SDK中的内容 HTTP-SDK和WS-SDK都使用的通用基类 http-client调用HTTP API的客户端SDK ... -
web网页调用本地cs客户端程序exe
2017-10-16 21:07:00Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\WST...3.wen网页用a标签调用注册表 < a href= " WST://" > alt= "点击这里" > a > 转载于:https://www.cnblogs.com/axin85/p/7678846.html -
webservice四种发布方式及客户端调用
2016-10-09 23:52:33webservice四种发布方式及客户端调用 -
测试调用webservice接口客户端所开发的接口示例
2017-08-13 09:40:29测试调用webservice接口客户端所开发的接口示例 -
Ajax客户端异步调用服务端的实现方法(js调用cs文件)
2020-10-18 21:20:43下面小编就为大家分享一篇Ajax客户端异步调用服务端的实现方法(js调用cs文件),具有很好的参考价值,希望对大家有所帮助 -
C# VB.NET WebApi获取客户端的IP地址
2021-11-30 10:06:23一、需求 : 需要根据IP地址不同返回不同的数据接口。 二、实现:新建一个类模块 Public Module HttpRequestMessageExtensions Private Const HttpContext As String = "MS_...以上就是WebApi 获取客户端请求的IP过程。