Installshield环境变量的追加与删除设置

时间:2022-12-12 19:20:28


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;