Share 发表于 2017-6-15 23:59:05

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

本帖最后由 Share 于 2017-6-16 00:00 编辑

       今天需要给之前打包的一个软件制作补丁的安装程序,因为当时并没有考虑到这个小软件会做补丁安装程序,所以当时并没有在注册表中记录这个软件的安装位置,不过幸好在环境变量中记录了与这个软件一起使用的数据库的位置(数据库与该软件在同一个目录下),所以将这个环境变量处理一下就可以得到之前软件的安装目录,具体步骤如下:
       1. 首先在INNO Setup的中添加DisableDirPage=yes,此处设定是不允许用户在安装补丁时擅自修改安装目录。
       2. 将中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);
      if x>0 then
          begin
             strPath := Terms.Strings;
             Delete(strPath,x,10);
          end;
   end;
   Terms.Free;            
   Result := strPath;
end;

       如果之前有在注册表中记录系统的安装路径,就要简单的多,只需要中添加DisableDirPage=yes,并将DefaultDirName={pf}\{#MyAppName}改为DefaultDirName={reg:HKLM/SOFTWARE/LACJXT,InstallLocation}-- (从注册表读取系统的实际安装路径)就可以了。
页: [1]
查看完整版本: 利用 Inno Setup 制作补丁安装程序