Installshield环境变量的追加与删除 .
====== 环境变量的追加与删除 ======
====== 环境变量的添加或追加 ======
* 问题:如何能在安装包中添加环境变量,而不用用户手动在我的电脑/属性/高级/环境变量中设置,特别是,如何能判断已有的环境变量
,如Path,在不改变已有的环境变量的内容的基础上,进行追加呢?
* 解决方案:添加环境变量时,可以通过注册表中相应位置写键值的方式完成:HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control
\Session Manager\Environment.
首先判断Path是否存在,如果不存在,创建,如果存在,已有的内容进行追加。追加的方法参考如下代码:
function AddPath()
NUMBER nResult,nType,nSize,nvSize,nvType;
STRING strResult,szkey,szNumName,szNumValue,nRootKey,szPath,szPath2;
STRING TITLE, szFormat;
begin
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
szkey="SYSTEM\\ControlSet001\\Control\\Session Manager\\Environment";
// has no the key, then create the key
if (RegDBKeyExist(szkey) < 0)then
if (RegDBCreateKeyEx(szkey, "") < 0) then
MessageBox ("RegDBCreateKeyEx failed.", SEVERE);
return FALSE;
endif;
endif;
//添加系统路径
RegDBGetKeyValueEx(szkey,"Path",nvType,szPath,nvSize);
if szPath!="" then
PathSet(szPath);
if (PathAdd(TARGETDIR^"\\scratch\\bin", "", FULL, AFTER) < 0) then
MessageBox ("Unable to add to path buffer.", SEVERE);
abort;
endif;
PathGet(szPath);
Disable(LOGGING);
if (RegDBSetKeyValueEx(szkey,"Path",REGDB_STRING,szPath,-1) < 0) then
MessageBox ("RegDBSetKeyValueEx failed.", SEVERE);
return FALSE;
endif;
Enable(LOGGING);
else
szPath=TARGETDIR^"\\scratch\\bin";
// Set a key name and a value associated with it.
Disable(LOGGING);
if (RegDBSetKeyValueEx(szkey,"Path",REGDB_STRING,szPath,-1) < 0) then
MessageBox ("RegDBSetKeyValueEx failed.", SEVERE);
return FALSE;
endif;
Enable(LOGGING);
endif;
end;
====== 卸载时如何删除追加的环境变量的问题 ======
* 问题:安装包卸载时,如何能不改变已有的环境变量的内容,只是删除追加的环境变量?
* 解决方案:参考如下,特有的关键字删除即可,案参考以下代码片段,即可实现。
function DelPath()
NUMBER nResult,nType,nSize,nvSize,nvType;
STRING strResult,szkey,szNumName,szNumValue,nRootKey,szPath,szPath2;
begin
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
szkey="SYSTEM\\ControlSet001\\Control\\Session Manager\\Environment";
//添加系统路径
RegDBGetKeyValueEx(szkey,"Path",nvType,szPath,nvSize);
if szPath!="" then
PathSet (szPath);
PathDelete ("scratch", PARTIAL);
endif;
end;
====== 追加方式的卸载问题 ======
问题:当卸载的时候,却发生了一件事情,那就是,原来系统已经有的环境变量Path也被自动删除了,这会影响到其他软件的使用。
解决方案:原来,installsheild会记录所做的操作在log信息中,卸载时,会自动进行清理动作。
那么如何才能避免呢?RegDBSetKeyValueEx函数调用之前,可以先Disable(LOGGING);
调用之后,在Enable(LOGGING); 即可解决这个问题。
====== Dos命令无法使用的问题 ======
* 问题:所有的dos命令,如ping 不能使用了。
* 解决方案:在网上查找,只找到问题,没有搜索到解决方案,于是,只能一一查看Help,发现RegDBSetKeyValueEx的第三个参数引来的
问题,需要修改第三个参数为REGDB_STRING_ EXPAND,因为在XP下,path含有一个%SystemRoot%的相对路径,如果使用了REGDB_STRING,所
有的dos命令将都不能使用,此时,在dos下输入path一看,该替换成绝对路径的地方都没有替换掉,IS程序里键值设置时候的类型问题,
REGDB_STRING是不认识相对路径的,换成REGDB_STRING_ EXPAND就可以了。
installshield中如何执行批处理 还有设置环境变量 .
分类: installshield 2010-11-30 17:14 1120人阅读 评论(0) 收藏 举报
stringpathcmdfunction脚本java
如何执行批处理
我们可以在事件中使用方法 来执行 installshield提供了该方法LaunchAppAndWait 来调用应用程序
//执行卸载脚本
function ExecuteUnstall()
string cmdline;
begin
if(AskYesNo("您确定要卸载吗",YES)=NO) then
abort;
endif;
cmdline="cmd /c /""+TARGETDIR+"//tools//uninstall.bat/"";
if (LaunchAppAndWait ("",cmdline, WAIT) < 0) then
MessageBox ("Unable to launch cmd "^cmdline^".",SEVERE);
endif;
end;
设计环境变量 环境变量 可以从注册表中设置
用户变量的位置是 :HKEY_CURRENT_USER/Environment
系统变量的位置是:HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager/Environment
function SetEnvironment()
begin
RegDBSetDefaultRoot (HKEY_CURRENT_USER);
RegDBSetKeyValueEx ("Environment" , "JAVA_HOME" , REGDB_STRING_EXPAND , TARGETDIR+"//Java" , -1);
RegDBSetKeyValueEx ("Environment" , "CATALINA_HOME" , REGDB_STRING_EXPAND ,TARGETDIR+"//tomcat" , -1);
RegDBSetKeyValueEx ("Environment" ,"JRE_HOME" , REGDB_STRING_EXPAND ,TARGETDIR+"//Java//jre1.5.0_18" , -1);
//这个地方nzType千万不要直接用 REGDB_STRING 否则会编译出错 日
//if (RegDBGetKeyValueEx (szKey, "Path", nzType, svOld, nsize) < 0) then
// MessageBox ("RegDBGetKeyValueEx failed.", SEVERE);
// abort;
//endif;
// svNew=svOld+";"+TARGETDIR+"//Java//bin";
//RegDBSetKeyValueEx ("Environment" , "Path" , REGDB_STRING ,svNew , -1);
end;