2017-08-03 254 views
1

想知道是否有某種我不知道的方式,Inno Setup會重定向配置單元常量。更具體地說,在寫入註冊表之前,調用此功能的能力爲:RegOverridePredefKeyInno Setup:註冊表配置單元的重新映射

爲了提供一些背景知識,在我的情況下,這將是強制自注冊DLL爲當前用戶(可能不具有管理員憑據)而不是全局註冊的首選方式。 (換句話說,請寫信給HKEY_CURRENT_USER\Software\Classes而不是HKCR。)還沒有找到任何其他的Inno Setup結構來幫助解決這個問題,並且我會避免使用3rd party tools,如果可能的話,這也需要更新。

+0

你知道的方式? –

+1

我不確定你的問題實際上是什麼。您是否問Inno Setup是否有內部調用'RegOverridePredefKey'的內置API(指令,標誌或任何其他內容),以便您不必以編程方式自己調用它? –

+0

@MartinPrikryl好問題!錯誤的措辭也許:我不知道任何。我檢查了'regserver'標誌,想知道它是否可以與某種參數/另一個標誌配對,這對我有幫助。我認爲我閱讀了文檔中的所有相關部分,但希望我錯過了一些內容。 –

回答

0

不,Inno Setup不支持此操作。

但是從Pascal腳本中調用它並不難。

雖然請注意,您不能使用RegOverridePredefKeyHKEY_LOCAL_MACHINE重定向到HKEY_CURRENT_USER。您只能將其重定向到一個子項:

hNewHKey:...一個開放註冊表項的句柄。該句柄由RegCreateKeyExRegOpenKeyEx函數返回。 它不能是預定義的鍵之一。

所以註冊DLL後,你將不得不子項複製到HKEY_CURRENT_USER,並刪除它(爲RegOverridePredefKey文檔建議)。

重定向到一個臨時的子項Basic代碼:

[Files] 
Source: "MyDllServer.dll"; Flags: ignoreversion dontcopy 

[Code] 

const 
    KEY_WRITE = $20006; 

function RegOverridePredefKey(Key: Integer; NewKey: Integer): Integer; 
    external '[email protected] stdcall'; 

function RegCreateKeyEx(
    Key: Integer; SubKey: string; Reserved: Cardinal; Cls: Cardinal; 
    Options: Cardinal; Desired: Cardinal; SecurityAttributes: Cardinal; 
    var KeyResult: Integer; var Disposition: Cardinal): Integer; 
    external '[email protected] stdcall'; 

function MyDllRegisterServer: Integer; 
    external '[email protected]:MyDllServer.dll stdcall delayload'; 

{ ... } 
begin 
    { Create a subkey to redirect the HKLM to } 
    RegCreateKeyEx(HKEY_CURRENT_USER, 'MyProgTemp', 0, 0, 0, KEY_WRITE, 0, NewKey, Unused); 
    { Redirect HKLM to the created subkey } 
    RegOverridePredefKey(HKEY_LOCAL_MACHINE, NewKey); 
    { Call DllRegisterServer of the .dll } 
    MyDllRegisterServer; 
    { Now you can copy the subkey to HKCU } 
end; 

添加一些錯誤處理!

該代碼適用於Unicode版本的Inno Setup。


對於複製的一部分,你可以從Specify the registry uninstall key location/hive via [Code]重用(提高)我的代碼。

+0

謝謝,包括突出顯示的觀察。我設法錯過了那個。 –