通过注册表检测是否安装了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 运行后导致的。




已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页