我正在尝试在 Windows XP 上使用 Visual C++ 2008 Express Edition SP1 编译屏幕保护程序。我收到运行时错误:“过程入口点ChangeWindowMessageFilter()
无法位于动态链接库 USER32.dll 中。” 据我所知,这是因为微软破坏了 VS 2008 中包含的 scrnsave.lib 库来调用特定于 Vista 的函数,该函数在 XP 上失败,因为该函数不存在。
定义WINVER
似乎没有任何作用。
我该如何解决这个问题?
我正在尝试在 Windows XP 上使用 Visual C++ 2008 Express Edition SP1 编译屏幕保护程序。我收到运行时错误:“过程入口点ChangeWindowMessageFilter()
无法位于动态链接库 USER32.dll 中。” 据我所知,这是因为微软破坏了 VS 2008 中包含的 scrnsave.lib 库来调用特定于 Vista 的函数,该函数在 XP 上失败,因为该函数不存在。
定义WINVER
似乎没有任何作用。
我该如何解决这个问题?
在 MSDN 中查看“ ChangeWindowMessageFilter ”表明它是特定于 Vista 的,并且是您要链接的 User32.lib 的一部分,因为 Windows XP 在 User32.dll 中没有该功能....因此爆炸...建议按照迈克尔的建议下载旧版本的 SDK...没有其他方法可以做到...我想知道您能否并排安装不同的 SDK,一个用于 Vista 平台和其他的Win XP平台?
编辑:我在博客上找到了一个关于这个的有趣链接......它谈到了完全相同的问题,从较旧的安装中获取 scrnsave.lib 的旧副本(VS 2005,如果您可以访问一个或询问朋友/同事?)说到上述特定于 vista 的功能 - 这是一个有趣的观点,为什么不应该触及它......
希望这会有所帮助,最好的问候,汤姆。
编写一个存根函数(代码中遗漏了许多细节)
BOOL WINAPI ChangeWindowMessageFilter(
UINT message,
DWORD dwFlag)
{
if (running_on_vista_or_later)
{
....
pfn = GetProcAddress(... "ChangeWindowMessageFilter");
return pfn (message, dwFlag);
}
return TRUE;
}
如果此函数所在的 obj 或 lib 在您的链接行中的 user32.lib 之前,则链接器应该选择您的存根函数而不是 user32.lib 中的那个。
您的存根函数可以在运行时检测到您在 Vista 或更高版本上并调用真正的函数,否则只是撒谎并返回 TRUE。
您可以尝试获取旧版本的 Platform SDK,并链接到它的 scrnsave.lib 版本。
http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en是 Windows Server 2003 SP1 平台 SDK 的下载链接。