一般情况下,浏览器中是无法直接和本机的其他的程序进行交互的,在IE中,我们可以通过ActiveX对象的方式进行。但是这个方式只适用于IE浏览器,另一种比较通用的方式便是URL协议的方式,我们将某种URL的协议注册给某个程序来进行处理,比如将tencent://这样的协议注册给QQ程序来进行处理,当浏览器需要访问这样的协议的时候就转给QQ程序进行处理。这种URL协议的方式是可以跨平台的,比如在Windows上你需要添加注册表项。
首先先看看js应该如何调用qq客户端。
window .open(" tencent://message/?uin=346915968 ")
window.open顾名思义,打开。Tencent就不用多说了吧 BAT之T。上述能直接打开qq帐号对应的对话框。由此可以知道网页上的在线客服功能是如何实现了吧。
那要是不需要打开对话框,就想要登陆qq应该如何实现呢?很简单呀:
window .open(" tencent://message/?uin=qq ") 不过调用应用这种跟黑客没什么差别的行为,浏览器一般都是禁止的,
选择允许后,
启动应用,qq客户端就会被调起。
为什么说这个呢,老板又给了个需求,想让调起qq客户端一样,想通过演示页面的一个按钮,调起售票系统的各种程序...
什么都不说了,先看看什么是自定义协议。
Pluggable Protocol,又叫URL Protocol,有时会叫Shell命令,通用的Protocol有http、ftp、mailto等,这些都是windows安装时自带的协议。
接着也实现一个简单的自己的自定义协议吧。
1,运行window,输入regedit打开注册表。 在HKEY_CLASSES_ROOT下面建一个自己起的名字的表。
用如下格式把各项值添上:
js打开qq音乐.exe
启动应用
end.
1.使用记事本(或其他文本编辑器)创建一个protocal.reg文件(.reg后缀的执行文件),并写入以下内容
Windows Registry Editor Version5.00[HKEY_CLASSES_ROOT\myWebshell]
@="URL:myWebshell Protocol Handler""URL Protocol"=""[HKEY_CLASSES_ROOT\myWebshell\DefaultIcon]
@="D:\\Program Files (x86)\\Tencent\\TIM\\Bin\\QQScLauncher.exe"[HKEY_CLASSES_ROOT\myWebshell\shell]
[HKEY_CLASSES_ROOT\myWebshell\shell\open]
[HKEY_CLASSES_ROOT\myWebshell\shell\open\command]
@="\"D:\\Program Files (x86)\\Tencent\\TIM\\Bin\\QQScLauncher.exe\" \"%1\""
2. 修改参数
使用记事本打开文件后,按照下图说明修改相关参数
2.1修改连接名称
修改红框内名称自定义即可,全部使用英文字符(该名称即为调用时的href),共六处
2.2修改可执行文件路径
修改红框内可执行文件路径,共两处,需注意: 文件路径中使用//分割
3. 执行protocal.reg文件
4. 创建调用连接
连接地址为 步骤1中所命名的链接名称,后面加://hello,(hello为传递参数,可任意添加)
5.查看效果
Java具有使用Runtime exec对本地程序调用进行重定向的能力 但是用重定向或者管道进行命令调用将会出错 解决这一问题的办法是通过命令shell运行命令 在Java中调用本地程序会破坏平台独立性规则 但是经常需要这么做才行 以下是一个简单类的范例 展示了在Unix下运行ls命令的情形 import java io BufferedInputStreamimport java io IOExceptionpublic class ExecLs { static public void main(String[] args) { String cmd = ls try { Process ps = Runtime getRuntime() exec(cmds)System out print(loadStream(ps getInputStream()))System err print(loadStream(ps getErrorStream()))} catch(IOException ioe) { ioe printStackTrace()} } // read an input stream into a String static String loadStream(InputStream in) throws IOException { int ptr = in = new BufferedInputStream(in)StringBuffer buffer = new StringBuffer()while( (ptr = in read()) != ) { buffer append((char)ptr)} return buffer toString() }} 上述代码中重要的部分是exec方法和命令字符串ls 本程序将输出运行目录下的列表细节 那么 如果你想重定向这些细节内容到文件该怎么办?这一命令行的输入应该写成ls >FILE 但是当你将cmd变量改变成这样的话 运行就会出错 如下 /bin/ls: >: No such file or directory/bin/ls: FILE: No such file or directory 出错的原因在于额外的参数被直接传送到了ls命令而不是送到实际的命令行 解决这一问题的办法是将cmd串弄成一个字符串数组 并且将你想运行的程序传送到命令shell 因此 将cmd行改成下面的样子 String[] cmd = { sh c ls >FILE }你将得到一个名为FILE的文件 里面是目录列表 c参数是告诉它读取随后的字符串 而最后的参数是你要运行的脚本 在这种情况下 管道也运行良好 所以你可以把命令改成下面的方式 String[] cmd = { /bin/sh c /bin/ls | grep d >FILE }这种形式将给你一个名为FILE的文件 里面是ls条目中包含d的条目 给出sh和ls的全路径有利于提供你的程序的安全性 虽然使用Runtime exec不是创建独立于平台的Java的最佳方式 但是有些时候是必要的 使用这种重定向技术有助于走出Runtime exec的限制 lishixinzhi/Article/program/Java/hx/201311/25922
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)