使用VC ++ 2008构建XP的屏幕保护程序

时间:2009-05-06 00:23:18

标签: visual-studio-2008 winapi visual-c++ screensaver

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

定义WINVER似乎没有做任何事情。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

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

编辑:我在blog处找到了一个有趣的链接...它谈到完全相同的问题,从旧版本中获取scrnsave.lib的旧副本安装(VS 2005,如果你有权访问一个或询问朋友/同事?)说到具有vista特定的上述功能 - 这里有一个有趣的opinion,为什么它不应该被触及......

希望这有帮助, 最好的祝福, 汤姆。

答案 1 :(得分: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的下载链接。

答案 2 :(得分: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。