4

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

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

これをすべて書いたので、エクスプローラーからコピーするだけで、これを行うためのブラウズを提供するのは時間と労力が多すぎるのではないかと思います。まだ起動する能力が必要です。

Nynaeveに関するいくつかの議論を見つけました。

これまでのところ、次のオプションがあるようです

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

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

名前付きアプリを起動する例があれば、それも素晴らしいでしょう!

編集:
現在、アプリの起動に 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);
4

2 に答える 2

4

私はオプション 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
于 2009-02-05T03:16:09.933 に答える