通過註冊表檢測是否安裝了VC++ 2008 SP1 redistributable。

在發佈 vs2008 程序時,往往會發現程序在某些電腦上無法運行。原因是目標電腦上沒有相關的VC運行庫。

最簡單的方法,就是到微軟的官網上下載並安裝最新的 Visual C++ 2008 SP1 redistributable package,對於32位的應用程序,也就是下載 vcredist_x86.exe。

對於程序的發佈者,我們最好在程序的安裝程序中打包上 vcredist_x86.exe。於是對於安裝程序來說就會有檢測是否已經安裝了 Visual C++ 2008 SP1 redistributable package(86) 這個問題。這裏介紹通過註冊表檢測的方法:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{86CE1746-9EFF-3C9C-8755-81EA8903AC34}

如果此項(Key)存在,則已安裝。

另外, Visual C++ 2008 SP1 redistributable package(86) 安裝後,還會生成以下項(Key)

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DevDiv\VC\Servicing\9.0\RED\2052

檢查此項(Key)的 SPName 值是否是“SP1”,是,則安裝。


我認爲在實際操作中,選擇其中一個註冊表項檢查即可。


這裏要說明幾點:

1. {86CE1746-9EFF-3C9C-8755-81EA8903AC34} 是 vcredist_x86.exe 的GUID號。因此不同發佈版本的GUID號,也不相同。要想通過註冊表檢測是否安裝vcredist_x86.exe,就必須先知道其準確的GUID號。


2. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DevDiv\VC\Servicing\9.0\RED\2052中的2052項,雖然不知道是什麼意思,但是同GUID號一樣,不同版本的 vcredist_x86.exe,此項的值也不相同。


3. 對於 Win7 和 Win8 64位電腦來說,要注意操作系統的註冊表分爲32位註冊表和64位註冊表。通過 regedit 查看到的路徑都是64位的註冊表項,而32位的註冊表被重定義到:HKEY_LOCAL_MACHINE\Software\WOW6432Node 路徑下。因此對於64位的電腦,想要通過 regedit 來查看註冊表的變化,則尋找的註冊表項分別是:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{843e5a96-1ee3-4275-a965-14feac1cc02e}

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\DevDiv\VC\Servicing\9.0\RED\2052


4. Windows 應用程序在操作註冊表的時候會自動區分 32bit 方式和 64bit 方式。運行於 64bit 系統下的 32bit 應用程序默認操作32位註冊表項(即被重定向到WOW6432Node下的子項);而 64bit 應用程序纔是操作的直觀註冊路徑。因此,在32位環境中編寫的程序在操作註冊表時不需要考慮在64位環境運行時找不到註冊表項。儘管你在代碼中寫的是HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DevDiv\VC\Servicing\9.0\RED\2052,當運行在64位系統中時,會自動重定向到 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\DevDiv\VC\Servicing\9.0\RED\2052 中去。


5. 以上關於在64位操作系統的註冊表中尋找32位註冊表項的敘述,只針對HKEY_LOCAL_MACHINE 主鍵,不適用於HKEY_CURRENT_USER 主鍵。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


上文提到了將vcredist_x86.exe 集成到安裝程序中,下面是用 Inno setup 編寫安裝程序,檢測 vcredist_x86.exe 是否已經安裝及集成 vcredist_x86.exe 的代碼。

[Run]
Filename: {app}\Vc\vcredist_x86.exe; Parameters: "/q"; Description: "Install VC2008 SP1 Redistributable Package (x86)"; StatusMsg: "Installing VCRedist..."; Check:  IsNeedInstallVC9SP1



[Code]
var 
    Is_Need_Install_VC9SP1 : Boolean;

function IsNeedInstallVC9SP1():Boolean;
begin
  Result:=Is_Need_Install_VC9SP1;
end;

function InitializeSetup():Boolean;
var VC2008Version: Cardinal;
begin
  Is_Need_Install_VC9SP1:= false;
  if RegQueryDWordValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{86CE1746-9EFF-3C9C-8755-81EA8903AC34}', 'Version', VC2008Version) = false then begin
    Is_Need_Install_VC9SP1 := true;
  end;

  Result:=true;
 end;


在 run section 裏面加入了 Parameters: "/q"; 使 vcredist_x86.exe 以靜默方式安裝。但是在程序安裝結束後會提示用戶重啓電腦。
這個應該是 vcredist_x86.exe 運行後導致的。




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