2

Visual C++ 6.0 で構築されている古いコードベースを使用しています。呼び出しを行う必要がありAllowSetForegroundWindow()ますが、ビルドに使用されているプラ​​ットフォーム SDK にはその関数が定義されていません (2000 年より前の PSDK だと思います)。

AllowSetForegroundWindow()Microsoft はもはや Visual C++ 6.0 のサポートを提供しておらず、SDK はオンラインで入手できないため (またはディスクを購入しても、試してみました) 、PSDK を含むものに更新することは選択肢のようには思えません。

AllowSetForegroundWindow()私の質問は、呼び出しを含む VS2010 で静的ライブラリを作成し、VSC++ 6.0 プロジェクトとリンクして、そのライブラリを介して呼び出しを呼び出すことができるかどうかです。

または、この問題を一般的に回避する方法について、より良いアイデアを持っている人はいますか? ありがとう。

4

1 に答える 1

4

GetProcAddress()実行時にラッパー関数を実際の関数に接続するために使用できます。

BOOL WINAPI defaultAllowSetForegroundWindow( DWORD dwProcessId)
{
    SetLastError(ERROR_NOT_SUPPORTED);
    return 0;
}

BOOL WINAPI shimAllowSetForegroundWindow( DWORD dwProcessId)
{
    static BOOL  (WINAPI *asfw)(DWORD) = 0;

    if (!asfw) {
        HMODULE user32 = LoadLibraryW(L"USER32");

        if (user32) {
            asfw = (BOOL (WINAPI *)(DWORD)) GetProcAddress( user32, "AllowSetForegroundWindow");
        }

        if (!asfw) {
            asfw = defaultAllowSetForegroundWindow;
        }
    }

    return (*asfw)(dwProcessId);
}

コードはshimAllowSetForegroundWindow()、実際の API (または、API をサポートしていないプラットフォームでは正常に失敗するデフォルト) に転送する呼び出しを行うことができます。

エラー処理やスレッド セーフのニーズに合わせてカスタマイズする必要がある場合があります。

于 2013-02-25T20:05:32.697 に答える