从 32 位安装程序写入 64 位注册表

Posted

技术标签:

【中文标题】从 32 位安装程序写入 64 位注册表【英文标题】:Writing to 64-bit registry from 32-bit installer 【发布时间】:2012-04-04 01:50:34 【问题描述】:

我有一个用 Wise Installation Studio 编写的 32 位应用程序和一个 32 位安装程序。 我知道...我不应该使用 Wise,我应该改用其他东西。但是现在,我坚持下去了。

我们的应用程序是图形密集型应用程序,为了提高性能,我们希望它在运行时禁用桌面合成 (Windows Aero)。我们在 32 位系统上通过在以下位置添加注册表项来完成此操作:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers

值为DISABLEDWM

这会在我们的 EXE 属性的兼容性选项卡中设置“禁用桌面合成”复选框,以便默认检查。

这在 32 位系统上完美运行,但在 64 位系统上运行安装程序时,Windows 会将注册表项的创建重定向到 HKLM\SOFTWARE\Wow6432Node,并且标志设置不正确。如果我在 64 位注册表视图中手动创建一个条目,那么它可以工作。

那么,如何从我们的 32 位安装程序强制在 64 位注册表视图中创建此注册表项?或者有没有更好的方法来设置这个属性而不是创建一个注册表项?

【问题讨论】:

Wise 项目类型是 MSI 安装程序吗? @ChristopherPainter:我不这么认为(不知道如何检查)。但是生成的安装程序有一个 .exe 扩展名(不是 .msi)。知道在 Wise Installation Studio 中哪里可以找到它吗? 【参考方案1】:

我不确定 Wise 在脚本方面为您提供了哪些可能性,但从常规程序访问 64 位注册表的方法是在操作注​​册表时使用 KEY_WOW64_64KEY。

如果至少可以从设置中运行外部 EXE 文件,它应该可以解决您的问题。

【讨论】:

谢谢。看起来这是我们必须要做的事情,至少在我能够说服其他人相信花一些额外的时间迁移到新的安装程序是值得的。【参考方案2】:

在问这个问题时我不确定这个解决方案是否可行,但您可以创建一个执行REG ADD 命令并包含/reg:64 开关的自定义操作,如下所示:

REG ADD "HKLM\Software\Example" /v "Name" /t REG_SZ /d "Data" /reg:64

/reg:64 开关将强制它进入 64 位注册表。我不完全确定这将在 32 位系统上做什么,但我希望它可能会被忽略。

【讨论】:

这实际上是正确的方法。接受的答案对 API 调用有效,但在这种情况下,当使用 REG 添加/删除密钥时,/reg:64 就可以了。 它也可以在 32 位操作系统上运行,如果您指定 /reg:64,它只会进入常规的 32 位注册表【参考方案3】:

通常您无法从 32 位应用程序访问 64 位注册表。我找到了一些用于 PowerShell 的代码,它允许您通过 WMI 访问 64 位注册表:http://gallery.technet.microsoft.com/scriptcenter/6062bbfc-53bf-4f92-994d-08f18c8324c0

但是,我不确定您是否可以在 Wise 中使用它。您可以改用 Windows Installer XML 并让它创建一个 64 位 MSI。

【讨论】:

【参考方案4】:

我也使用 Wise,并且必须同时支持 32 位和 64 位窗口。我使用批处理文件调用 reg.exe 来删除和查询 64 位注册表项取得了一些成功。您应该能够使用相同的技术来添加和修改注册表。我查找“程序文件(x86)以确定它是否是 64 位窗口。如果不是,我明智地使用本机注册表控件,否则,我使用传入参数的批处理文件。Reg.exe 应该在你的路径中. 转到 dos 提示符并键入 reg /? 以获取语法。

我有一个 regtest.bat,其中包含以下内容: reg.exe 查询 %1 /v %2 > %3

第一个参数是注册表项,第二个是值,第三个是要写入的文本文件。

我的 regdelete.bat 包含: reg.exe delete %1 /f 参数是要删除的注册表项。

【讨论】:

【参考方案5】:

虽然使用 Reg.exe 查询注册表,但问题仍然存在 因为Wise调用bat文件时,reg查询找不到64位的key(只能找到32位的key)。

【讨论】:

【参考方案6】:

你也可以使用

c:\Windows\SysNative\REG.exe ADD "HKLM\Software\Example" /v "Name" /t REG_SZ /d "Data"

这会强制使用 64 位版本的 reg.exe。当然,如果您使用的是 32 位操作系统,这将不起作用。因此,您应该检查操作系统类型,然后调用正确的 reg.exe 程序(对于 32 位操作系统,c:\Windows\System32 或对于 64 位操作系统的 C:\Windows\SysNative)。

如果是 64 位操作系统,环境变量 PROCESSOR_ARCHITEW6432 的值为 AMD64,如果是 32 位操作系统,则为空。

【讨论】:

以上是关于从 32 位安装程序写入 64 位注册表的主要内容,如果未能解决你的问题,请参考以下文章

从 32 位应用程序读取 64 位注册表

用于创建 32 位和 64 位安装程序的一个 .wxs 文件中的注册表项出现问题

很抱歉,无法安装Office(64位),因为您的计算机上已经安装了这些32位Office程序

32位程序在64位系统上获取系统安装时间(要使用KEY_WOW64_64KEY标记)

请求的 OLE DB 提供程序 Microsoft.ACE.OLEDB.16.0 未注册。如果未安装 32 位驱动程序,请在 64 位模式下运行该软件包

C# 32位程序在64位系统下注册表操作