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

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

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

我该如何解决这个问题?

【问题讨论】:

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


【解决方案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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      相关资源
      最近更新 更多