Чтобы открыть диалоговое окно 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-битного процесса (то есть суффикса «*» в диспетчере задач)?
Не забывайте, что из-за перенаправления файловой системы (или того, что называет ее MS) 32-разрядный процесс, который пытается открыть/exec «c: \ Windows \ System32 \ foo.exe», будет открывать этот файл/exec молча перенаправляется на «C: \ windows \ SysWow64 \ foo.exe», если не будут приняты конкретные меры для отключения перенаправления. – 2008-10-02 20:08:14
Yep Mike, вот что я заметил после того, как я отметил это как «ответ». То есть, я на самом деле * написал полный путь «System32» в своем тесте, поэтому в любом случае он должен был выбрать 64-битную версию, но не сделал этого. Я предположил, что это по той причине, о которой вы указываете. :) – Jonas 2008-10-02 21:22:56