Как запустить процесс Windows как 64-битный из 32-битного кода? - PullRequest
10 голосов
/ 02 октября 2008

Чтобы открыть диалоговое окно UAC в Vista при записи в куст реестра HKLM, мы решили не использовать API реестра Win32, так как при отсутствии разрешений 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, как 32-битное приложение, использующее уровень совместимости WOW! :( Если REG.EXE запускается из командной строки, он правильно запускается в 64-битном режиме. Это важно, потому что, если он запускается как 32-битное приложение, ключи реестра окажутся не в том месте из-за Реестр отражения .

Итак, есть ли способ запустить 64-битное приложение программно из 32-битного приложения и не запускать его с использованием подсистемы WOW64, как его родительский 32-битный процесс (то есть суффикс "*" в диспетчере задач)

Ответы [ 4 ]

12 голосов
/ 10 мая 2010

попробуйте это (из 32-битного процесса):

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

(найдено, что здесь ).

8 голосов
/ 02 октября 2008

Будет ли запущена 32-битная или 64-битная собственная (неуправляемая) программа, зависит только от исполняемого файла. Существует две копии reg.exe, в C: \ Windows \ System32 (64-разрядная версия) и C: \ Windows \ SysWOW64 (32-разрядная версия). Поскольку вы не указываете путь, вы получаете то, что появляется первым в переменной среды PATH, которая является 32-битной версией для 32-битного процесса.

Вы действительно должны выделить эту функцию в отдельную программу или COM-объект и пометить программу манифестом или запустить COM-объект, используя COM возвышение * COM6 *.

2 голосов
/ 02 октября 2008

Рассматривали ли вы создание небольшого "вспомогательного" приложения для обновления реестра? Если вы скомпилируете его в 64-битную версию и включите манифест, указывающий, что для него требуются права администратора, то он будет охватывать обе базы для вас.

Существуют API-интерфейсы для определения «разрядности» операционной системы, на которой вы работаете, так что вы, возможно, могли бы скомпилировать RegistryUpdate32.exe и RegistryUpdate64.exe и вызвать соответствующую.

1 голос
/ 29 декабря 2011

Одна вещь, которую я сделал для себя, - это отключение перенаправления PInvoke:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365744(v=vs.85).aspx

Вы всегда можете снова включить его.

...