利用Inno Setup制作补丁安装程序

       今天需要给之前打包的一个软件制作补丁的安装程序,因为当时并没有考虑到这个小软件会做补丁安装程序,所以当时并没有在注册表中记录这个软件的安装位置,不过幸好在环境变量中记录了与这个软件一起使用的数据库的位置(数据库与该软件在同一个目录下),所以将这个环境变量处理一下就可以得到之前软件的安装目录,具体步骤如下:

       1. 首先在INNO Setup[Setup]中添加DisableDirPage=yes,此处设定是不允许用户在安装补丁时擅自修改安装目录。

       2. 将[Setup]DefaultDirName={pf}\{#MyAppName}改为DefaultDirName={code:GetPath},将安装目录由用户指定改为系统自动设定。

       3. 在[Code]中添加代码如下:

//字符串拆分
procedure SeparateTerms(s: string; Separator: char; Terms: TStringList);  
 var  
   hs : string;  
   p : integer;  
 begin 
   Terms.Clear; // First remove all remaining terms  
   if Length(s)=0 then // Nothin'' to separate  
     Exit;  
   p:=Pos(Separator,s);  

   while P<>0 do  
   begin 
     hs:=Copy(s,1,p-1); // Copy term  
     Terms.Add(hs); // Add to list  
     Delete(s,1,p); // Remove term and separator  
     p:=Pos(Separator,s); // Search next separator  
   end;  

   if Length(s)>0 then 
     Terms.Add(s); // Add remaining term  
 end;  

//获取系统安装路径
function GetPath(Param: String): String;
  var
    strPath: String;
    Terms: TStringList;       
     x,i : integer;       
begin
   //取到想要的环境变量值
    RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 'Path', strPath); 
   strPath := Trim(strPath);

   //拆分Path
   Terms:=TStringList.Create;   
   SeparateTerms(strPath,';',Terms);
   for i:=0 to Terms.Count-1 do  
     begin
        x := pos('/dbmaster;',Terms.Strings[i]);
        if x>0 then
          begin
             strPath := Terms.Strings[i];
             Delete(strPath,x,10);
          end;
     end;
   Terms.Free;          
   Result := strPath;
end;

       如果之前有在注册表中记录系统的安装路径,就要简单的多,只需要[Setup]中添加DisableDirPage=yes,并将DefaultDirName={pf}\{#MyAppName}改为DefaultDirName={reg:HKLM/SOFTWARE/LACJXT,InstallLocation}-- (从注册表读取系统的实际安装路径)就可以了

你可能感兴趣的:(软件开发)