我知道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;
完了啦,我的办法就是在反安装完的时候,把不可以删除的注册表的项,重新写回注册表里面
嗯,我不会用注册表函数写这个功能啊,所以我就这样搞了,你们不准笑的