6

我有一个用 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 位注册表视图中创建此注册表项?或者除了创建注册表项之外,还有更好的方法来设置此属性吗?

4

6 回答 6

5

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

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

于 2012-03-19T15:08:39.460 回答
4

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

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

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

于 2016-05-04T10:39:59.140 回答
0

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

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

于 2012-03-19T15:09:46.393 回答
0

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

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

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

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

于 2013-06-20T13:49:26.810 回答
0

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

于 2013-08-15T05:41:10.377 回答
0

你也可以使用

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 位操作系统,则为空。

于 2018-08-23T00:40:12.653 回答