Как запустить Windows-процесс как 64-битный из 32-битного кода?

Чтобы открыть диалоговое окно UAC в Vista при записи в куст реестра HKLM, мы предпочитаем не использовать Win32 Registry API, так как при отсутствии разрешений 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-битного процесса (то есть суффикса "*" в диспетчере задач)

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

Существует API для определения "битности" ОС, на которой вы работаете, поэтому вы можете, возможно, скомпилировать как RegistryUpdate32.exe, так и RegistryUpdate64.exe и вызвать соответствующий.