2008-10-02 4 views
10

Чтобы открыть диалоговое окно UAC в Vista при записи в куст реестра HKLM, мы предпочитаем не использовать Win32 Registry API, так как при отсутствии разрешений Vista нам нужно перезапустить все наше приложение с правами администратора. Вместо этого мы делаем этот трюк:Как запустить процесс Windows как 64-разрядный из 32-битного кода?

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.

Итак, есть ли способ запустить 64-битное приложение программно из 32-разрядного приложения и не запускать его с использованием подсистемы 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-объект, используя COM elevation moniker.

+0

Не забывайте, что из-за перенаправления файловой системы (или того, что называет ее MS) 32-разрядный процесс, который пытается открыть/exec «c: \ Windows \ System32 \ foo.exe», будет открывать этот файл/exec молча перенаправляется на «C: \ windows \ SysWow64 \ foo.exe», если не будут приняты конкретные меры для отключения перенаправления. – 2008-10-02 20:08:14

+0

Yep Mike, вот что я заметил после того, как я отметил это как «ответ». То есть, я на самом деле * написал полный путь «System32» в своем тесте, поэтому в любом случае он должен был выбрать 64-битную версию, но не сделал этого. Я предположил, что это по той причине, о которой вы указываете. :) – Jonas 2008-10-02 21:22:56