您所在的位置: 程序员家园 -> 家园博客 ->
 
在哪里摔倒
就在哪里自己爬起来

用户登录

查  找

最新评论

最新留言

常用网站

网易邮箱 GMAIL  

百度搜索 MSDN

霏凡软件 BT精品

影视帝国 射 手 网

电驴下载 全 库 网

友情连接

茄菲的窝 冰冰博客

枫叶飘零 玫  瑰

ACEN 云 豹 子

统  计



在installshield里,变着样子生成一个不可以删除的注册表项 
狼子 发表于 2006-11-7 16:35:00 阅读全文 | 回复(0) | 引用通告 | 编辑  installshield查看本站使用过本标签的日志查看本站使用过本标签的用户

我知道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;

完了啦,我的办法就是在反安装完的时候,把不可以删除的注册表的项,重新写回注册表里面

嗯,我不会用注册表函数写这个功能啊,所以我就这样搞了,你们不准笑的

发表评论:

    昵称:
    密码:
    主页:
    标题:
Powered by Oblog.