6

我正在尝试在 Windows XP 上使用 Visual C++ 2008 Express Edition SP1 编译屏幕保护程序。我收到运行时错误:“过程入口点ChangeWindowMessageFilter()无法位于动态链接库 USER32.dll 中。” 据我所知,这是因为微软破坏了 VS 2008 中包含的 scrnsave.lib 库来调用特定于 Vista 的函数,该函数在 XP 上失败,因为该函数不存在。

定义WINVER似乎没有任何作用。

我该如何解决这个问题?

4

3 回答 3

1

在 MSDN 中查看“ ChangeWindowMessageFilter ”表明它是特定于 Vista 的,并且是您要链接的 User32.lib 的一部分,因为 Windows XP 在 User32.dll 中没有该功能....因此爆炸...建议按照迈克尔的建议下载旧版本的 SDK...没有其他方法可以做到...我想知道您能否并排安装不同的 SDK,一个用于 Vista 平台和其他的Win XP平台?

编辑:我在博客上找到了一个关于这个的有趣链接......它谈到了完全相同的问题,从较旧的安装中获取 scrnsave.lib 的旧副本(VS 2005,如果您可以访问一个或询问朋友/同事?)说到上述特定于 vista 的功能 - 这是一个有趣的观点,为什么不应该触及它......

希望这会有所帮助,最好的问候,汤姆。

于 2010-02-20T02:12:52.237 回答
0

编写一个存根函数(代码中遗漏了许多细节)

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。

于 2010-02-21T07:57:19.383 回答
0

您可以尝试获取旧版本的 Platform SDK,并链接到它的 scrnsave.lib 版本。

http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en是 Windows Server 2003 SP1 平台 SDK 的下载链接。

于 2009-05-06T00:54:04.917 回答