要在写入 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 子系统运行它(即任务管理器中的“*”后缀)?