我知道installshield的函数里面,肯定有东西可以设置,肯定可以搞删除的时候不删除某一个注册表项的,嗯,我翻了一个早上,我翻不到,我做不出来
所以呢,我就想了这样的办法:我用原来的办法生成一个注册表项,在每一次安装程序运行的时候,我就先检索这个注册表项,如果有值,我把这个值记在全局变量里面,如果没有值,我给全局变量写上初始的默认值
我测试的时候,我要在注册表里生成一个,项“SOFTWARE\\NNLLTest\\nnll”看我的三步:
1、加全局变量,这个全局变量用来记录不可以删除的注册表项的值
#i nclude "ifx.h"
//NNLL添加全局变量
string szNNLLValue; //nnll注册项
2、加上OnBegin函数,每次安装程序运行的时候,都先检索“SOFTWARE\\NNLLTest\\nnll”的值
function OnBegin()
string szKey,szName;
number nSize,nType,nRootKey;
begin
//一开始的时候先取出nnll注册项的值,防止卸载后重新安装时把注册项的值覆盖了
//置根为nRootKey
nRootKey = HKEY_LOCAL_MACHINE;
RegDBSetDefaultRoot (nRootKey);
//取值
szKey="SOFTWARE\\NNLLTest\\nnll\\";
if RegDBKeyExist(szKey) > 0 then
nSize=-1;
nType=REGDB_STRING;
szName="nnll";
//存在这个项,取这个项的值
RegDBGetKeyValueEx (szKey, szName, nType, szNNLLValue, nSize);
else
szNNLLValue="0"; //如果没有这个注册项,设置初始的默认值
endif;
end;
3、在安装和反安装的时候,写注册表,因为我这里安装时注册的项是会给is自己卸载的,所以我在反安装完,要自己重新把项写上
//声明函数
prototype NnllReg();
prototype NNLLResetReg();
//调用
function OnEnd()
begin
if !MAINTENANCE then //非维护性代码,即只在安装时执行
//修改注册表
NnllReg();
else
//重新注册nnll项
NNLLResetReg();
endif;
end;
这里有两个自定义函数,NnllReg()用来在安装的时候注册注册表项,NNLLResetReg()用来在反安装的时候,重新把不可以删除的项写回注册表
function NnllReg()
number nRootKey,nType,nSize;
string szKey,szNumName,szNumValue,szClass;
begin
//修改注册表
nRootKey = HKEY_LOCAL_MACHINE;
RegDBSetDefaultRoot (nRootKey); //置根为nRootKey
//注册子项
szKey="SOFTWARE\\NNLLTest\\";
if RegDBKeyExist(szKey) < 0 then
//不存在“SOFTWARE\\NNLLTest\\nnll”,创建这个项
RegDBCreateKeyEx(szKey,"");
endif;
//初始化每个键的公共值
nType=REGDB_STRING;
nSize=-1;
//设置不可以反安装的项
szNumName="nnll";
RegDBSetKeyValueEx(szKey,szNumName,nType,szNNLLValue,nSize);
end;
function NNLLResetReg()
number nRootKey,nType,nSize;
string szKey,szName,svValue;
begin
//修改注册表
nRootKey = HKEY_LOCAL_MACHINE;
RegDBSetDefaultRoot (nRootKey); //置根为nRootKey
//注册子项
szKey="SOFTWARE\\NNLLTest\\";
nSize=-1;
nType=REGDB_STRING;
szName="nnll";
//重写注册项
RegDBSetKeyValueEx(szKey,szName,nType,szNNLLValue,nSize);
end;
完了啦,我的办法就是在反安装完的时候,把不可以删除的注册表的项,重新写回注册表里面
嗯,我不会用注册表函数写这个功能啊,所以我就这样搞了,你们不准笑的