在发布 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 运行后导致的。



通过注册表检测是否安装了VC++ 2008 SP1 redistributable。相关推荐

  1. C#通过操作注册表检测office版本

    在编写毕业论文辅助编辑软件时,需要检测用户是否安装office以及office的版本,后来在网上找到通过注册表检测的方法,不过由于Windows32位软件和64位软件操作的注册表是不同的,关于这个问题 ...

  2. 如何修改注册表的默认安装路径

    注意:由于是写入注册表修改默认安装途径,可能存在(重启后,无法再次进入注册,需要在安全模式下改回来的),修改需要慎重!或者记住每一步修改的步骤,实在不行,就原路改回. 方法一:打开注册表,修改盘符. ...

  3. java通过注册表获取wps版本_注册表检测office版本

    #region 查询注册表,判断本机是否安装Office2003,2007和WPS public int ExistsRegedit() { int ifused = 0; RegistryKey r ...

  4. 注册表改win 7更新服务器,Win7 SP1 修改注册表升级的说明事项

    Win7之家( www.win7china.com):Win7 SP1 修改注册表升级的说明事项 同Vista时代的SP1.SP2等Service Pack包的发布形式类似,Win7 SP1 Beta ...

  5. C#部署安装,将用户安装路径记录下写入注册表,并启动

    安装部署程序,将安装目录写入注册表 (1)在"安装部署项目"上点击"注册表编辑器" (2)在HKey_LOCAL_MACHINE_SoftWare 下新建键 M ...

  6. VC++ MFC中如何将应用程序的配置信息保存到注册表中(一)

    注册表(Registry,繁体中文版Windows称之为登录档)是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息.比如我们打开一个记事本,调整其窗口大小,使用 ...

  7. 安装 Atmel Studio 7.0 时安装 Visual Studio Shell 2015 失败,软件安装注册表修复

    不小心弄坏注册表导致软件安装失败.下载微软注册表修复工具,修复后安装. 第一步下载修复工工具并卸载Atmel Studio相关 第二部重新安装Atmel Studio 7 Fix problems t ...

  8. 检测注册表中ActiveX控件是否被注册

    window.οnlοad=function() {            //在系统提示用户是否允许交互前判断当前控件是否加载,通过此属性判断当前是否注册了COM组件          var is ...

  9. 注册表的解释和一些简单的修改

    注册表的解释和一些简单的修改 一. HKEY_CLASSES_ROOT根键 此根键中主要记录着Windows 95/98中所有的文件类型,包括安装操作系统时约定注册的和由于以后安装软件而新加载的各种文 ...

最新文章

  1. 全局拖拽上传文件(类似百度网盘)的实现及踩坑
  2. 你解决的问题比你编写的代码更重要!
  3. 「基本功」不可不说的Java“锁”事
  4. Android7.0 PowerManagerService亮灭屏分析(二)
  5. prince2 成功的项目管理_PRINCE2试听福利丨成功的项目管理方法论
  6. vue使用Google Map
  7. 区块链浏览器_全球首款区块链浏览器是啥名堂?傲游6首发体验
  8. Exchange+2010实验手册
  9. mysql数据库密码安全参数_MySQL 密码参数配置与修改 validate_password
  10. 网络协议栈深入分析(五)--套接字的绑定、监听、连接和断开
  11. mysql 进阶到高级_MySQL 高级(进阶) SQL 语句精讲(一)
  12. [swift] LeetCode 215. Kth Largest Element in an Array
  13. Android基础知识之智能指针:强指针和弱指针
  14. 百度霸屏技术的源码发布
  15. this与static
  16. 神经网络中经常使用的激活函数--sigmoid函数
  17. vtk读取.dcm文件(医学影像文件)
  18. 苏州大学计算机考研资料汇总
  19. linux系统安装m1136打印机,Ubuntu 安装及共享打印机
  20. 小型网络游戏实例(vc++)——网络五子棋

热门文章

  1. 学徒浅析Android开发:第三讲——Dialog的常用方法介绍(二)
  2. 鲸探发布点评:7月26日发售
  3. Fiddler抓包工具配置
  4. JumpServer 安装部署
  5. 亚马逊关键词研究 如何选择亚马逊关键词?
  6. ipviking,大数据之美
  7. 视频教程-RPC服务框架(Dubbo)源码分析-Java
  8. 解决华为SecoClient在win10,win11环境下显示返回状态码超时问题
  9. 通俗理解TF-IDF文本分析算法
  10. 【转】数据库设计实例一学习