关于发布后网站调用本地exe的曲线救国之路


注意:本文实现为C#+iis7+win10

web调用本地exe-尝试一

普遍方法:使用Process来调用应用程序

话不多说,上代码

// An highlighted block
//定义
 Process prc = new Process();
 //调用的程序,cmd可以不写路径,但其他应用程序必须写完整路径(应该是哈)
 prc.StartInfo.FileName = "cmd.exe";
 //配置信息-使用控制台(出不出小黑框)
 prc.StartInfo.UseShellExecute = false;
 //配置信息-重定向输入位置(true为由代码输入,false为小黑框中自己写)
 prc.StartInfo.RedirectStandardInput = true;
 //配置信息-重定向输出位置(true:代码可以接收返回值,false:不可以)
 prc.StartInfo.RedirectStandardOutput = true;
 //配置信息-使用错误信息位置(同上)
 prc.StartInfo.RedirectStandardError = true;
 //配置信息-是否不创建窗体(自己理解吧)
 prc.StartInfo.CreateNoWindow = true;
 //配置完成,开启
 prc.Start();
 //输入命令,exit必须要啊,不然你会接收不到返回值
 prc.StandardInput.WriteLine('你想干啥啊'+"&exit");
 //接收返回值
 result = prc.StandardOutput.ReadToEnd();
 //等待进程结束
 prc.WaitForExit();
 //关闭
 prc.Close();

优缺点

优点

1.好调试,哪里错了点哪里
2.对于不需要发布的程序来说这就够了
3.简单,不会因为对计算机不熟悉导致更改计算机配置出问题

缺点

1.发布之后无效
iis上,由于iis的安全限制,一旦应用程序发布后,该代码能够正常运行,但却是与用户的电脑环境隔离的,无论怎么调整都没用的,相信我~ 我刚开始看网上的那些教程,改这个配置,改那个配置,完全无效,丫的真怀疑他们是怎么实现的
2.发布后调试艰难

web调用本地exe-尝试二

经过一番尝试之后,我放弃了第一种尝试办法,查了很多资料后采用方法二:注册表
这种办法就是常见的点个链接,然后打开迅雷外挂那种
仍然不多说,看代码

Windows Registry Editor Version 5.00  
[HKEY_CLASSES_ROOT\Diff]  
"URL Protocol"="C:\\xxxClient\\client.exe"  
@="DiffProtocol"  
[HKEY_CLASSES_ROOT\Diff\DefaultIcon]  
@="C:\\xxxClient\\client.exe,1"  
[HKEY_CLASSES_ROOT\Diff\shell]  
[HKEY_CLASSES_ROOT\Diff\shell\open]  
[HKEY_CLASSES_ROOT\Diff\shell\open\command]  
@="\"C:\\xxxClient\\client.exe\" \"%1\""  

HKEY_CLASSES_ROOT\Diff是你添加的注册表的位置,Diff是你的注册表的目录,也是你调用的时候使用的名字
C:\\xxxClient\\client.exe是你要调用的程序的地址
%1是你要传给程序的参数
将上述代码保存为.reg格式的注册表项文件,双击运行即可
要看有没有问题,就去注册表下查看对应的注册表就OK啦,我就不多说了
你需要看的就是Diff项、DefaultIcon项、command项的值是不是你写在代码中的值
by the way, 打开注册表为win+r, regedit

另外,html中调用只需要如此如此:
<a href=“Diff://参数”>你点击的链接</a>
其中"Diff://"对应的你的注册表名字

优缺点

优点

1.web程序发布后也能用
2.与语言无关

缺点

1.很难调试
2.真的很难调试
3.真的真的很难调试

其实到这步已经实现了我想要的功能,但是,他这么难调试,跟客户安装软件后出问题了我怎么办,所以我还要再想个办法~~~

另外,该方法不能传递中文参数,因为页面上的href链接如果有中文,你懂的

web调用本地exe-最终版之曲线救国

最终版其实还是使用的方法二(别说我不宠方法一,它那么死皮赖脸的行不通,我也很无奈啊)
改进思路是我不直接调用应用程序,先调用批处理,再由批处理调用程序
改进如下:

Windows Registry Editor Version 5.00  
[HKEY_CLASSES_ROOT\Diff]  
"URL Protocol"="C:\\xxxClient\\client.bat"  
@="DiffProtocol"  
[HKEY_CLASSES_ROOT\Diff\DefaultIcon]  
@="C:\\xxxClient\\client.bat,1"  
[HKEY_CLASSES_ROOT\Diff\shell]  
[HKEY_CLASSES_ROOT\Diff\shell\open]  
[HKEY_CLASSES_ROOT\Diff\shell\open\command]  
@="\"C:\\xxxClient\\client.bat\" \"%1\""  

这里我将C:\\xxxClient\\client.exe替换成了C:\\xxxClient\\client.bat  and  C:\\xxxClient\\client.bat文本如下:


//关闭echo显示,你要想看每一步的实现过程,改为on或这取消这一行就行,具体我也不懂,自己查去~
@echo off
//定义变量,接收参数
set arg1=%1
//处理参数,由href传递过来的参数格式为: “diff://你的参数”,所以需要进行一下处理才能使用
//~8意为从第8个字符开始,-1意为截取ga到length-1,同时,这一行实际上是执行命令
//例如我传递的参数为 “diff://ping www.baidu.com”,解析后的字段为 ping www.baidu.com ,同时会执行该命令
%arg1:~8,-1%
//输出你的命令
echo %arg1%
//调试时候用,能够看到你传递的参数到底是什么,正式部署后改为exit,能够在命令执行结束后关闭小黑框
pause

调用方式还是那样
<a href=“Diff://参数”>你点击的链接</a>

优缺点

优点

1.克服了方案二不能调试的问题,同时也克服了方案一不能发布后使用的问题
2.允许自定义调用逻辑
3.避免了对注册表的频繁改动,需要改动的时候只用改bat文件即可

缺点

1.传递的参数还是不能使用中文路径
2.对系统造成了影响,客户端必须运行注册表项并拥有.bat文件

注意:.bat文件编码为ANSI,否则.bat文件内部的中文会乱码

鸣谢与声明

写这篇文章之前查看了很多博客,因为没有记录,所以不知道都是哪位的,这里感谢这些博主了~
另外啊,文中的例子实际上是参照了其他博客,然后自己实现了一遍,所以会跟其他博客的内容差不多,只是加入了我的理解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值