Como permitir que 32 aplicativos bits em 64 bits do Windows para executar 64 aplicativos bit fornecidas no Windows \ System32

StackOverflow https://stackoverflow.com/questions/509989

Pergunta

Digamos que você tenha um aplicativo, que pretende fornecer aos usuários a capacidade de navegar na pasta system32 e executar programas em (como telnet).

O que é o melhor método para apoiar este em que você precisa para apoiar XP em diante como um cliente e 2k em diante para o servidor?

Tendo escrito tudo isso eu me pergunto se é muito pouco tempo / esforço em fornecer uma procura para fazer isso, onde eles poderiam simplesmente copiá-lo do explorador. Ainda requer capacidade de lançamento.

Eu encontrei alguma discussão sobre Nynaeve .

Até agora parece que há as seguintes opções

  1. Crie uma pasta sysnative no Windows que permitirá que você navegue / executar 64 bit. Questões são:
    • disponível apenas no Vista / Longhorn, de modo nenhum suporte para XP 64
    • leva a diferentes nomenclatura caminho, não pode usar mesmo caminho em várias versões.
    • estará ativo para toda de janelas, não apenas nosso aplicativo
    • não pode (provavelmente não é) apropriado para fazer ao instalar o aplicativo
    • permite especificar explicitamente através único caminho a versão do aplicativo para lançamento se houver um 32 bits ea versão de 64 bits
  2. Use a API do Windows para desativar temporariamente o redirecionamento ao mostrar listas de arquivos ou os usuários que executam executar comandos. Questões são:
    • Apenas disponível em 64 bits - tem que mexer com GetProcAddress
    • disponível apenas sob certas service packs
    • deve identificar individualmente todos os locais que este deve ser implementado
    • usuário precisará fornecer informações separado sobre se este é um aplicativo de 64 bits ou 32 bits.

Se alguém teve algum código de exemplo que exibiu um diálogo do Windows OpenFile (digamos usando MFC CFileDialog) mostrando nativly para XP / Vista e permitindo a visualização de diretório system32 64 bit, que seria fantástico.

Se alguém tinha um exemplo de lançar o aplicativo chamado, que também seria ótimo!

Edit:
Atualmente nós usamos CreateProcess para lançar o aplicativo (que está falhando).

err = CreateProcess((wchar_t*)exeName.c_str(), (wchar_t*)cmdLine.c_str(), NULL, NULL, FALSE, CREATE_SEPARATE_WOW_VDM, NULL, workingDir.c_str(), &startupInfo, &processInfo);
Foi útil?

Solução

Eu tenho ido com a opção 2, Para aqueles que possam estar interessados; aqui está a minha rápida corte em uma versão escopo do gerenciamento da desativação do Wow64 redirecionamento com base em notas de MS. Irá redirecionar se o API está disponível, espera que kernel32.dll já está disponível.

class Wow64RedirectOff {
    typedef BOOL (WINAPI *FN_Wow64DisableWow64FsRedirection) ( __out PVOID *OldValue );
    typedef BOOL (WINAPI *FN_Wow64RevertWow64FsRedirection) ( __in  PVOID OldValue );

public:
    Wow64RedirectOff() {
        LPFN_Disable = (FN_Wow64DisableWow64FsRedirection)GetProcAddress(
            GetModuleHandle(TEXT("kernel32")),"Wow64DisableWow64FsRedirection");
        if( LPFN_Disable ) {
            LPFN_Disable(&OldValue);
        }
    }

    ~Wow64RedirectOff() {
        if( LPFN_Disable ) {
            FN_Wow64RevertWow64FsRedirection LPFN_Revert = (FN_Wow64RevertWow64FsRedirection)GetProcAddress(
                GetModuleHandle(TEXT("kernel32")),"Wow64RevertWow64FsRedirection");
            if( LPFN_Revert ) {
                LPFN_Revert(OldValue);
            }
        }
    }

private:
    FN_Wow64DisableWow64FsRedirection LPFN_Disable;
    PVOID OldValue; 
};

E, assim, o uso seria

Wow64RedirectOff scopedRedirect;
//CFileOpen
//CreateProcess

Outras dicas

Você está sendo redirecionado para Windows / SysWoW64? Posso lançar aplicativos de 64 bits do Windows / System32 de um OpenFile em um 32-bit conseguiu executável.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top