1、 对于该篇文章有疑问或者错误的地方,邮件至 ,欢迎交流。在做 web应用的时候,我们经常会遇到在 web中调用本地应用程序的问题,例如在 web中点击一个按钮,然后打开自己写的或者别人的应用程序。上网比较留意的同学应该会发现,想 qq客服,淘宝的阿里旺旺客服都会有这样的效果。其中 qq的聊天按钮已经开源,你也可以写到自己的网页中,详见http:/ B/S系统中调用 C/S仿真系统,并传入几个参数,尝试着用 js调用 activeObject来处理,但是这个涉及到安全性的问题,而且只能在 ie下才能实现。备注:这个项目是用 Java完成的,包括 c/s部分也是用 java swing做的,所以我
2、遇到的问题是在 web上调用 java打包之后 jar应用程序,难度比 web调用exe多了一步工作。这个方法主要思路是利用自定义 URL Protocol来调用应用程序。浏览器在解析到自定义 URL Protocol之后,会寻找注册表,然后通过注册表启动相应的程序,然后启动改程序,传入参数。对于我这个项目而言,主要思路是利用这个自定义 URL Protocol的方法,打开一个 c#的应用程序,在这个程序中再调用系统命令,打开 jar应用程序,并传入参数。主要实现步骤如下:1.添加自定义 URL Protocol#1.#Windows Registry Editor Version 5.002
3、.#HKEY_CLASSES_ROOTSimu3.#“URL Protocol“=“x:simuSimulink.exe“4.#=“SimuProtocol“5.#HKEY_CLASSES_ROOTSimuDefaultIcon6.#=“x:simuSimulink.exe,1“7.#HKEY_CLASSES_ROOTSimushell8.#HKEY_CLASSES_ROOTSimushellopen9.#HKEY_CLASSES_ROOTSimushellopencommand10.#=“x:simuSimulink.exe“ “%1“#在#内的为自定义 URL Protocol的注册表信息
4、,我对每一行说明一下:第一行是注册表工具的版本信息,可以自己改一改,或者自己导入任意一个注册信息,把这一行复制过来就行了;第二行中的 Simu就是在HKEY_CLASSES_ROOT下面添加一个 Simu树,其中 Simu的名称就对应着自定义URL Protocol的名称,在 web中调用的时候需要这个名称;第三行中的“x:simuSimulink.exe“是指定应用程序的路径,注意只能是 exe的程序;第四行是协议的名称,可以是任意字符串,后面不会用到;第五行表示在 Simu中再加一个分支,照抄,不用管;第六行中的 x:simuSimulink.exe也是对应的程序路径,后面的 1照抄;第七
5、行同第五行;第八行同第五行;第九行同第五行;第十行也是将路径换成自己的程序路径即可,其中%1 表示到参数,参数可以在你的程序 simulink.exe中解析得到。分析毕。将#之间的内容复制到一个 txt文档中,修改后缀名为.reg,双击该文件即可直接导入到注册表中。如下图:2.编写 C#程序(simulink.exe)调用 Jar应用程序simulink.exe程序就是上述注册表中指定的程序,即 web上点击按钮之后,启动的程序。考虑到程序配置的简易和后期维护的方便,将 jar程序的路径放到环境变量中,key 对应为 EMES_Simu,value 对应为 simulink.jar程序的绝对路
6、径。由此可得,对于 simulink.exe的主要任务就是:main(string args) /*程序流程如下:*第一步:分析 windows系统中的环境变量,得到环境变量为 EMES_Simu的值(这个值是 windows系统中 Simulink.jar文件的绝对路径)。设为 String pathValue;*第二步:构造调用 simulink.jar文件的系统命令。大致结构是:String cmdString,=“java -jar”+ pathValue + args0 + “ “ + args1 + “ “ args2 + “ “ args3 + “ “ args4 + “ “ a
7、rgs5;*第三步:调用系统命令 cmdString,执行 Java应用程序,本程序主界面隐藏或者退出(只要不影响 java应用程序的运行即可,并且 java程序退出之后 c#程序必须要退出)*/大家可能会思考这些功能用 c语言即可完成,何必用 c#的 gui程序,这是因为 c语言的控制台程序运行系统命令之后,控制台的黑屏会一直保留,即使你想尽办法让它最小化,隐藏或者退出,在启动的时候也会有一个黑屏一闪而过,极不美观,使用 c#的 gui程序,让程序的界面一直隐藏而不显示,就不会有这种一闪而过的感觉了。(当然你也可以用其他的语言或者其他方法处理了,这一点不限制)以下是我自己的一段程序代码,作为
8、示例:using System;using System.Diagnostics;using System.Text.RegularExpressions;using System.Windows.Forms;namespace Simulinkstatic class Program/ / 应用程序的主入口点。/ STAThreadstatic void Main(string args)string strFullPath = System.Windows.Forms.Application.ExecutablePath;string strFileName = System.IO.Pat
9、h.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(args0);String parameter = Regex.Match(args0, “(?SIMU需要指
10、出的是:在标题 1中的第 10行注册表中代码中的%1 表示传入参数,就是对应这此处的 Simu:/hello,解析之后就可以得到参数 hello了。效果如下图所示:(1)web 页面(2)点击之后(3)点击启动程序图中可以看到后面的黑屏就是 c程序调用系统命令的界面,登陆界面就是自己的 java swing程序。调用成功!4.还存在的问题(1)路径问题利用这种方法,还存在一个问题,这个问题在标题 3(3)中的图片就可以看到,在后面的黑屏中有报错,这是因为路径问题造成的。在程序中,引用资源等都习惯使用相对路径,在 web中调用 c#程序之后,c#中的相对路径就是浏览器所在的路径,在 c#中调用系
11、统命令之后,在 java程序中的相对路径就是c#程序的路径了!对于这个问题的解决方法:(a)使用绝对路径,所谓绝对路径简单的说就是带盘符的路径。(b)解析路径,在生成的相对路径中解析出程序真正需要的路径。reg文件编写方法整理2010-07-22 10:15假设问题是:“Regedit”已经被锁住了,我们从“开始运行Regedit”按确定之后,出现“注册表编辑已经被您的系统管理员停用”。如何才能解除这个限制呢?因为限制不准用户执行“Regedit”的注册表信息是:HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesSys
12、tem中的 “DisableRegistryTools”这一项值。因此只要我们把“DisableRegistryTools”的值设为“0”(代表关闭),或是干脆把 System这个注册表信息删掉(干净的操作系统本来就没有此信息)就行了。那这个 REG文件怎么写,才能让“Regedit”顺利把其中的信息导入注册表呢?方法如下:一、制作 REG文件新建一个文本文件,在其中输入以下内容:REGEDIT4HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesSystem“DisableRegistryTools“=dword:00
13、000000注意:“REGEDIT4”这行与后面行之间要有一空行。编辑好了以后,为文件取个名字储存,如“unlock.reg”并保存(存盘时请记得在记事本的存盘对话框中的“保存类型”要选择“所有文件(*.*)”,否则会被当作 TXT文件的)。二、导入 REG文件因为在 Windows环境下,已经没有办法执行“Regedit”,所以就要改成从 DOS下执行此命令。方法是“开始程序MS-DOS 方式”。当然,你想用启动盘开机,从纯 DOS下执行也行,只是不需要这么麻烦,用 Windows中的 MS-DOS方式即可。假设我的这个 unlock.reg是放在 C:TEMP的话,就输入 regedit
14、c:tempunlock.reg后按回车。接着画面上会出现“您确定要增加 c:tempunlock.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”,用以区分所
15、使用的操作系统。从这个 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_USERSoftwareMi.),所以没有空行。而如果有两个以上的注册表信息,信息与信息之间就需要有空行隔开。6、
16、如果要删除某个注册表信息该怎么办?很简单,在注册表信息前面加上“-”(减)号。例如,“unlock.reg”我也可以这么写:REGEDIT4-HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesSystem只要“-HKEY_CURRENT_USERSoft.”就可以了,“DisableRegistryTools.”那一行就可以省去不写,为什么?因为这行就是告诉“Regedit”直接去把“System”这个注册表信息删掉,而“DisableRegistryTools”又是在“System”下,头都删了,当然里面的东西也就消
17、失了。注册表 reg文件编写有的时候为了方便修改注册表,会制作一些脚本,如 inf文件或者 vbs脚本等。其中.reg 文件是最方便的。关于注册表的操作,常见的是创建、修改、删除。下面以 2k or xp的注册表为环境为例,介绍.reg 文件的编辑(98 的.reg 文件头是 regedit4)。创建创建分为两种:1 一种是创建子项(subkey)首先创建一个文件,后缀名为“.reg“,内容如下: windows registry editor version 5.00 hkey_local_machinesoftwaretest4adam 然后执行该脚本,你就已经在 hkey_local_m
18、achinesoftware下创建了一个名字为“test4adam”的子项。 (注:“windows registry editor version 5.00“ 必须要加上,同时注意单词间的空格为英文空格,否则运行后会出现错误,提示“你的注册表只能导入二进位注册文件“。) 2 另一种是创建一个项目名称 和从注册表中导出的文件格式一致,内容如下: windows registry editor version 5.00 hkey_local_machinesoftwaretest4adam “test1“=“adam“ “test2“=hex:61 “test3“=dword:00000064
19、(注:test1 的类型是“string value” ,如果不存在则创建,存在则修改。test2 的类型是“binary value” ,如果不存在则创建,存在则修改。test3 的类型是“dword value” ,如果不存在则创建,存在则修改。如果注册表中不存在 test4adam子项,该脚本也会创建该子项。字符串值中的特殊字符必须进行转义处理,如利用代替,否则会出现更新无效。 )删除 1 删除一个项目名称,创建一个如下的文件,文件名后缀为“.reg“: windows registry editor version 5.00 hkey_local_machinesoftwaretest
20、4adam “test1“=- 执行该脚本,hkey_local_machinesoftwaretest4adam 下的“test1“就被删除了;2 删除一个子项,创建一个如下的脚本: windows registry editor version 5.00 -hkey_local_machinesoftwaretest4adam 执行该脚本,hkey_local_machinesoftwaretest4adam 就已经被删除了。附:批处理文件命令导入注册表文件例如程序是 E盘的 regedit_2k.reg文件,执行的程序是 E盘劲舞团目录的 patcher.exe下面是 NT用的批处理文件
21、内容:echo offreg import e:regedit_2k.regstart E:劲舞团patcher.exeexitWindows XP注册表文件除了可以用注册表编辑器、工具软件修改外,还可以直接用记事本制作 REG文件脚本来直接修改,其优势是可以文件形式保存、交流,也保证了准确性和安全性。下面我们分别从注册表项(子项、值项)的创建、修改、删除 3个方面分析 REG文件的制作。1.创建和修改(1)创建子项我们现在需要在 HKEY_LOCAL_MACHINESOFTWARE下创建一个名为“IvanLuo“的子项,则只须在记事本中输入以下内容(右图):Windows Registry
22、Editor Version 5.00HKEY_LOCAL_MACHINESOFTWAREIvanLuo将其保存为任一扩展名为 REG的文件(如 ivan.reg),双击其就可以在HKEY_LOCAL_MACHINESOFTWARE下创建名为“ivanluo“的子项。(2)创建或修改值项现在要在 HKEY_LOCAL_MACHINESOFTWAREIvanLuo下新建一个名为“ivan“(如注册表中已有 ivan值项,则为修改)、类型为“REG_DWORD“、值为“111“(16 进制)的值项,则可在记事本中输入以下内容:Windows Registry Editor Version 5.00
23、 HKEY_LOCAL_MACHINESOFTWAREIvanLuo “ivan“=dword:111将以上文档保存为一个 REG文件并双击之,如果此时你的注册表中没有IvanLuo这个子项,那么将会为你创建。修改时也可把需要修改的注册表项导出,用记事本打开并修改,然后将其导入即可。 2.删除(1)删除值项如要将 HKEY_LOCAL_MACHINESOFTWAREIvanLuo下名为“ivan“的值项删除,相应 REG文件的内容为:Windows Registry Editor Version 5.00 HKEY_LOCAL_MACHINESOFTWAREIvanLuo “ivan“=-(2
24、)删除子项或要删除 HKEY_LOCAL_MACHINESOFTWARE下的 IvanLuo子项,REG 文件如下书写:Windows Registry Editor Version 5.00 -HKEY_LOCAL_MACHINESOFTWAREIvanLuo以上便是 REG文件制作的全部内容,很简单吧!如果还有什么不懂的地方,只须将注册表中一项导出为 REG文件,然后用记事本打开,对照注册表编辑器中的相应项看看便明白了。例子:REGEDIT4HKEY_LOCAL_MACHINESOFTWAREMainMenuTop“财务管理“=“Image/index/BIS-index_08.gif;I
25、mage/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
26、;Blacklist.aspx“考试系统“=“Image/index/BIS-index_14.gif;Image/index/BIS-index_14-1.gif;http:/ 2003系统上发布(日志) 在访问注册表的时候提示System.Security.SecurityException: 不允许所请求的注册表访问权解决 System.Security.SecurityException: 不允许所请求的注册表访问权2003 server系统,装了.net2003 和 2005 以及企业库 2005之后,以前的 2003版的程序有的就会报上述错误。在网上搜了很多方法,把匿名访问去掉再勾
27、选或者重新编译企业库等方法都试过都没有解决。尝试了以下两个操作后居然成功了:a) 进入 HKEY_LOCAL_MACHINESystemCurrentControlSetServicesEventlog 目录点击 安全=权限 将来宾用户和 aspnet用户设为完全控制;b)在HKEY_LOCAL_MACHINESystemCurrentControlSetServicesEventlogapplication下建立一个新键 EnterpriseManagerc)重起 iis,测试2.把要访问的注册表的项添加 aspnet用户并且赋给他完全控制权限本文来自 CSDN博客,:http:/ Java
28、类文件打包成.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步,上面是项
29、目名称,可随便填写,下面一个写出你想要将打包后的 exe文件输出的目录:第 4步,由于我的演示程序是图形的,所以选第一个,如果你的程序是控制台的,则选择第二个,Executable name 写你将要生成的 exe文件的名字,Icon File 可以选择生成文件的图标第 5步,首先,单击绿色的“+“号,在弹出的窗口中点 Archive,然后找到起初已经做好的jar文件,“OK“后返回,在下面的 Class Path里就出现 jar文件路径后,再在上面 Main Class栏内点击找到 main所在的类,这一步即算完成:第 6步,你系统的 JRE版本,上面填个 1.3,下面填 1.6:当然,这样
30、配置的程序只能在安装有 JRE的机器上执行,发布时总要考虑的问题就是用户是否有能力在自己机器上安装 JRE,总不能发布一个程序还要用户自己安装个 JRE吧,下面我就介绍如何将 JDK环境变量动态打包到 exe中,在这里单击 advanced options,选择search sequence。如图:首先把 JRE复制到 exe文件输出的目录里,我用的是 c:xaocker,在弹出的窗口中,删除列表中所有项,然后单击绿+,选择 directory并选择 JRE的根目录(注意是拷贝后的目录)即可,如图: 单击 ok后,再从图中单击 advanced options,并选择 preferred VM
31、,在弹出的窗口中选择 client hostspot VM,单击 next按钮继续:第 7、8 步是一些基本配置,默认即可,第 9步编译,第 10步你就可以点这个看到效果了:exe4j未注册的版本会出现下面的对话框:我们提供的是破解版 exe4j下载(内有注册码 可免费使用)点击确定之后就可以看到你程序的运行结果了!java.exe依照一套逻辑来寻找可以用的 JRE,首先查找自己所在的目录下有没有 JRE,其次查找自己的父目录下有没有 JRE;最后才是查询 Windows的注册表。现在我们的程序可以在任意的计算机上执行了,可是缺点是致命的,比方说我的程序才160K,可是不论走到哪里都要背着 7
32、0多 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,仔细清理之后,文件变小了不少,可以发布了