没有合适的资源?快使用搜索试试~ 我知道了~
一个完整的安装程序实例之补遗_20081022_—艾泽拉斯之海洋女神出品
4星 · 超过85%的资源 需积分: 9 56 下载量 126 浏览量
2008-10-28
17:16:00
上传
评论
收藏 96KB PDF 举报
温馨提示
试读
2页
这篇补遗是《一个完整的安装程序实例—艾泽拉斯之海洋女神出品》的追加叙述,是在这个安装程序安装后发现应用程序运行时的一些小问题,通过安装程序中传递参数和设置环境变量来解决掉问题的,与安装程序本身无关。 这个版本是pdf版本的。
资源推荐
资源详情
资源评论
1 of 2
第四部分:补遗
转载时请务必保留转载出处和由艾泽拉斯之海洋女神出品的字样;如需刊登,请与作者联系。little_fairycat@126.com.
这篇补遗是《一个完整的安装程序实例—艾泽拉斯之海洋女神出品》的追加叙述,是在这个安装程序安装后发现应用程序运行时的一些小问题,
通过安装程序中传递参数和设置环境变量来解决掉问题的,与安装程序本身无关。
这个程序做完之后,工程进入最后的调试阶段;里面发现了两个问题,其实和安装程序本身没有关系,但是都可以通过安装程序来解决,记录在
此,以备以后碰到此类问题时可以查阅。
1. JAVA_HOME 的问题
之前在第二部分的第九小节里提到了安装完毕后,为 JDK 设置一个环境变量,事实上这个文档写到这里的时候有一点搞错了先后顺序,因为需要
这个环境变量的是第二部分第八小节里安装完毕后需要启动的那个程序,所以后来调试时候发现了,就把第八节的程序内容和第九节的程序内容
调换了一下顺序。
但是,很快发现了新问题,在注册表里添加环境变量和在桌面上“我的电脑”里直接添加环境变量是不一样的;注册表里的操作,都需要通过重
启动计算机来使之生效,所以矛盾出现了:当这个程序启动的时候,环境变量还没有生效;而如果设置了让计算机重启动,就必须让客户手动启
动这个程序,这是非常不友好的操作。
所以这里修改了一下方法,首先把需要启动的程序,也就是一个批处理文件,里面的
set JAVA_HOME=%JAVA_HOME%
这句话改成了
set JAVA_HOME=%1
在批处理里面,需要从外部接收参数的时候,可以把参数写成%1,%2…%n。
然后,在第八小节的程序基础上修改,把
if (LaunchApp (serviceTarget, "") < 0) then
这句话修改成
if (LaunchApp (serviceTarget, javahome) < 0) then
即可。
2. 代码解释
这里 javahome 就是第九小节里 if(RegDBSetKeyValueEx(szKey, "JAVA_HOME", REGDB_STRING, svValue, -1)<0) then 这句话里的 svValue,即 JDK
的安装路径。
LaunchApp (serviceTarget, javahome)
不能不佩服 IS 函数设计者,在这篇文档里,三个地方用到了 LaunchApp 这个函数,而且每个用法都不同。
参数一:这里写我们要打开的文件,带相对路径的
参数二:cmd_line,这里,我们写入了 JDK 的路径,这个值将作为参数传递给我们要打开的批处理文件,批处理接收到 JDK 路径后,便可以
正确启动了。
3. Path 的问题
这个问题其实和 JavaSerive 以及操作系统相关;因为在笔者的计算机上一直没有发现这个问题。
在第二部分的第八小节中提到,我们会向 Windows 安装一个服务,但是笔者在工程用的计算机上始终不能启动这个服务,这次这个调试任务
推给了经理,他经过多次试验,发现是环境变量中 Path 的问题,只要在 Path 里添加上 JRE 的 Bin 文件路径,这个服务就可以正确启动了。
因为没有深入了解 JavaSerive 的运行机制和 Windows 服务的运行机制,也没有深究为什么了,猜想可能是这个服务需要找这个路径,而有的
操作系统只要指定了 JAVA_HOME 就可以寻找 JRE
了,而有的却不行。
闲话休叙,我们需要写一段程序来实现这个功能。
要注意的地方有以下几点:
z Path 往往已存在,并且里面有内容,因此不可以像设置 JAVA_HOME 一样,而要考虑往已有内容中添加 JRE 路径,并且要考虑内容之间
的分号问题
z 要考虑到卸载状态时,不能把 Path 卸载。说到这个问题,要提一下前面的第九小节,发现引文作者关于卸载时是否卸载自己添加的注册
表键值的理解还是不正确的,Help 里关于 RegDBSetKeyValueEx 有这样一句话 However, the newly created key is not logged for uninstallation
unless it is a subkey of a key already logged for uninstallation.也就是新创建的键值不会被日志记录了要反卸载掉,除非它有子键值被日志记
录了要卸载
程序内容仍然添加在 OnEnd()里,写在最后,如下:
szKey = "SOFTWARE\JavaSoft\Java Runtime Environment\1.6.0_04";//jre 的键
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);//设置一下根键
if (RegDBKeyExist(szKey)=1) then//如果这个键存在
if(RegDBGetKeyValueEx(szKey,"JavaHome",nvType,svValue,nvSize)=0) then //查找这个键的值
javaPath= svValue;
endif;
endif;
**************************************以上为第一部分,以下为第二部分
//wirte the environment variable PATH
szKey = "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; //环境变量在注册表中所在位置
javaPath=javaPath+"\bin";//jrein 的路径
if(RegDBGetKeyValueEx(szKey,"Path",nvType,svValue,nvSize)=0)then//如果 Path 存在
if(svValue!="") then
if(StrFind ( svValue, javaPath )<0) then//如果 path 还没有 jrein 的路径信息
svValue=svValue+";"+javaPath; //添加路径信息,此时要带上分号
endif;
else
资源评论
- fj_better2012-07-10非常好的入门教程,收益匪浅!
little_fairycat
- 粉丝: 18
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功