Comment permettre à 32 applications de bits sur Windows 64 bits pour exécuter des applications 64 bits fournis dans Windows \ System32

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

Question

Disons que vous avez une application, que vous voulez fournir la capacité aux utilisateurs de parcourir le répertoire system32 et exécuter des programmes dans (comme telnet).

Quelle est la meilleure méthode pour soutenir quand vous avez besoin pour soutenir XP partir en tant que client et 2k partir pour le serveur?

Après avoir écrit tout ça, je me demande si c'est juste trop de temps / effort pour fournir une navigation pour le faire, où ils pourraient tout simplement le copier depuis l'explorateur. exige encore la capacité de lancer.

J'ai trouvé une discussion sur Nynaeve .

Jusqu'à présent, il semble qu'il ya les options suivantes

  1. Créez un dossier Sysnative dans les fenêtres qui vous permettront de parcourir / exécuter 64 bits. Les questions sont les suivantes:
    • disponible uniquement dans Vista / Longhorn, donc pas de support pour XP 64
    • conduit à différents nommage de chemin, ne peut pas utiliser le même chemin sur plusieurs versions.
    • sera active pour l'ensemble des fenêtres, pas seulement notre application
    • ne peut pas (n'est probablement pas) approprié de le faire lors de l'installation de l'application
    • permet de spécifier explicitement par le chemin que la version de l'application pour lancer s'il y a un 32 bits et la version 64 bits
  2. Utilisez l'API Windows pour désactiver temporairement la redirection lors de l'affichage des listes de fichiers ou d'exécuter les utilisateurs d'exécuter des commandes. Les questions sont les suivantes:
    • Disponible uniquement sur 64 bits - doivent jouer avec GetProcAddress
    • disponible que sous certains services packs
    • doit identifier individuellement tous les endroits que cela devrait être mis en œuvre
    • utilisateur devra fournir des informations séparées pour savoir si cela est une application 64 bits ou 32 bits.

Si quelqu'un avait un code d'exemple qui affiche une boîte de dialogue de Windows OpenFile (MFC dire en utilisant CFileDialog) montrant nativement pour XP / Vista et permettant l'affichage de 64 bits répertoire system32, ce serait génial.

Si quelqu'un a un exemple de lancer l'application nommée, ce serait aussi grand!

Edit:
Actuellement, nous utilisons CreateProcess pour lancer l'application (qui échoue).

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);
Était-ce utile?

La solution

Je suis allé avec l'option 2, Pour ceux qui pourraient être intéressés; voici mon hack à une version scope de gérer la désactivation de la redirection Wow64 en fonction des notes de MS. Redirigera si l'API est disponible, attend à ce que kernel32.dll est déjà disponible.

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; 
};

Et l'utilisation serait donc

Wow64RedirectOff scopedRedirect;
//CFileOpen
//CreateProcess

Autres conseils

Êtes-vous obtenir redirigé vers Windows / SysWoW64? Je peux lancer des applications 64 bits à partir de Windows / System32 à partir d'un OpenFile dans un exécutable géré 32 bits.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top