2

我正在使用一些使用 Visual C++ 6.0 构建的古老代码库。我需要调用,AllowSetForegroundWindow()但它正在构建的平台 SDK 没有定义该函数(我猜它是 2000 年之前的一些 PSDK)。

将 PSDK 更新为包含的 PSDKAllowSetForegroundWindow()似乎不是一种选择,因为 Microsoft 不再提供对 Visual C++ 6.0 的支持,并且 SDK 无法在线获得(或者甚至通过购买光盘,我已经尝试过)。

我的问题是我是否可以在 VS2010 中编写一个包含AllowSetForegroundWindow()调用的静态库,并与 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 回答