资源描述
对于该篇文章有疑问或者错误的地方,邮件至 wzwahl36@,欢迎交流。
在做web应用的时候,我们经常会遇到在web中调用本地应用程序的问题,例如在web中点击一个按钮,然后打开自己写的或者别人的应用程序。上网比较留意的同学应该会发现,想qq客服,淘宝的阿里旺旺客服都会有这样的效果。
其中qq的聊天按钮已经开源,你也可以写到自己的网页中,详见
下面我主要介绍一种现在主流的处理方法,这种方法在网上的其他地方也有,但是都是转来转去,而且写得不详细,对于初学者来说,很难看懂,并仿照着处理。所以这篇文章不算原创,只能说是对网上的文章进行详细说明,便于大家使用和仿照。
自己在做《电能计量仿真实训系统》中,需要在B/S系统中调用C/S仿真系统,并传入几个参数,尝试着用js调用activeObject来处理,但是这个涉及到安全性的问题,而且只能在ie下才能实现。
备注:这个项目是用Java完成的,包括c/s部分也是用java swing做的,所以我遇到的问题是在web上调用java打包之后jar应用程序,难度比web调用exe多了一步工作。
这个方法主要思路是利用自定义URL Protocol来调用应用程序。浏览器在解析到自定义URL Protocol之后,会寻找注册表,然后通过注册表启动相应的程序,然后启动改程序,传入参数。对于我这个项目而言,主要思路是利用这个自定义URL Protocol的方法,打开一个c#的应用程序,在这个程序中再调用系统命令,打开jar应用程序,并传入参数。主要实现步骤如下:
1.添加自定义URL Protocol
#####################################################################################
1.##Windows Registry Editor Version 5.00
2.##[HKEY_CLASSES_ROOT\Simu]
3.##"URL Protocol"="x:\\simu\\Simulink.exe"
4.##@="SimuProtocol"
5.##[HKEY_CLASSES_ROOT\Simu\DefaultIcon]
6.##@="x:\\simu\\Simulink.exe,1"
7.##[HKEY_CLASSES_ROOT\Simu\shell]
8.##[HKEY_CLASSES_ROOT\Simu\shell\open]
9.##[HKEY_CLASSES_ROOT\Simu\shell\open\command]
10.##@="\"x:\\simu\\Simulink.exe\" \"%1\""
#####################################################################################
在#内的为自定义URL Protocol的注册表信息,我对每一行说明一下:第一行是注册表工具的版本信息,可以自己改一改,或者自己导入任意一个注册信息,把这一行复制过来就行了;第二行中的Simu就是在HKEY_CLASSES_ROOT下面添加一个Simu树,其中Simu的名称就对应着自定义URL Protocol的名称,在web中调用的时候需要这个名称;第三行中的"x:\\simu\\Simulink.exe"是指定应用程序的路径,注意只能是exe的程序;第四行是协议的名称,可以是任意字符串,后面不会用到;第五行表示在Simu中再加一个分支,照抄,不用管;第六行中的x:\\simu\\Simulink.exe也是对应的程序路径,后面的1照抄;第七行同第五行;第八行同第五行;第九行同第五行;第十行也是将路径换成自己的程序路径即可,其中%1表示到参数,参数可以在你的程序simulink.exe中解析得到。分析毕。
将#之间的内容复制到一个txt文档中,修改后缀名为.reg,双击该文件即可直接导入到注册表中。如下图:
2.编写C#程序(simulink.exe)调用Jar应用程序
simulink.exe程序就是上述注册表中指定的程序,即web上点击按钮之后,启动的程序。
考虑到程序配置的简易和后期维护的方便,将jar程序的路径放到环境变量中,key对应为EMES_Simu,value对应为simulink.jar程序的绝对路径。
由此可得,对于simulink.exe的主要任务就是:
main(string[] args) {
/**程序流程如下:
*第一步:分析windows系统中的环境变量,得到环境变量为EMES_Simu的值(这个值是windows系统中Simulink.jar文件的绝对路径)。设为String pathValue;
*第二步:构造调用simulink.jar文件的系统命令。大致结构是:String cmdString,=“java -jar”+ pathValue + args[0] + " " + args[1] + " " args[2] + " " args[3] + " " args[4] + " " args[5];
*第三步:调用系统命令cmdString,执行Java应用程序,本程序主界面隐藏或者退出(只要不影响java应用程序的运行即可,并且java程序退出之后c#程序必须要退出)
**/
}
大家可能会思考这些功能用c语言即可完成,何必用c#的gui程序,这是因为c语言的控制台程序运行系统命令之后,控制台的黑屏会一直保留,即使你想尽办法让它最小化,隐藏或者退出,在启动的时候也会有一个黑屏一闪而过,极不美观,使用c#的gui程序,让程序的界面一直隐藏而不显示,就不会有这种一闪而过的感觉了。(当然你也可以用其他的语言或者其他方法处理了,这一点不限制)
以下是我自己的一段程序代码,作为示例:
using System;
using System.Diagnostics;
using System.Text.RegularExpressions;
using System.Windows.Forms;
namespace Simulink
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
string strFullPath = System.Windows.Forms.Application.ExecutablePath;
string strFileName = System.IO.Path.GetFileName(strFullPath);
string strFolder = strFullPath.Substring(0, strFullPath.Length - strFileName.Length);
string cmd = "start " + strFolder + "jre/bin/javaw -jar " + strFolder + "Simulink.jar";
//解析传入的参数
if (args.Length != 0)
{
//MessageBox.Show(args[0]);
String parameter = Regex.Match(args[0], @"(?<=://).+?(?=:|/|\Z)").Value;
char splitChar = ';';
string[] paras = parameter.Split(splitChar);
for (int i = 0; i < paras.Length; i++)
{
//构造调用jar文件的命令,并加上参数
cmd = cmd + " " + paras[i];
}
}
//MessageBox.Show(cmd);
//执行命令,启动java程序
RunCmd(cmd);
}
private static void RunCmd(string command)
{
//实例一个Process类,启动一个独立进程
Process p = new Process();
//Process类有一个StartInfo属性
//设定程序名
p.StartInfo.FileName = "cmd.exe";
//设定程式执行参数
p.StartInfo.Arguments = "/c " + command;
//关闭Shell的使用
p.StartInfo.UseShellExecute = false;
//重定向标准输入
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
//重定向错误输出
p.StartInfo.RedirectStandardError = true;
//设置不显示窗口
p.StartInfo.CreateNoWindow = true;
//启动
p.Start();
//也可以用这种方式输入要执行的命令
//不过要记得加上Exit要不然下一行程式执行的时候会当机
// p.StandardInput.WriteLine(command);
// p.StandardInput.WriteLine("exit");
//从输出流取得命令执行结果
// p.StandardOutput.ReadToEnd();
}
}
}
3.在web中调用自定义协议启动程序
调用协议很简单,就是一个链接即可,如下所示:
<a href="Simu://hello">SIMU</a>
需要指出的是:在标题1中的第10行注册表中代码中的%1表示传入参数,就是对应这此处的Simu://hello,解析之后就可以得到参数hello了。
效果如下图所示:
(1)web页面
(2)点击之后
(3)点击启动程序
图中可以看到后面的黑屏就是c程序调用系统命令的界面,登陆界面就是自己的java swing程序。调用成功!
4.还存在的问题
(1)路径问题
利用这种方法,还存在一个问题,这个问题在标题3(3)中的图片就可以看到,在后面的黑屏中有报错,这是因为路径问题造成的。在程序中,引用资源等都习惯使用相对路径,在web中调用c#程序之后,c#中的相对路径就是浏览器所在的路径,在c#中调用系统命令之后,在java程序中的相对路径就是c#程序的路径了!
对于这个问题的解决方法:(a)使用绝对路径,所谓绝对路径简单的说就是带盘符的路径。(b)解析路径,在生成的相对路径中解析出程序真正需要的路径。
reg文件编写方法整理
2010-07-22 10:15
假设问题是:“Regedit”已经被锁住了,我们从“开始→运行→Regedit”按确定之后,出现“注册表编辑已经被您的系统管理员停用”。如何才能解除这个限制呢?
因为限制不准用户执行“Regedit”的注册表信息是:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System中的 “DisableRegistryTools”这一项值。因此只要我们把“DisableRegistryTools”的值设为“0”(代表关闭),或是干脆把System这个注册表信息删掉(干净的操作系统本来就没有此信息)就行了。那这个REG文件怎么写,才能让“Regedit”顺利把其中的信息导入注册表呢?方法如下:
一、制作REG文件
新建一个文本文件,在其中输入以下内容:
REGEDIT4
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System]
"DisableRegistryTools"=dword:00000000
注意:“REGEDIT4”这行与后面行之间要有一空行。
编辑好了以后,为文件取个名字储存,如“unlock.reg”并保存(存盘时请记得在记事本的存盘对话框中的“保存类型”要选择“所有文件(*.*)”,否则会被当作TXT文件的)。
二、导入REG文件
因为在Windows环境下,已经没有办法执行“Regedit”,所以就要改成从DOS下执行此命令。方法是“开始→程序→MS-DOS方式”。当然,你想用启动盘开机,从纯DOS下执行也行,只是不需要这么麻烦,用Windows中的MS-DOS方式即可。
假设我的这个unlock.reg是放在C:\TEMP的话,就输入regedit c:\temp\unlock.reg后按回车。接着画面上会出现“您确定要增加 c:\temp\unlock.reg信息到注册表”的对话窗——按“确定”,“unlock.reg”的内容就输入注册表了,同时也就解除了无法执行“Regedit”的限制了。
三、学会举一反三
REG文件为什么要以“REGEDIT4”开头,而不是“REGEDIT1”或“REGEDIT2”呢?因为这是“规定”。Windows 95/98/ME/NT 4.0等的REG文件开头第一行规定必须是“REGEDIT4”。而Windows 2000/XP则是“Windows Registry Editor Version 5.00”,用以区分所使用的操作系统。从这个REG文件中,我们可以了解REG文件的内容格式:
1、开头第一行一定是:“REGEDIT4”或“Windows Registry Editor Version 5.00”,以区别操作系统;
2、注册表信息头尾用“[”与“]”包起来;
3、" "内就是字符串内容;
4、“DWORD”为“0”就是用“dword:00000000”表示,因为“DWORD”值是16进位,16进位的“0”就是“00000000”。
5、因为本例中只有一行注册表信息([HKEY_CURRENT_USER\Software\Mi...]),所以没有空行。而如果有两个以上的注册表信息,信息与信息之间就需要有空行隔开。
6、如果要删除某个注册表信息该怎么办?很简单,在注册表信息前面加上“-”(减)号。例如,“unlock.reg”我也可以这么写:
REGEDIT4
[-HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System]
只要“-HKEY_CURRENT_USER\Soft...”就可以了,“DisableRegistryTools...”那一行就可以省去不写,为什么?因为这行就是告诉“Regedit”直接去把“System”这个注册表信息删掉,而“DisableRegistryTools”又是在“System”下,头都删了,当然里面的东西也就消失了。</CA>
注册表reg文件编写
有的时候为了方便修改注册表,会制作一些脚本,如inf文件或者vbs脚本等。其中.reg文件是最方便的。
关于注册表的操作,常见的是创建、修改、删除。下面以2k or xp的注册表为环境为例,介绍.reg文件的编辑(98的.reg文件头是regedit4)。
--创建--
创建分为两种:
1 一种是创建子项(subkey)
首先创建一个文件,后缀名为".reg",内容如下:
windows registry editor version 5.00
[hkey_local_machine\software\test4adam]
然后执行该脚本,你就已经在hkey_local_machine\software\下创建了一个名字为“test4adam”的子项。
(注:"windows registry editor version 5.00" 必须要加上,同时注意单词间的空格为英文空格,否则运行后会出现错误,提示"你的注册表只能导入二进位注册文件"。)
2 另一种是创建一个项目名称
和从注册表中导出的文件格式一致,内容如下:
windows registry editor version 5.00
[hkey_local_machine\software\test4adam]
"test1"="adam"
"test2"=hex:61
"test3"=dword:00000064
(注:test1的类型是“string value” ,如果不存在则创建,存在则修改。
test2的类型是“binary value” ,如果不存在则创建,存在则修改。
test3的类型是“dword value” ,如果不存在则创建,存在则修改。
如果注册表中不存在test4adam子项,该脚本也会创建该子项。
字符串值中的特殊字符必须进行转义处理,如'\'利用'\\'代替,否则会出现更新无效。 )
--删除--
1 删除一个项目名称,创建一个如下的文件,文件名后缀为".reg":
windows registry editor version 5.00
[hkey_local_machine\software\test4adam]
"test1"=-
执行该脚本,hkey_local_machine\software\test4adam下的"test1"就被删除了;
2 删除一个子项,创建一个如下的脚本:
windows registry editor version 5.00
[-hkey_local_machine\software\test4adam]
执行该脚本,hkey_local_machine\software\test4adam就已经被删除了。
附:批处理文件命令导入注册表文件
例如程序是E盘的regedit_2k.reg文件,执行的程序是E盘劲舞团目录的patcher.exe
下面是NT用的批处理文件内容:
@echo off
reg import e:\regedit_2k.reg
start E:\劲舞团\patcher.exe
exit
Windows XP注册表文件除了可以用注册表编辑器、工具软件修改外,还可以直接用记事本制作REG文件脚本来直接修改,其优势是可以文件形式保存、交流,也保证了准确性和安全性。下面我们分别从注册表项(子项、值项)的创建、修改、删除3个方面分析REG文件的制作。
1.创建和修改
(1)创建子项
我们现在需要在HKEY_LOCAL_MACHINE\SOFTWARE下创建一个名为"IvanLuo"的子项,则只须在记事本中输入以下内容(右图):
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\IvanLuo]
将其保存为任一扩展名为REG的文件(如ivan.reg),双击其就可以在HKEY_LOCAL_MACHINE\SOFTWARE\下创建名为"ivanluo"的子项。
(2)创建或修改值项
现在要在HKEY_LOCAL_MACHINE\SOFTWARE\IvanLuo下新建一个名为"ivan"(如注册表中已有ivan值项,则为修改)、类型为"REG_DWORD"、值为"111"(16进制)的值项,则可在记事本中输入以下内容:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\IvanLuo]
"ivan"=dword:111
将以上文档保存为一个REG文件并双击之,如果此时你的注册表中没有IvanLuo这个子项,那么将会为你创建。修改时也可把需要修改的注册表项导出,用记事本打开并修改,然后将其导入即可。
2.删除
(1)删除值项
如要将HKEY_LOCAL_MACHINE\SOFTWARE\IvanLuo\下名为"ivan"的值项删除,相应REG文件的内容为:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\IvanLuo]
"ivan"=-
(2)删除子项
或要删除HKEY_LOCAL_MACHINE\SOFTWARE下的IvanLuo子项,REG文件如下书写:
Windows Registry Editor Version 5.00
[-HKEY_LOCAL_MACHINE\SOFTWARE\IvanLuo]
以上便是REG文件制作的全部内容,很简单吧!如果还有什么不懂的地方,只须将注册表中一项导出为REG文件,然后用记事本打开,对照注册表编辑器中的相应项看看便明白了。
例子:
REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\MainMenuTop]
"财务管理"="Image/index/BIS-index_08.gif;Image/index/BIS-index_08-1.gif;"
"GPS定位"="Image/index/BIS-index_12.gif;Image/index/BIS-index_12-1.gif;"
"出城登记"="Image/index/BIS-index_16.gif;Image/index/BIS-index_16-1.gif;"
"二手车"="Image/index/BIS-index_20.gif;Image/index/BIS-index_20-1.gif;"
"黑名单"="Image/index/BIS-index_22.gif;Image/index/BIS-index_22-1.gif;Blacklist.aspx"
"考试系统"="Image/index/BIS-index_14.gif;Image/index/BIS-index_14-1.gif;
"违章记录"="Image/index/BIS-index_18.gif;Image/index/BIS-index_18-1.gif;ViolationRecords.aspx"
"预约服务"="Image/index/BIS-index_10.gif;Image/index/BIS-index_10-1.gif;"
[HKEY_LOCAL_MACHINE\SOFTWARE\MainMenuTop\ButtonList]
"1"="财务管理"
"2"="预约服务"
"3"="GPS定位"
"4"="违章记录"
"5"="考试系统"
"6"="出城登记"
"7"="二手车"
"8"="黑名单"
[HKEY_LOCAL_MACHINE\SOFTWARE\MainMenuTop\ButtonNum]
"ButtonNum"="8"
[HKEY_LOCAL_MACHINE\SOFTWARE\MainMenuTop\GPS定位]
[HKEY_LOCAL_MACHINE\SOFTWARE\MainMenuTop\财务管理]
[HKEY_LOCAL_MACHINE\SOFTWARE\MainMenuTop\出城登记]
[HKEY_LOCAL_MACHINE\SOFTWARE\MainMenuTop\二手车]
[HKEY_LOCAL_MACHINE\SOFTWARE\MainMenuTop\黑名单]
[HKEY_LOCAL_MACHINE\SOFTWARE\MainMenuTop\考试系统]
[HKEY_LOCAL_MACHINE\SOFTWARE\MainMenuTop\违章记录]
[HKEY_LOCAL_MACHINE\SOFTWARE\MainMenuTop\预约服务]
[HKEY_LOCAL_MACHINE\SOFTWARE\MainMenuTop\ButtonList\GPS定位]
[HKEY_LOCAL_MACHINE\SOFTWARE\MainMenuTop\ButtonList\财务管理]
[HKEY_LOCAL_MACHINE\SOFTWARE\MainMenuTop\ButtonList\出城登记]
[HKEY_LOCAL_MACHINE\SOFTWARE\MainMenuTop\ButtonList\二手车]
[HKEY_LOCAL_MACHINE\SOFTWARE\MainMenuTop\ButtonList\黑名单]
[HKEY_LOCAL_MACHINE\SOFTWARE\MainMenuTop\ButtonList\考试系统]
[HKEY_LOCAL_MACHINE\SOFTWARE\MainMenuTop\ButtonList\违章记录]
[HKEY_LOCAL_MACHINE\SOFTWARE\MainMenuTop\ButtonList\预约服务]
注意:1.在2003系统上发布(日志) 在访问注册表的时候提示System.Security.SecurityException: 不允许所请求的注册表访问权
解决System.Security.SecurityException: 不允许所请求的注册表访问权
2003 server系统,装了.net2003 和 2005以及企业库2005之后,以前的2003版的程序有的就会报上述错误。在网上搜了很多方法,把匿名访问去掉再勾选或者重新编译企业库等方法都试过都没有解决。尝试了以下两个操作后居然成功了:
a) 进入 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Eventlog 目录 点击 安全=>权限 将来宾用户和aspnet用户设为完全控制;
b)在HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Eventlog\application下建立一个新键EnterpriseManager
c)重起iis,测试
2.把要访问的注册表的项添加aspnet用户并且赋给他完全控制权限
本文来自CSDN博客,:
软件介绍
[下载地址]
exe4j是一款很经典的将Java类文件打包成.exe文件的软件,支持把jar class文件等编译成windows下能够直接运行的exe文件,还可以添加启动等待画面
第一次安装时会出现下面的对话框:
它要求系统有1.5版本以上的JDK,点Download在线下载,如果你的机器上有JDK,点Locate找到你机器上已安装的JDK目录下/bin/java.exe就可以进行安装了。
下面就安装过程详细说明一下:
第1步,默认即可。
第2步,如果已经有制作好的jar文件,则下面一个"JAR in EXE"。
对于打包jar文件,在eclipse中右击项目选导出即可,不会制作jar文件可以给我留言
第3步,上面是项目名称,可随便填写,下面一个写出你想要将打包后的exe文件输出的目录:
第4步,由于我的演示程序是图形的,所以选第一个,如果你的程序是控制台的,则选择第二个,Executable name写你将要生成的exe文件的名字,Icon File可以选择生成文件的图标
第5步,首先,单击绿色的"+"号,在弹出的窗口中点Archive,然后找到起初已经做好的jar文件,"OK"后返回,在下面的Class Path里就出现jar文件路径后,再在上面Main Class栏内点击找到main所在的类,这一步即算完成:
第6步,你系统的JRE版本,上面填个1.3,下面填1.6:
当然,这样配置的程序只能在安装有JRE的机器上执行,发布时总要考虑的问题就是用户是否有能力在自己机器上安装JRE,总不能发布一个程序还要用户自己安装个JRE吧,下面我就介绍如何将JDK环境变量动态打包到exe中,在这里单击advanced options,选择search sequence。如图:
首先把JRE复制到exe文件输出的目录里,我用的是c:\xaocker\,在弹出的窗口中,删除列表中所有项,然后单击绿+,选择directory并选择JRE的根目录(注意是拷贝后的目录)即可,如图:
单击ok后,再从图中单击advanced options,并选择preferred VM,在弹出的窗口中选择client hostspot VM,单击next按钮继续:
第7、8步是一些基本配置,默认即可,第9步编译,第10步你就可以点这个看到效果了:
exe4j未注册的版本会出现下面的对话框:我们提供的是破解版exe4j下载(内有注册码 可免费使用)
点击确定之后就可以看到你程序的运行结果了!
java.exe依照一套逻辑来寻找可以用的JRE,首先查找自己所在的目录下有没有JRE,其次查找自己的父目录下有没有JRE;最后才是查询Windows的注册表。
现在我们的程序可以在任意的计算机上执行了,可是缺点是致命的,比方说我的程序才160K,可是不论走到哪里都要背着70多M的JRE,未免有点小题大做吧,其实作为我们的私有的JRE,好多内容都是可以抛弃的。Jre目录下的license都可以不要,bin下的执行文件只需要保留java.exe或者javaw.exe,lib下只要保留rt,jsse,jce,charsets几个库就可以了。除了i386和zi两个子目录外,其余的子目录都可以不要。Zi下只需要保留自己地区的子目录和其下的一些文件就可以。Lib下除了库之外的属性文件等等都要保留。这样清理一番,JRE仍然有接近50MB。还可以继续清理几个库文件里面不需要的内容,这需要仔细的整理,会很费功夫。最好能写出一个自动工具帮助我们整理它们。从Sun公司上下到的JMF里面附带的用Java写的媒体播放器就自带了JRE,只有几个MB。
清理过后需要运行几遍我们的应用程序,以确保我们的JRE不缺少东西。
OK,仔细清理之后,文件变小了不少,可以发布了……
展开阅读全文