我正在使用一些使用 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/