弹出在Vista UAC对话框时写入HKLM注册表配置单元,我们选择不使用Win32注册表API,因为Vista权限缺乏的时候,我们就需要重新启动我们的管理员权限整个应用程序。相反,我们做这一招:如何从32位代码启动64位Windows进程?
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命令,因为它会使用是一个32位的应用程序WOW兼容层! :(如果REG.EXE从命令行运行,它的正确运行在64位模式。这一点很重要,因为如果它跑了作为一个32位应用程序,注册表项将在错误的地方结束,由于registry reflection。
那么有什么办法可以从32位应用程序以编程方式启动64位应用程序,而不是使用WOW64子系统(如其父级32位进程)运行(即任务管理器中的“*”后缀)?
不要忘记的是,由于文件系统重定向(或任何MS调用它),试图在32位进程打开/ EXEC“C:\ WINDOWS \ SYSTEM32 \ foo.exe的”将有一个文件打开/除非采取特定的措施禁用重定向,否则exec将自动重定向到“C:\ windows \ SysWow64 \ foo.exe”。 – 2008-10-02 20:08:14
是的,迈克,这是我注意到我作为一个“答案”后注意到的。那就是 - 我实际上已经*在我的测试中写了完整的“System32”路径,所以它应该选择了64位版本,但是没有。我认为这是你指出的原因。 :) – Jonas 2008-10-02 21:22:56