【问题标题】:How to launch a Windows process as 64-bit from 32-bit code?如何从 32 位代码以 64 位启动 Windows 进程?
【发布时间】:2010-09-14 19:23:04
【问题描述】:

要在写入 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 位应用程序运行,由于@987654321,注册表项最终会出现在错误的位置@。

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

【问题讨论】:

    标签: c++ winapi 64-bit registry


    【解决方案1】:

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

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

    (发现here)。

    【讨论】:

    【解决方案2】:

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

    您确实应该将此函数分解为单独的程序或 COM 对象,并用清单标记该程序,或使用 COM elevation moniker 启动 COM 对象。

    【讨论】:

    • 不要忘记,由于文件系统重定向(或任何 MS 所称的),尝试打开/执行 "c:\Windows\System32\foo.exe" 的 32 位进程将除非采取特定措施禁用重定向,否则请将该文件打开/执行以静默方式重定向到“C:\windows\SysWow64\foo.exe”。
    • 是的,迈克,这就是我在将其标记为“答案”后注意到的。那就是——我实际上已经在我的测试中编写了完整的“System32”路径,所以无论如何它应该选择 64 位版本,但没有。我认为这是因为你指出的原因。 :)
    • “PATH 中最先出现的内容”注释不太正确。 PATH 表示 system32 是 32 位还是 64 位。从 32 位进程调用 ShellExecute 时,您会将文件系统重定向到 syswow64。这并不是说您可以交换系统目录在 PATH 变量中出现的顺序并更改行为!
    • 出于迈克尔建议的原因,我认为这个答案不会奏效。 @Jonas,您可以通过再次单击复选标记“取消接受”它
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      您可以随时将其重新打开。

      【讨论】:

        猜你喜欢
        • 2011-01-01
        • 2013-03-11
        • 1970-01-01
        • 2010-09-12
        • 1970-01-01
        • 2018-07-30
        • 2012-01-19
        • 1970-01-01
        • 2012-01-19
        相关资源
        最近更新 更多