Wie 32-Bit-Anwendungen auf 64-Bit-Windows zu ermöglichen, 64-Bit-Anwendungen in Windows \ System32 vorgesehen auszuführen

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

Frage

Sagen Sie eine App haben, dass Sie Benutzer Fähigkeit zur Verfügung stellen möchten das system32-Verzeichnis durchsuchen und Ausführen von Programmen in (wie telnet).

Was ist die beste Methode, um diese für die Unterstützung, wenn Sie XP ab als Client und 2k weiter für Server unterstützen müssen?

Nachdem alles geschrieben Ich frage mich, ob es einfach zu viel Zeit / Aufwand ist ein Durchsuchen der Bereitstellung, dies zu tun, wo sie es nur aus dem Explorer kopieren könnte. Dennoch erfordert Fähigkeit. Starten

Ich habe einige Diskussionen gefunden Nynaeve .

Bisher scheint es, gibt es folgende Optionen

  1. Erstellen Sie einen Sysnative Ordner in Fenstern, die es Ihnen erlaubt, 64-Bit-Blätter / auszuführen. Themen sind:
    • nur in Vista / Longhorn, so dass keine Unterstützung für XP 64
    • führt zu unterschiedlicher Pfad Namensgebung, nicht denselben Pfad auf mehreren Versionen verwenden kann.
    • wird für ganze Fenster, nicht nur unsere App
    • aktiv sein
    • darf nicht (wahrscheinlich nicht) angemessen zu tun, wenn die App zu installieren
    • kann nur explizit durch Pfad angeben, welche Version der App zu starten, wenn ein 32-Bit und 64-Bit-Version ist
  2. Verwenden Sie den Windows-API, um vorübergehend die Umleitung zu deaktivieren, wenn Dateilisten zeigen oder Ausführen Benutzer Befehle ausführen. Themen sind:
    • Es wird nur auf 64-Bit verfügbar - hat zu Chaos mit GetProcAddress
    • nur unter bestimmtem Service Pack
    • muss individuell alle Standorte identifizieren, dass dies umgesetzt werden soll
    • Benutzer muss über separate Informationen zur Verfügung zu stellen, ob es sich um einen 64-Bit-App oder 32 Bit.

Wenn jemand einig Beispiel-Code hat, die einen Windows-Openfile-Dialog angezeigt (sagt mit MFC CFileDialog) zeigt nativ für XP / Vista und ermöglicht die Anzeige von 64-Bit-system32-Verzeichnis, das wäre genial.

Wenn jemand ein Beispiel für Start des genannten App hat, dass auch groß sein würde!

Edit:
Derzeit verwenden wir Create zum Starten der App (die nicht an).

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);
War es hilfreich?

Lösung

Ich habe mit Option gegangen 2, Für diejenigen, die interessiert sein könnten; hier ist mein schneller Hack bei einer Bereichsversion der Sperrung von Wow64 Umleitung Verwaltung basierte auf Notizen von MS. Wird umleiten, wenn die API verfügbar ist, erwartet, dass kernel32.dll bereits verfügbar ist.

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

Und so würde Nutzung sein

Wow64RedirectOff scopedRedirect;
//CFileOpen
//CreateProcess

Andere Tipps

Sind Sie auf Windows / SysWoW64 umgeleitet zu werden? Ich kann starten 64-Bit-Anwendungen unter Windows / System32 von einem Openfile in einer 32-Bit-verwaltete ausführbaren Datei.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top