检测VC++Redistributable运行库 & vcredist_x86.exe

来源:互联网 发布:java spilt 正则 编辑:程序博客网 时间:2024/06/06 13:09

摘要:一般用Visual C++开发的Windows应用程序需要这个运行时库的支持才能在没有安装Visual C++的计算机上正常运行,也可以在开发软件时选择”在静态库中使用 MFC“,从而将调用的库函数的代码嵌入应用程序,避免对运行时库的依赖。此软件包安装 C Runtime(CRT)、Standard C++、ATL、MFC、OpenMP 和 MSDIA 库的运行时组件。对于支持并行部署模式的库(CRT、SCL、ATL、MFC 和 OpenMP),这些运行时组件安装在支持并行程序集的 Windows 操作系统版本的本机程序集缓存中,这一缓存也称为 WinSxS 文件夹。


形成本文前,研读了bravo的新浪博客中《VC++Redistributable的安装判断 》,以及HuaHuaXia的专栏中《通过注册表检测是否安装了VC++ 2008 SP1 redistributable》两篇文章,了解到VC++Redistributable是大部分Windows平台下开发的程序所需要依赖的库,而vcredist_x86.exe这个6M大小的应用程序就是这个库的安装程序。

不同版本的VC++Redistributable具有不同的GUID(全局唯一标识),这给检测带来了很大困难。但是一个很明确的问题是——不管是何种版本,都会在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\路径下生成一个注册键key。

根据这个特征,这里提出一种可行方式是:根据注册表,判断xx键是否存在来判断VC++Redistributable运行库是否被安装。

// RegEditDetect.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <string>#include <Windows.h>using std::string;LPCTSTR reg[18] = { _T("{A49F249F-0C91-497F-86DF-B2585E8E76B7}"),//Microsoft Visual C++ 2005 Redistributable X86_T("{7299052B-02A4-4627-81F2-1818DA5D550D}"),//Microsoft Visual C++ 2005 SP1 Redistributable X86_T("{837b34e3-7c30-493c-8f6a-2b0f04e2912c}"),//Microsoft Visual C++ 2005 SP1 Redistributable ATL Security Update X86_T("{6E8E85E8-CE4B-4FF5-91F7-04999C9FAE6A}"),//Microsoft Visual C++ 2005 Redistributable X64_T("{071C9B48-7C32-4621-A0AC-3F809523288F}"),//Microsoft Visual C++ 2005 SP1 Redistributable X64_T("{6CE5BAE9-D3CA-4B99-891A-1DC6C118A5FC}"),//Microsoft Visual C++ 2005 SP1 Redistributable ATL Security Update X64_T("{03ED71EA-F531-4927-AABD-1C31BCE8E187}"),//Microsoft Visual C++ 2005 Redistributable IA64_T("{0F8FB34E-675E-42ED-850B-29D98C2ECE08}"),//Microsoft Visual C++ 2005 SP1 Redistributable IA64_T("{85025851-A784-46D8-950D-05CB3CA43A13}"),//Microsoft Visual C++ 2005 SP1 Redistributable ATL Security Update IA64_T("{FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}"),//Microsoft Visual C++ 2008 Redistributable X86_T("{9A25302D-30C0-39D9-BD6F-21E6EC160475}"),//Microsoft Visual C++ 2008 SP1 Redistributable X86_T("{1F1C2DFC-2D24-3E06-BCB8-725134ADF989}"),//Microsoft Visual C++ 2008 SP1 Redistributable ATL Security Update X86_T("{350AA351-21FA-3270-8B7A-835434E766AD}"),//Microsoft Visual C++ 2008 Redistributable X64_T("{8220EEFE-38CD-377E-8595-13398D740ACE}"),//Microsoft Visual C++ 2008 SP1 Redistributable X64_T("{4B6C7001-C7D6-3710-913E-5BC23FCE91E6}"),//Microsoft Visual C++ 2008 SP1 Redistributable ATL Security Update X64_T("{2B547B43-DB50-3139-9EBE-37D419E0F5FA}"),//Microsoft Visual C++ 2008 Redistributable IA64_T("{5827ECE1-AEB0-328E-B813-6FC68622C1F9}"),//Microsoft Visual C++ 2008 SP1 Redistributable IA64_T("{977AD349-C2A8-39DD-9273-285C08987C7B}"),//Microsoft Visual C++ 2008 SP1 Redistributable ATL Security Update IA64};/*功能:检测lpszSubKey是否存在*/bool detectVCppRedistributable(LPCTSTR lpszSubKey){    //printf("%ls\n", lpszSubKey);    HKEY hKey;    int ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_READ, &hKey);    RegCloseKey(hKey);    return (ret == 0) ? true : false;}int _tmain(int argc, _TCHAR* argv[]){    //拼接key并调用函数detectVCppRedistributable检测注册表    for (int i = 0; i < 18; ++i){        wchar_t key[100] = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\");        wcscat_s(key, 100, reg[i]);        if (detectVCppRedistributable(key)){            printf("yes\n");            break;        }    }    return 0;}

当然,你也可以加入更高版本的检测,不过从2008以后,可以直接检测.NET Framework,而不必检测VC运行库了

{1D8E6291-B0D5-35EC-8441-6616F567A0F7}  //Microsoft Visual C++ 2010 Redistributable X64{6a3b46d3-fbf1-4b22-8b42-48b675de6b81}  //Microsoft Visual C++ 2012 Redistributable X64{95716cce-fc71-413f-8ad5-56c2892d4b3a}  //Microsoft Visual C++ 2012 Redistributable X86{b64ca997-b626-4abb-a046-5ca2d92ed659}  //Microsoft Visual C++ 2012 Redistributable X86{050d4fc8-5d48-4b8f-8972-47c82c46020f}  //Microsoft Visual C++ 2012 Redistributable X64{7f51bdb9-ee21-49ee-94d6-90afc321780e}  //Microsoft Visual C++ 2012 Redistributable X64{f65db027-aff3-4070-886a-0d87064aabb1}  //Microsoft Visual C++ 2012 Redistributable X86{74d0e5db-b326-4dae-a6b2-445b9de1836e}  //Microsoft Visual C++ 2012 Redistributable X86
0 0