再配布可能なVC ++ 2008を検出する方法は?
-
03-07-2019 - |
質問
スタンドアロンまたはVisual Studio 2008の一部として、Visual C ++再頒布可能パッケージがインストールされているかどうかを判断するために検索できるレジストリ設定はありますか? VC ++ 2008再頒布可能インストーラーを起動して検出を処理できることはわかっていますが、再頒布可能ファイルが既にシステム上にある場合は、それを確認できればインストーラーの起動を煩わせずにすっきりと見えるでしょう。
検索する設定がない場合、これはソフトウェアの新しいバージョン用に用意されている予備のインストーラーのためだけであるため、大したことではありません。作業中の新しいWindowsインストーラーベースのインストーラーには必要ありません。古いインストーラーに置き換わり、マージモジュールを使用します。
解決
レジストリを確認します:
VC ++ 2008(sp1): HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall \ {3C3D696B-0DB7-3C6D-A356-3DB8CE541918}
または
VC ++ 2008(オリジナル): HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall \ {FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}
他のヒント
異なるOSを使用している場合、これらの解決策が役立つとは思いません!たとえば、MsiQueryProductStateは、Vista VC8.0を使用して常に-1を返します
while -1 VC8.0 / 8.0 SP1 / 9.0 for Windows 7の場合!したがって、マイクロソフトが提供するGUIDソリューションは、すべての場合に機能するわけではありません
だから私は%windir%\ winsxsアプローチに追われて検索することを余儀なくされていると思います
- x86_Microsoft.VC80.CRT *
- x86_Microsoft.VC90.CRT *
すべてのGUIDを探している人のために、作成したリストを次に示します。
Visual C ++ 2005ランタイムファイル
* VC 8.0 (x86) - {A49F249F-0C91-497F-86DF-B2585E8E76B7}
* VC 8.0 (x64) - {6E8E85E8-CE4B-4FF5-91F7-04999C9FAE6A}
* VC 8.0 (ia64) - {03ED71EA-F531-4927-AABD-1C31BCE8E187}
Visual C ++ 2005 SP1ランタイムファイル
* VC 8.0 SP1 (x86) - {7299052B-02A4-4627-81F2-1818DA5D550D}
* VC 8.0 SP1 (x64) - {071C9B48-7C32-4621-A0AC-3F809523288F}
* VC 8.0 SP1 (ia64) - {0F8FB34E-675E-42ED-850B-29D98C2ECE08}
Visual C ++ 2005 SP1 ATLセキュリティアップデートランタイムファイル
* VC 8.0 SP1 ATL Patch (x86) - {837B34E3-7C30-493C-8F6A-2B0F04E2912C}
* VC 8.0 SP1 ATL Patch (x64) - {6CE5BAE9-D3CA-4B99-891A-1DC6C118A5FC}
* VC 8.0 SP1 ATL Patch (ia64) - {85025851-A784-46D8-950D-05CB3CA43A13}
Visual C ++ 2008ランタイムファイル
* VC 9.0 (x86) - {FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}
* VC 9.0 (x64) - {350AA351-21FA-3270-8B7A-835434E766AD}
* VC 9.0 (ia64) - {2B547B43-DB50-3139-9EBE-37D419E0F5FA}
Visual C ++ 2008 SP1ランタイムファイル
* VC 9.0 SP1 (x86) - {9A25302D-30C0-39D9-BD6F-21E6EC160475}
* VC 9.0 SP1 (x64) - {8220EEFE-38CD-377E-8595-13398D740ACE}
* VC 9.0 SP1 (ia64) - {5827ECE1-AEB0-328E-B813-6FC68622C1F9}
Visual C ++ 2008 SP1 ATL Security Updateランタイムファイル
* VC 9.0 SP1 ATL (x86) - {1F1C2DFC-2D24-3E06-BCB8-725134ADF989}
* VC 9.0 SP1 ATL (x64) - {4B6C7001-C7D6-3710-913E-5BC23FCE91E6}
* VC 9.0 SP1 ATL (ia64) - {977AD349-C2A8-39DD-9273-285C08987C7B}
VC2005の最新版:
Visual C ++ 2005 Service Pack 1再頒布可能パッケージMFCセキュリティアップデート
* VC 8.0 SP1 MFCLOC Patch (x86) - {710F4C1C-CC18-4C49-8CBF-51240C89A1A2}
* VC 8.0 SP1 MFCLOC Patch (x64) - {AD8A2FA1-06E7-4B0D-927D-6E54B3D31028}
* VC 8.0 SP1 MFCLOC Patch (ia64) - {C2F60BDA-462A-4A72-8E4D-CA431A56E9EA}
8.0.50727.6195
http://www.microsoft。 com / downloads / details.aspx?familyid = AE2E1A40-7B45-4FE9-A20F-2ED2923ACA62
手早く汚い:
if (LoadLibrary(L"msvcrt80.dll")!=NULL)
{
// it is installed
}
Loadlibraryはパスの検索を処理します。
別のソリューションが提案されているようです MsiQueryProductState API を使用するMicrosoft-DeveloperによるGUID。
更新:昨日コードが公開され、正常に機能しているようです。これが行われていることです。最新の既知のGUIDとパスがチェックされます。どこにインストールするかを想定しています。両方が失敗した場合、インストールされます。これはうまくいくようです。
さらに、コマンドライン引数" / qb"とともにインストールされます。これは「不在だが不可視ではない」ことを意味します。これらのパラメーターについては、この他のブログ投稿をご覧ください。
FWIW、Microsoft Visual C ++ 2008 / VC90 SP1再頒布可能パッケージのGUID-x86 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 *
たとえば、Visual Studio 2008の再配布可能ファイルを確認している場合は、 $ WINDIR \ WinSxS \ x86_Microsoft.VC90.CRT _ *
を確認します。
私は VC ++再配布可能DLLをチェックするGithub上のVisual C ++プロジェクトをオープンソース化しました具体的には、Apache 2.0ライセンスで利用できるようにしました。
VC ++ 9およびVC ++ 10ランタイムの可用性を確認するための3つの異なる方法があります。
- MsiQueryProductState APIをチェックします;
- WinSxSフォルダーの内容を調べて、一致する製品ディレクトリを確認します。そして
- 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なので、ご自身のアプリケーションで自由に使用してください。
更新この問題が発生した他のユーザーの場合:
1)Visual Studioがインストールされている場合、必要なDLLは存在しますが、「redist package」はそうではないので、レジストリキーが欠落しています。 (つまり、これは偽陰性をもたらします)。ただし、このような状況でredistを上部にインストールしても問題はありません。
2)redistのメジャーリリース(VS2005 / VS2008、x86 / x64 / IA64、およびサービスパックの任意の組み合わせ:SP1、ATLセキュリティアップデート)ごとに異なるGUIDがあります。 x86とx64の両方のPCにアプリケーションをデプロイする場合は注意してください。
3)LoadLibraryまたはDLLファイルのチェックを使用する場合は、正しいバージョンをターゲットにしていることを確認してください。 「すべて」を探す場合msvcrt80.dll(など)のコピーを使用すると、プログラムがリンクされたバージョンであるかどうかを確認できません。
&quot; Microsoft Visual C ++ 2008 Service Pack 1再頒布可能パッケージMFCセキュリティアップデート(x86)&quot;の製品コード{9BE518E6-ECC6-35A9-88E4-87755C07200F}
WINDOWS \ WinSxSディレクトリの下のファイルをチェックして、インストールされているバージョンを確認できます。多くの場合、一度に多くのバージョンをインストールできるため、インストールした特定のバージョンを確認する必要がある場合があります。
次の値でGUIDリストを拡張したい:
32ビット30729.17
{9A25302D-30C0-39D9-BD6F-21E6EC160475}
32ビット30729.01
{6AFCA4E1-9B78-3640-8F72-A7BF33448200}
64ビット30729.17
{8220EEFE-38CD-377E-8595-13398D740ACE}
64ビット30729.01
{0DF3AE91-E533-3960-8516-B23737F8B7A2}
VC ++ 2008(sp1)
{3C3D696B-0DB7-3C6D-A356-3DB8CE541918}
VC ++ 2008(オリジナル)
{FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}
IA64 30729.01
{22E23C71-C27A-3F30-8849-BB6129E50679}
32ビット30729.4148
{7B33F480-496D-334A-BAC2-205DEC0CBC2D}
Visual Studio 2008 Professional SP1
{D7DAD1E4-45F4-3B2B-899A-EA728167EC4F}
32ビット30729.01
{F333A33D-125C-32A2-8DCE-5C5D14231E27}
だから、GUIDでVCredistの存在を確認するのが良いかどうかを判断してください。
最も確実な方法は、さまざまなvcredistバージョンのGUIDで MsiQueryProductState APIを使用することです。
動作します!
よろしく。
VC2008再配布可能のレジストリエントリが見つかりました。ここに私の解決策があります:
BOOL IsVC2008RedistInstalled(LPCTSTR pLogFile)
{
TCHAR szLogEntry[256];
memset(szLogEntry, '0', sizeof(szLogEntry));
HKEY hKey;
LONG lErr;
TCHAR csid[256];
_stprintf( csid, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{9A25302D-30C0-39D9-BD6F-21E6EC160475}"));
lErr = RegOpenKeyEx(HKEY_LOCAL_MACHINE, csid, 0, KEY_QUERY_VALUE, &hKey);
if (lErr == ERROR_SUCCESS)
{
_stprintf(szLogEntry, _T("VC2008 Redistributable was installed before.\n"));
toFile(pLogFile, szLogEntry);
return TRUE;
}
else
{
_stprintf(szLogEntry, _T("VC2008 Redistributable was not installed before. %ld\n"), lErr);
toFile(pLogFile, szLogEntry);
return FALSE;
}
}