2008-10-02 210 views
10

弹出在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位进程)运行(即任务管理器中的“*”后缀)?

回答

11

试试这个(从32位进程):

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

(发现here)。我已经为我自己的解决方案做

2

你有没有考虑设立一个小型的“助手”应用程序使注册表更新吗?如果你把它编译成64位,其中包括一个清单,表示它需要管理员权限,那么它会替你两个基地。

有API检测你正在运行的操作系统的“比特性”,所以你可以想象,编译RegistryUpdate32.exe和RegistryUpdate64.exe并调用相关的。

8

无论是32位或64位的天然(非托管)程序运行完全取决于可执行文件。在C:\ Windows \ System32(64位)和C:\ Windows \ SysWOW64(32位)中有reg.exe的两个副本。因为你不指定路径,你要什么先在PATH环境变量,它是32位版本的32位过程中出现。

你应该把这个功能放到一个单独的程序或COM对象中,并用清单标记程序,或使用COM elevation moniker启动COM对象。

+0

不要忘记的是,由于文件系统重定向(或任何MS调用它),试图在32位进程打开/ EXEC“C:\ WINDOWS \ SYSTEM32 \ foo.exe的”将有一个文件打开/除非采取特定的措施禁用重定向,否则exec将自动重定向到“C:\ windows \ SysWow64 \ foo.exe”。 – 2008-10-02 20:08:14

+0

是的,迈克,这是我注意到我作为一个“答案”后注意到的。那就是 - 我实际上已经*在我的测试中写了完整的“System32”路径,所以它应该选择了64位版本,但是没有。我认为这是你指出的原因。 :) – Jonas 2008-10-02 21:22:56