今天需要給之前打包的一個軟件製作補丁的安裝程序,因爲當時並沒有考慮到這個小軟件會做補丁安裝程序,所以當時並沒有在註冊表中記錄這個軟件的安裝位置,不過幸好在環境變量中記錄了與這個軟件一起使用的數據庫的位置(數據庫與該軟件在同一個目錄下),所以將這個環境變量處理一下就可以得到之前軟件的安裝目錄,具體步驟如下:
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}-- (從註冊表讀取系統的實際安裝路徑)就可以了。