可以静态链接具有较新平台SDK的库吗?

时间:2013-02-25 19:39:32

标签: c++ windows sdk

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

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

我的问题是,我是否可以在VS2010中编写一个包含AllowSetForegroundWindow()调用的静态库,并与VSC ++ 6.0项目链接,并通过该库调用该调用。

或者有没有人更好地了解我如何解决这个问题呢?感谢。

1 个答案:

答案 0 :(得分: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的平台上正常失败)。

您可能需要根据自己的错误处理或线程安全需求进行自定义。