10

要在写入 HKLM 注册表配置单元时在 Vista 中弹出 UAC 对话框,我们选择不使用 Win32 Registry API,因为当缺少 Vista 权限时,我们需要使用管理员权限重新启动整个应用程序。相反,我们这样做:

ShellExecute(hWnd, "runas" /* display UAC prompt on Vista */, windir + "\\Reg", "add HKLM\\Software\\Company\\KeyName /v valueName /t REG_MULTI_TZ /d ValueData", NULL, SW_HIDE);

此解决方案运行良好,除了我们的应用程序是 32 位应用程序之外,它运行 REG.EXE 命令,因为它是使用 WOW 兼容层的 32 位应用程序!:( 如果 REG.EXE 从命令行运行,它会在 64 位模式下正确运行。这很重要,因为如果它作为 32 位应用程序运行,由于注册表反射,注册表项最终会出现在错误的位置.

那么有什么方法可以从 32 位应用程序以编程方式启动 64 位应用程序,而不是像其父 32 位进程一样使用 WOW64 子系统运行它(即任务管理器中的“*”后缀)?

4

4 回答 4

12

试试这个(来自 32 位进程):

> %WINDIR%\sysnative\reg.exe query ...

(发现here)。

于 2010-05-10T10:40:14.493 回答
9

运行 32 位还是 64 位本机(非托管)程序完全取决于可执行文件。有两个副本reg.exe,分别位于 C:\Windows\System32(64 位)和 C:\Windows\SysWOW64(32 位)中。因为您没有指定路径,所以您将获得PATH环境变量中首先出现的任何内容,这是 32 位进程的 32 位版本。

您应该真正将此函数分解为单独的程序或 COM 对象,并使用清单标记该程序,或使用COM 提升名字对象启动 COM 对象。

于 2008-10-02T13:49:30.637 回答
2

您是否考虑过创建一个小型“助手”应用程序来为您更新注册表?如果您将其编译为 64 位并包含表明它需要管理员权限的清单,那么它将为您涵盖这两个基础。

有 API 可以检测您正在运行的操作系统的“位数”,因此可以想象,您可以编译 RegistryUpdate32.exe 和 RegistryUpdate64.exe 并调用相关的。

于 2008-10-02T13:42:33.510 回答
1

我为自己做的一件事是 PInvoke 禁用重定向:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365744(v=vs.85).aspx

您可以随时重新打开它。

于 2011-12-28T23:06:14.303 回答