繁体   English   中英

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

[英]How to build a Winsock2 (WS2_32.lib) application targeting Windows XP with Visual Studio 2017

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

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

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

根据文档 ,对于WSAPoll ,支持的最低客户端是Windows 8.1,Windows Vista。 UWP应用]

不能用于以Windows XP为目标的应用程序。

您的应用程序(或其依赖项之一)是静态链接到WSAPoll() ,而WSAPoll()在XP中根本不存在,它是在Vista中引入的。 无论您的应用使用的是哪种代码,都使用WSAPoll()都必须为XP重写。 例如,通过使用GetProcAddress()动态而非静态地访问WSAPoll() ,并在WSAPoll()不可用时使用回退( select()WSAAsyncSelect()WSAEventSelect()等)。

实际上,应该重写代码-句号,因为WSAPoll()已损坏 ,甚至Microsoft都记录在案,称WSAPoll()将不固定且不应使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM