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

Posted

技术标签:

【中文标题】使用 VC++ 2008 为 XP 构建屏幕保护程序【英文标题】:Building a Screensaver for XP using VC++ 2008 【发布时间】:2009-05-06 00:23:17 【问题描述】:

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

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

我该如何解决这个问题?

【问题讨论】:

@james_block: 密切关注这个问题...这将对您有所帮助...***.com/questions/2300817/… 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

我希望避免仅为一个文件下载和安装整个旧 SDK,但除非有人能提出更好的选择,否则我可能不得不这样做。【参考方案3】:

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

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。

【讨论】:

以上是关于使用 VC++ 2008 为 XP 构建屏幕保护程序的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将 VS2008 配置为使用较旧的 VC++ 编译器进行构建?

若水软件论坛过游戏驱动保护视频教程

在 Windows 7 中构建的 VC++ 程序不能在 Windows Xp 上运行

在 VS 2008 中构建的 QT 应用程序在 XP 中不起作用

VC++2008 项目总是“过时”

从命令行将 vc++6 项目升级到 vc++ 2008