如何使用Visual Studio 2017构建面向Windows XP的Winsock2(WS2_32.lib)应用程序

时间:2019-05-02 15:31:32

标签: c++ visual-studio-2017 windows-xp winsock2

我有一个使用C ++编写的使用套接字(Winsock2.h)的应用程序。它是在Windows 10上开发的,并且可以在Windows 10上运行并运行良好。有一台旧XP计算机必须在其上运行该应用程序(由于该计算机包含的旧代码无法在较新的系统上运行,因此无法升级),但是当我尝试在其上运行该应用程序时,出现错误:“过程入口点WSAPoll不能位于动态链接库WS2_32.dll中”。

我尝试了以下操作:

  1. 我在XP机器上下载了Visual Studio Express 2010,并尝试在其上构建应用程序:
    • 该代码无法编译,因为它使用libpqxx库(我怀疑libpqxx使用了某些c ++ 11代码,VS2010并未完全支持该代码);
  2. 我下载了适用于Visual Studio 2017的XP工具集(v141_xp)并在Windows 10上构建了该应用程序(我还下载了XP并安装了适用于Visual Studio 2017的Microsoft Visual C ++ Redistributable);

    • 我遇到了同样的“过程入口点WSAPoll无法在动态链接库WS2_32.dll中定位”的错误。
  3. 我尝试使用winsock.h并将应用程序链接到wsock32.lib:

    • 我在WS2_32.lib上遇到了相同的入口点错误(即使我指定使用wsock32.liB,也可能是VS将应用程序链接到WS2_32.lib)。

是否有一种方法可以使用xp工具集在VS2017上构建使用针对Windows XP的Ws2_32.lib的应用程序?

编辑2019-05-03 10:30

正如程序员和Remy Lebeau所注意到的那样,WSAPoll在XP中不存在。关键是我不在代码中使用WSAPoll。因此,我遵循了《退休忍者》的建议,从零开始,使用WinSock2编写了一个应用程序,从非常基本的步骤开始,并逐步添加了功能(*)。好吧,我所有的代码都运行良好。关键是我还包括了另一个库libpqxx-可能使用了WSAPoll。

好的,我仍然有问题,但至少我知道它在哪里

(*)顺便说一句,我已经在使用WS2_32.lib的代码部分中尝试了相同的操作,但是由于问题出在另一个库中,我仍然遇到错误,因此从头开始的建议确实有帮助

2 个答案:

答案 0 :(得分:4)

根据docs,对于WSAPoll,支持的最低客户端为Windows 8.1,Windows Vista [桌面应用程序| UWP应用]

不能用于定位Windows XP的应用程序。

答案 1 :(得分:1)

您的应用程序(或它的依赖项之一)是静态链接到WSAPoll()的,它在XP中根本不存在,它是在Vista中引入的。无论您的应用使用的是使用WSAPoll()的任何代码,都必须为XP重写。例如,通过使用GetProcAddress()来动态访问WSAPoll()而不是静态访问select(),并在{{ 1}}不可用。

实际上,应该重写代码-句号,因为WSAPoll() is broken,甚至Microsoft都记录在案,称WSAAsyncSelect()不会被修复并且不应使用。