Como lançar um processo Windows como 64-bit de código de 32 bits?
Pergunta
Para abrir o diálogo de UAC no Vista, ao escrever para o ramo de registo HKLM, optamos por não utilizar a API Win32 Registry, como quando permissões Vista estão faltando, tínhamos necessidade de relançar toda a nossa aplicação com direitos de administrador. Em vez disso, fazer este truque:
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);
Esta solução funciona bem, além de que a nossa aplicação é um 32-bit um, e executa o comando REG.EXE como seria um aplicativo de 32 bits usando a camada de compatibilidade WOW! :( Se REG.EXE é executado a partir da linha de comando, é adequadamente correu no modo de 64 bits. Isto é importante, porque se é funcionou como um aplicativo de 32 bits, as chaves do Registro vai acabar no lugar errado devido a registro reflexão .
Então, há alguma maneira de lançar um aplicativo de 64 bits por meio de programação a partir de um aplicativo de 32 bits e não executá-lo usando o subsistema WOW64 como o seu processo de 32 bits pai (ou seja, um "*" sufixo no Gerenciador de Tarefas) ?
Solução
tentar isso (a partir de um processo de 32 bits):
> %WINDIR%\sysnative\reg.exe query ...
(descobriu que aqui ).
Outras dicas
Se um nativo de 32 bits ou 64 bits (não gerenciado) é de gerência depende unicamente do executável. Existem duas cópias de reg.exe
, em C: \ Windows \ System32 (64 bits) e C: \ Windows \ SysWoW64 (32 bits). Porque você não especificar um caminho, você está recebendo tudo o que aparece pela primeira vez na variável de ambiente PATH
, que é a versão de 32 bits para um processo de 32 bits.
Você realmente deve levar esta função para fora em um programa ou COM objeto separado, e marcar o programa com um manifesto, ou lançar o objeto COM usando o COM elevação apelido .
Você já pensou em criar um pequeno aplicativo "helper" para fazer a atualização do registro para você? Se você compilá-lo para 64 bits e incluem um manifesto que indica que ele requer direitos de administrador, então ele vai cobrir ambas as bases para você.
Existem API de detectar a "bitness" do OS você está rodando em que você poderia, de modo concebível, compilar ambos RegistryUpdate32.exe e RegistryUpdate64.exe e chamar a uma relevante.
Uma coisa que eu fiz como uma solução para mim é PInvoke redirecionamento incapacitante:
http: // MSDN .microsoft.com / en-us / library / janelas / desktop / aa365744 (v = VS.85) .aspx
Você sempre pode transformá-lo de volta em.