64 ビット Windows 上の 32 ビット アプリが Windows\System32 で提供される 64 ビット アプリを実行できるようにする方法

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

質問

たとえば、ユーザーが system32 ディレクトリを参照してプログラムを実行できるようにしたいアプリがあるとします (Telnet など)。

クライアントとして XP 以降、サーバーとして 2K 以降をサポートする必要がある場合、これをサポートするための最良の方法は何ですか?

ここまで書いてきましたが、エクスプローラーからコピーするだけで済むのに、これを行うための参照を提供するのは時間と労力がかかりすぎるのではないかと思います。やはり打ち上げ能力が必要。

についての議論を見つけました ニーナエブ.

今のところ以下の選択肢があるようです

  1. Windows に sysnative フォルダーを作成し、64 ビットを参照/実行できるようにします。問題は次のとおりです。
    • Vista/Longhorn でのみ利用できるため、XP 64 はサポートされません
    • パス名が異なるため、複数のバージョンで同じパスを使用できません。
    • アプリだけでなくウィンドウ全体でアクティブになります
    • アプリのインストール時に行うのは適切ではないかもしれません(おそらく適切ではありません)
    • 32 ビット バージョンと 64 ビット バージョンがある場合に、パスのみを介してアプリのどのバージョンを起動するかを明示的に指定できます
  2. ファイルリストを表示するとき、またはユーザーが実行するコマンドを実行するときに、Windows API を使用してリダイレクトを一時的に無効にします。問題は次のとおりです。
    • 64 ビットでのみ利用可能 - GetProcAddress をいじる必要がある
    • 特定のサービス パックでのみ利用可能
    • これを実装する必要があるすべての場所を個別に特定する必要があります
    • ユーザーは、これが 64 ビット アプリであるか 32 ビット アプリであるかについて個別の情報を提供する必要があります。

Windows OpenFile ダイアログ (MFC CFileDialog を使用するなど) を表示し、XP/Vista でネイティブに表示し、64 ビットの system32 ディレクトリを表示できるサンプル コードを誰かが持っていれば、それは素晴らしいでしょう。

誰かが指定されたアプリを起動する例を持っていれば、それも素晴らしいでしょう。

編集:
現在、アプリの起動には CreateProcess を使用しています (これは失敗しています)。

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);
役に立ちましたか?

解決

私は、オプション2で行ってきました 興味があるかもしれない人のために。ここに私の迅速なハックはMSからのリアクションに基づくWOW64リダイレクションの無効化を管理するスコープのバージョンです。 APIが利用可能な場合はリダイレクトする、KERNEL32.DLLが既に利用可能であることを期待しています。

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

そしてこうして使い方は以下のようになります。

Wow64RedirectOff scopedRedirect;
//CFileOpen
//CreateProcess

他のヒント

あなたは、Windows / SYSWOW64にリダイレクト取得していますか?私は、32ビットの管理、実行可能でのOpenFileからのWindows / System32にから64ビットアプリケーションを起動することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top