2009-04-08 158 views
20

我有一個和this one非常相似的問題,但答案不適用於我。如何檢測我是否需要安裝VCRedist?

軟件我維護的設置取決於VC++ 2008(SP1,正好),因此我需要找到一個解決方案來安裝VCRedist,如果還沒有安裝。 我知道正確的方法是用合併模塊構建msi,但它不在我的手中。

我所指的重複問題(接受的問題)的答案對我來說不起作用,因爲每個微小的版本(例如9.0.30729.01 vs 9.0.30729.17)都有適當的GUID,我無法猜到或預測未來的版本。此外,我認爲這不會檢測到Visual Studios,因此在VCRedist Package已經在開發者機器上時不必要地安裝VCRedist Package。我不想用這個漏洞攻擊任何人,當然不是已經安裝了DevStudio的人。

現在又有一個答案說我應該在WinSxs文件夾中看起來像$WINDIR\WinSxS\x86_Microsoft.VC80.CRT_,但是這還沒有幫助我暗示SP1,或者在這一點上我有什麼缺失?有沒有一個表的內部和「外部」版本號,所以我可以暗示某個小版本號?

我不相信有微軟爲這種情況提供了什麼,但尋找已經太久了,現在的interwebs讓我回到了良好醇」 SO :)

回答

8

你可以採取推薦的方式安裝directx:始終運行可再發行組件。由於它是必需的,而且您已經在運送它,所以即使它已經安裝,運行它也沒有什麼壞處。

+0

現在接受了。這就是我現在正在做的。另一個導致在W2K8上出現問題(在兩種檢測情況中的一種)。 – lImbus 2009-11-11 19:56:27

+4

如果您這樣做,一定要接受並忽略錯誤代碼5100(「已安裝更新的版本」)。我們最近在PostgreSQL安裝程序中遇到了一些麻煩。 – 2012-06-09 03:33:47

+6

總是運行redist需要很多時間。 – sorin 2013-07-17 22:42:31

6

看起來像是有一個由微軟開發人員提出的another solution,使用MsiQueryProductState API,唉同時也依賴於GUID。

更新:代碼昨天生效,似乎工作正常。以下是所做的工作:檢查最新的已知GUID和路徑²到它應該安裝的位置。如果兩者均失敗,則安裝。這似乎工作正常。

此外,它安裝了命令行參數「/ qb」,意思是「無人看管但不可見」。有關這些參數,請參閱this other blog post

FWIW,GUID的對Microsoft Visual C++ 2008/VC90 SP1可再發行 - 86 9.0.30729

  • 64位30729.17:8220EEFE-38CD-377E-8595-13398D740ACE
  • 32位30729.17:9A25302D-30C0-39D9 -BD6F-21E6EC160475
  • 32位30729.01:6AFCA4E1-9B78-3640-8F72-A7BF33448200

²路徑: $WINDIR\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729*

13

對於Visual Studio C++ 2010,things got a bit easier

與Visual C++ 2005和2008可再發行組件包不同,有些註冊表項可用於檢測Visual C++ 2010可再發行組件包的存在。

的Visual C++ 2010再發行的包檢測註冊表值

的Visual C++ 2010再發行包(x86)

[HKEY_LOCAL_MACHINE \ SOFTWARE \微軟\ VisualStudio的\ 10.0 \ VC \ VCRedist \ 86] 安裝= 1( REG_DWORD)

的Visual C++ 2010再分發程序包(64)

[HKEY_LOCAL_MACHINE \ SOFTWARE \微軟\ VisualStudio的\ 10.0 \ VC \ VCRedist \ 64] 安裝= 1(REG_DWORD)

的Visual C++ 2010再分發程序包(IA64)

[HKEY_LOCAL_MACHINE \ SOFTWARE \微軟\ VisualStudio的\ 10.0 \ VC \ VCRedist \ IA64] 安裝= 1(REG_DWORD)

注意:您將需要在64位操作系統上檢查Wow6432Node。 (HKLM \ SOFTWARE \ Wow6432Node \微軟....)

如果你喜歡舊版本,這裏的GUID

的Visual C++ 2010可再發行組件包的產品代碼

  • 的Visual C++ 2010再發行組件包(86) - {196BB40D-1578-3D01-B289-BEFC77A11A1E}
  • 的Visual C++ 2010再分發程序包(64) - {DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}
  • 的Visual C++ 2010再分發程序包(IA64) - {C1A35166-4301-38E9-BA67-02823AD 72A1B}

的Visual C++ 2010 SP1發行包的產品代碼

  • 的Visual C++ 2010 SP1可再發行包(x86) - {F0C3E5D1-1ADE-321E-8167-68EF0DE699A5}
  • 的Visual C++ 2010 SP1再分發程序包(64) - {1D8E6291-B0D5-35EC-8441-6616F567A0F7}
  • 的Visual C++ 2010 SP1再分發程序包(IA64) - {88C73C1C-2DE5-3B01-AFB8-B46EF4AB41CD}
3

我專門開放源碼a Visual C++ project on Github that checks for VC++ redistributable DLLs,並使其在Apache 2.0許可下可用。

它具有用於檢查VC++ 9和VC++ 10個運行時的可用性三種不同的方法:

  1. 檢查MsiQueryProductState的API;
  2. 檢查WinSxS文件夾的內容是否匹配產品目錄;和
  3. 檢查任何本地版本的VC++ 9和VC++ 10運行時的當前工作目錄(並檢查其內容。)

下面是使用的樣品,它實際上是這樣的:

wcout << _T("Checking for the availability of VC++ runtimes..") << endl; 
wcout << _T("----------- Visual C++ 2008 (VC++9) -----------") << endl; 
wcout << _T("Visual C++ 2008 (x86) ? ") << (IsVC2008Installed_x86() ? _T("true") : _T("false")) << endl; 
wcout << _T("Visual C++ 2008 (x64) ? ") << (IsVC2008Installed_x64() ? _T("true") : _T("false")) << endl; 
wcout << _T("Visual C++ 2008 SP1 (x86) ? ") << (IsVC2008SP1Installed_x86() ? _T("true") : _T("false")) << endl; 
wcout << _T("Visual C++ 2008 SP1 (x64) ? ") << (IsVC2008SP1Installed_x64() ? _T("true") : _T("false")) << endl; 

我許可的crt-detector項目的Apache 2.0下,可以隨意在自己的應用程序來使用它。