2014-12-01 51 views
3

我試圖使用{REG}常數DefaultDirName它引用包含大括號的路徑包含括號註冊表項:Inno Setup的參考使用{REG}不斷

DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{3E4A76D9-EC0E-4806-915C-8BC2B3C0011B},InstallLocation} 

然而,這並不因爲編譯器認爲路徑中的GUID是一個常量。如果我嘗試使用另一個大括號(如下所示)將大括號轉義出來,這也不起作用,並給出'無效的註冊表常量'錯誤。

DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{3E4A76D9-EC0E-4806-915C-8BC2B3C0011B},InstallLocation} 

我已經嘗試了所有組合我能想到的,試圖逃避這一點,並讓編譯器認識到這一點,包括使用%7D,試圖迫使一個右括號,如文檔中建議爲好,但在這種情況下,這看起來似乎並沒有被編譯成右大括號。希望有人可以建議如何讓編譯器識別這個註冊表位置,或者至少告訴我我是否試圖做一些不可能的事情。如果是這樣,是否有另一種方法來嘗試呢?鑑於我也已經嘗試過:

DefaultDirName={code:GetExistingInstallPath} 
    [Code] 
    function GetExistingInstallPath(Param: String): String; 
    begin 
    RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{F34A6950-7E0E-4F92-8B0E-C552F4989DA}', 
'InstallLocation', strExistingInstallPath); 
    Result := strExistingInstallPath; 
    end; 

這確實編譯,但strExistingInstallPath返回任何內容並懸停在{代碼:GetExistingInstallPath}返回「異常:無法計算‘代碼’不變的,因爲可能的副作用。 「經過幾個小時試圖讓這個工作,我接近得出結論,Inno Setup不支持包含大括號的註冊表位置。

請注意,我需要閱讀此註冊表項,因爲該軟件未由Inno Setup安裝,並且這是一個替換文件的補丁程序,所以我需要知道它最初安裝的位置。

回答

3

在使用{reg:...}不要關}你必須使用的情況下%7d

例子:

DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ 
{{‌​3E4A76D9-EC0E-4806-915C-8BC2B3C0011B%7d,InstallLocation} 

[Code]部讀取註冊表全部,如果沒有ExpandConstant使用,你不必使用雙開{{

例如:

RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ 
{3E4A76D9-EC0E-4806-915C-8BC2B3C0011B}','InstallLocation', strExistingInstallPath); 

P.S.謝謝@Tlama指出我的不精確性。

+0

我已經試過了,但我期待的結果是在運行調試器時顯示%7d替代爲大括號。當我用這種語法運行它時它確實編譯了,但沒有顯示任何結果。現在已經檢查了第50次所有內容,感謝您的建議,我剛剛注意到GUID中有一個不正確的字符(轉置錯誤),事後看來,顯然是我沒有得到任何結果的原因!在這種情況下,我顯然無法看到樹木上的木材,只關注語法!非常感謝! – 2014-12-01 20:58:38

+1

@Robert,你將不會看到這些字符在調試器中未被轉義,因爲它們是[內部擴展](https://github.com/jrsoftware/issrc/blob/is-5_5_5/Projects/Main.pas #L782)。 – TLama 2014-12-01 21:17:19