前篇文章介绍了网页调用本地可执行程序的方式,通过在注册表中注册命令,然后在网页中调用命令启动本地程序。如果需要传递参数,则需要在注册表命令中的command项中设置如下形式的值。
"XXXXXX\XXXXXXX.exe" "%1"
&emsp创建测试程序,主要功能是显示传入的参数,同时在注册表中注册名为TestPageCall命令,如下图所示:
在网页中设置调用命令,如下所示,调用示例如下所示,其中href属性中,冒号之前是在注册表中注册的名,冒号之后则是需处理的参数信息。
<a href = 'TestPageCall:-a'>启动测试程序</a>
下图为本地程序接收的参数信息,主要是有两点:1)网页中href属性中的所有内容都传了过来;2)冒号之前的命令全变为小写(最初没注意,后续写测试程序解析命令时才发现的),为了测试是否全部变为了小写,将-a变为了-aAaB,测试发现冒号后面的大小写没有变;3)参数中如果有中文,则传到本地可执行程序中时会重新编码,如将空格变为20%,测试时,将参数变为-aA你好aB,程序接收到的参数内容如下第三张图所示。
上述结果表明,如果网页调用本地可执行程序时,网页调用命令中附加的参数会和命令共同作为一个整体参数传入本地可执行程序,也即在program的Main函数中仅会收到一个参数,如果需要通过网页传递多个值,则需将多个值按约定的格式拼在一起,在本地可执行程序中再重新解析。
注册表的HKEY_CLASSES_ROOT下有些命令会增加额外的固定命令,此时固定命令是设置在command项的值中,如下所示的acrobat的命令,传入本地可执行程序中的效果如下图所示,如果需要更多的固定参数,在command项中加入到字符串中即可。
最后以调用本地程序显示环境检测数据为例演示调用效果,在注册表中创建TestViewECData,接收的参数中包括两个数字,前一个为分页显示数据条数,后一个为显示第几页内容,中间用逗号分隔。网页中的调用为及在本地解析参数的代码如下所示:
<a href = 'TestViewECData:50,2'>查看检测数据(每页50条,查看第2页)</a><br />
<a href = 'TestViewECData:20,10'>查看检测数据(每页20条,查看第10页)</a>
if(args!=null && args.Length>0)
{
string arg0 = args[0];
if(arg0.StartsWith("testviewecdata:"))
{
string[] infos = arg0.Substring("testviewecdata:".Length).Split(',');
comboLimits.Text = infos[0];
tabControl1.SelectedTab = tabPage3;
...
comboJump2Pages.Text = infos[1];
...
}
}
程序运行效果如下图所示:
参考文献:
[1]https://blog.csdn.net/gc_2299/article/details/132701231
[2]https://learn.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa767914%28v=vs.85%29