利用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}-- (從註冊表讀取系統的實際安裝路徑)就可以了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章