彈出在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