从32位安装程序向64位注册表中写入数据

6
我有一个32位应用程序和一个32位安装程序,是使用Wise Installation Studio编写的。我知道...我不应该使用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位注册表视图中?或者除了创建注册表项之外,还有更好的设置此属性的方法吗?


1
那个 Wise 项目类型是 MSI 安装程序吗? - Christopher Painter
@ChristopherPainter:我不确定(不知道如何检查)。但生成的安装程序具有 .exe 扩展名(而不是 .msi)。您有在 Wise Installation Studio 中查找它的任何想法吗? - Travesty3
6个回答

5

我不确定 Wise 是否提供有关脚本编写的可能性,但是从常规程序访问64位注册表的方法是在操作注册表时使用KEY_WOW64_64KEY

如果至少可以运行设置中的外部EXE文件,那么这应该可以解决你的问题。


谢谢。看起来这是我们必须要做的,至少在我能说服其他人值得花费额外时间迁移到新的安装程序之前。 - Travesty3

4

我不确定在这个问题被提出时是否已经有了这个解决方案,但你可以创建一个自定义操作来执行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 将解决问题。 - E.T
它也适用于32位操作系统,并且如果您指定/reg:64,则仅转到常规的32位注册表。 - Jeff

0

你也可以使用

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

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

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


0
尽管使用Reg.exe查询注册表,问题仍然存在。 因为当Wise调用批处理文件时,reg查询无法找到64位键(只能找到32位键)。

0
我也使用Wise并且需要支持32位和64位的Windows。 我已经成功地使用批处理文件调用reg.exe来删除和查询64位注册表项。 您应该能够采用相同的技术来添加和修改注册表。 我查找“program files(x86)”以确定它是否为64位Windows。 如果不是,我将在Wise中使用本地注册表控件;否则,我将使用传入参数的批处理文件。 Reg.exe应该在您的路径中。 转到dos提示符并键入reg /?以获取语法。
我的regtest.bat包含以下内容: reg.exe query %1 /v %2 > %3
第一个参数是注册表键,第二个是值,第三个是要写入的文本文件。
我的regdelete.bat包含: reg.exe delete %1 /f,参数是您要删除的注册表项。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接