Installshield环境变量的追加与删除

来源:互联网 发布:惠州博罗网络问政 编辑:程序博客网 时间:2024/06/06 20:50

====== 环境变量的追加与删除 ======
====== 环境变量的添加或追加 ======

  * 问题:如何能在安装包中添加环境变量,而不用用户手动在我的电脑/属性/高级/环境变量中设置,特别是,如何能判断已有的环境变量,如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就可以了。


 

原创粉丝点击