有任何上古卷轴的问题,请直接到MOD社区发帖求助

如何检测系统是否已安装MSVC 2008 SP1 Redistributable

最近在找 MSVC 2010 的检测方法,发现网上更多的是询问 MSVC 2008 或者 MSVC 2008 SP1 的检测,因为2008在不同系统上的GUID是不一样的……就像《Mailbag: How to detect the presence of the Visual C++ 9.0 runtime redistributable package》里面列出来的几个:

Visual C++ 2008 runtime files

Visual C++ 2008 SP1 runtime files

Visual C++ 2008 SP1 ATL Security Update runtime files

Visual C++ 2008 SP1 MFC Security Update runtime files

我在自己的电脑上安装了某个版本也根本找不到相应的键值(也许是因为我装的是简体中文版,但我总不可能还要增加英文、简中、繁中或者各个语言包的检测?)

所以通过GUID检测系统是否安装 MSVC 2008 这个方法并不太可行。

网友 1800 INFORMATION 有提到另一种方法:检测 msvcr80.dll 是否存在。但是提问者没看明白……

不过,msvcr80.dll 是用来判断 MSVC 2005 的,而我们要判断 2008,所以需要选择 msvcr90.dll。(参考:Redistribution of the shared C runtime component in Visual C++

翻了一下 Wrye Bash 的安装脚本,下面是它的判断方式:

IfFileExists "$SYSDIR\MSVCR90.DLL" 0 +2
	StrCpy $9 "Installed"
IfFileExists "$COMMONFILES\Microsoft Shared\VC\msdia90.dll" 0 +2
	StrCpy $9 "Installed"

先判断MSVCR90.DLL是否在系统目录(system或system32)内,如果没有的话再看下 Common Files 里面是否有msdia90.dll。

msdia90.dll也是 MSVC2008 SP1 里面的内容

但是再上面一篇的文章里有提到 Msvcr90.dll 是不应该放在系统目录的,而是应该放在与程序版本有关的目录内(Visual C++ 2005 and Visual C++ 2008 install the CRT DLL as a Windows side-by-side assembly on Windows XP and later operating systems.),如C:\Windows\WinSxS\amd64_microsoft.vc90.crt_…..,所以我个人觉得最后的判断方式应该可以精简为

IfFileExists "$COMMONFILES\Microsoft Shared\VC\msdia90.dll" 0 +2
	StrCpy $9 "Installed"

不过我没有测试过,有兴趣的可以测试下 – –


下面是 MSVC 2010 的检测方式,可以直接检测以下注册表项目是否存在:
Visual C++ 2010 Redistributable Package (x86)
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\x86] Installed = 1 (REG_DWORD)
Visual C++ 2010 Redistributable Package (x64)
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\x64] Installed = 1 (REG_DWORD)
Visual C++ 2010 Redistributable Package (ia64)
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\ia64] Installed = 1 (REG_DWORD)

但有时候会不准,所以要记得另外再检查Wow6432Node目录,比如我用下面的方式检测 Visual C++ 2010 Redistributable Package (x86)

StrCpy $MVSC_Install $Empty
ReadRegStr $MVSC_Install HKLM "SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist
\x86" "Installed"
${IF} $MVSC_Install == $Empty
	ReadRegStr $MVSC_Install HKLM "SOFTWARE\Wow6432Node\Microsoft\
VisualStudio\10.0\VC\VCRedist\x86" "Installed"
${EndIf}

如果最后 $MVSC_Install 的数值为 $Empty 那系统上肯定是没有安装 Visual C++ 2010 Redistributable Package (x86) 的。

或者说,可以用GUID的检测方式,下面是2010相关的GUID数据:
Visual C++ 2010 redistributable package product codes

  • Visual C++ 2010 Redistributable Package (x86) – {196BB40D-1578-3D01-B289-BEFC77A11A1E}
  • Visual C++ 2010 Redistributable Package (x64) – {DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}
  • Visual C++ 2010 Redistributable Package (ia64) – {C1A35166-4301-38E9-BA67-02823AD72A1B}

Visual C++ 2010 SP1 redistributable package product codes

  • Visual C++ 2010 SP1 Redistributable Package (x86) – {F0C3E5D1-1ADE-321E-8167-68EF0DE699A5}
  • Visual C++ 2010 SP1 Redistributable Package (x64) – {1D8E6291-B0D5-35EC-8441-6616F567A0F7}
  • Visual C++ 2010 SP1 Redistributable Package (ia64) – {88C73C1C-2DE5-3B01-AFB8-B46EF4AB41CD}
icedream

About icedream

其实我知道的东西很少,只是翻译了一些东西,悲催的是翻译过后很快就忘了。

,

Comments are closed.