c++ - 静态链接具有较新平台 SDK 的库,可能吗?

标签 c++ windows sdk

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

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

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

或者有人对我如何解决这个问题有更好的想法吗?谢谢。

最佳答案

您可以使用 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 的平台上会正常失败)。

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

关于c++ - 静态链接具有较新平台 SDK 的库,可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15075060/

相关文章:

windows - makecert 错误 : Can't access the key of the subject

C++ - Windows IoT Core 远程调试器 - 调试器无法启动

Java代码可以在windows上运行,但不能在linux上运行

android - 将 Spotify SDK 与 Android 集成

c++ - 如何使用 Makefile 变量作为文件包含在 g++ 命令中?

c++ - 如何在 MacOS 上的 NodeJS native 插件上创建 OpenGL 上下文?

android - 2 GCM registrationId 相同的 android 应用程序

php - 解析 PHP SDK 版本要求

java - jtype (JNI) 和 C/C++ 的类型有什么区别?

c++ - *&var 是多余的吗?