使用 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 上运行