2017-01-16 123 views
2

我想用Inno Setup創建一個安裝程序,這是我第一次使用此工具。
我想要做的是用更詳細的自制安裝程序(即Setup.exe中的Setup.exe)封裝現有軟件的現有安裝程序。在Inno Setup安裝結束時編寫32/64位特定註冊表鍵

在研究到目前爲止,我的作品是要求安裝程序(Inno Setup * .exe)運行附帶的安裝程序(實際的軟件設置)。
爲什麼我需要另一個安裝程序?因爲我想給它一些額外的功能。

特別是:我想在安裝結束時添加一個註冊表鍵,作爲適合相關位系統(32/64位)的最後一步。這裏是我要求專家幫助的地方。 (主要關注)

我的詳細問題如下:

  1. 我設法使用創新安裝的[Registry]部分增加的關鍵。然而,[Registry]似乎總是在[Run]之前運行 - 但我需要在安裝後添加的密鑰(添加到安裝本身創建的註冊表路徑中),而不是之前,所以我刪除了[Registry]之前已經工作的(只是順序錯誤) 。爲了在主安裝後完成reg-add,我找到了兩個程序AfterInstallCurStepChanged/ssPostInstallDeinitializeSetup,這似乎不適合我的關注(但想到AfterInstall將是我正在尋找的? ),因爲沒有更多的應該來之後,我認爲它不會運行,如果安裝之前已經失敗(?!)
  2. 我不知道用於添加註冊表鍵(字符串)的Pascal語法,我可以在[Registry]之下添加它,但是當涉及到[Code]部分時,即使我現在對Inno Setup給出了許多功能等方面的研究,我也感覺有點遺憾。
  3. 第三個問題是,註冊表中的路徑會有所不同,具體取決於它是32位還是64位位系統。所以實際上在添加一個或另一個路徑/關鍵字之前(這是因爲程序本身的安裝根據位版本創建了路徑)之前實際上需要額外的查詢來檢查位系統,所以我發現函數IsWin64(布爾值) ,現在試圖將一個函數(位版本查詢)與一個過程(AfterInstall)混合起來,即使對我而言,初學者也是錯誤的。另外我試着創建一個if-else-query,編譯器告訴我我做錯了。 if IsWin64 then...的作品,但添加一個沒有。

所以理論上解決將大致是這樣的......

procedure MyAfterInstall(); 
    function IsWin64: Boolean; 
     if 64-bit Reg-Add HKLM\SOFTWARE\Wow6432Node\A 
     else Reg-Add HKLM\SOFTWARE\B 

對不起,我沒有給你提供更多。我通常不會編碼。

如果相關,這就是我在我的代碼段至今:

[Code] 
procedure DeinitializeSetup(); 
begin 
    RegWriteStringValue(
    HKEY_LOCAL_MACHINE, 'SOFTWARE\Wow6432Node\A', 'ConnectionString ', 'Data Source=Test;'); 
end; 

我之所以用DeinitializeSetup是因爲它是一兩件事,爲我工作,到目前爲止,但是我知道這個功能是即使用戶在安裝任何東西之前退出設置,這也不是很好。我在安裝後運行它,因爲軟件安裝本身創建了我想要添加密鑰的路徑,在軟件安裝失敗時擁有密鑰是沒有意義的......也許還有更好的方法。
很多道歉,並提前感謝任何幫助。

+0

是不是真的'HKLM \ SOFTWARE \ Wow6432Node \ A' VS'REG-添加HKLM \ SOFTWARE \ B'或者說'註冊 - 添加HKLM \ SOFTWARE \ A'?即是唯一的區別'Wow6432Node'還是實際的關鍵路徑結尾也不同? –

+0

@MartinPrikryl你說得對,「Wow6432Node」是唯一的區別。其餘的都是一樣的,即使我想添加的數據記錄對於32位和64位版本都是一樣的。 – Yauhun

回答

2

要在安裝完成後執行代碼,請使用CurStepChanged event function並檢查CurStep = ssPostInstall

由於Inno Setup是32位應用程序,默認情況下它會自動gets redirected to the Wow6432Node on 64-bit systems。沒有必要明確地做到這一點。因此,如果Wow6432Node是32位和64位的路徑之間的唯一區別,你沒有做什麼特別的:

procedure CurStepChanged(CurStep: TSetupStep); 
begin 
    if CurStep = ssPostInstall then 
    begin 
    Log('Installation finished, writing connection string'); 
    RegWriteStringValue(
     HKEY_LOCAL_MACHINE, 'SOFTWARE\A', 'ConnectionString', 'Data Source=Test;'); 
    end; 
end; 

當然,除非你使用64-bit installation mode。又見:Writing 32/64-bit specific registry key in Inno Setup


如果關鍵路徑確實不同,使用IsWin64 function

procedure CurStepChanged(CurStep: TSetupStep); 
begin 
    if CurStep = ssPostInstall then 
    begin 
    if IsWin64 then 
    begin 
     Log('Installation finished, writing 64-bit connection string'); 
     RegWriteStringValue(
     HKEY_LOCAL_MACHINE, 'SOFTWARE\A', 'ConnectionString', 'Data Source=Test;'); 
    end 
     else 
    begin 
     Log('Installation finished, writing 32-bit connection string'); 
     RegWriteStringValue(
     HKEY_LOCAL_MACHINE, 'SOFTWARE\B', 'ConnectionString', 'Data Source=Test;'); 
    end; 
    end; 
end; 
+0

天啊,它終於奏效了。不能相信我花了多少時間...非常感謝。 (也感謝上面的編輯/修復,我傾向於說太多。)嗯,我在兩個位版本之間做了這個區別,因爲主要安裝在創建註冊表路徑和數據記錄時做了,並且我只想添加還有一個字符串。也許我在這裏缺乏基本的理解。 – Yauhun