我有一个使用C ++编写的使用套接字(Winsock2.h)的应用程序。它是在Windows 10上开发的,并且可以在Windows 10上运行并运行良好。有一台旧XP计算机必须在其上运行该应用程序(由于该计算机包含的旧代码无法在较新的系统上运行,因此无法升级),但是当我尝试在其上运行该应用程序时,出现错误:“过程入口点WSAPoll不能位于动态链接库WS2_32.dll中”。
我尝试了以下操作:
我下载了适用于Visual Studio 2017的XP工具集(v141_xp)并在Windows 10上构建了该应用程序(我还下载了XP并安装了适用于Visual Studio 2017的Microsoft Visual C ++ Redistributable);
我尝试使用winsock.h并将应用程序链接到wsock32.lib:
是否有一种方法可以使用xp工具集在VS2017上构建使用针对Windows XP的Ws2_32.lib的应用程序?
编辑2019-05-03 10:30
正如程序员和Remy Lebeau所注意到的那样,WSAPoll在XP中不存在。关键是我不在代码中使用WSAPoll。因此,我遵循了《退休忍者》的建议,从零开始,使用WinSock2编写了一个应用程序,从非常基本的步骤开始,并逐步添加了功能(*)。好吧,我所有的代码都运行良好。关键是我还包括了另一个库libpqxx-可能使用了WSAPoll。
好的,我仍然有问题,但至少我知道它在哪里
(*)顺便说一句,我已经在使用WS2_32.lib的代码部分中尝试了相同的操作,但是由于问题出在另一个库中,我仍然遇到错误,因此从头开始的建议确实有帮助
答案 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()
不会被修复并且不应使用。