Как создать приложение Winsock2 (WS2_32.lib) для Windows XP с Visual Studio 2017 - PullRequest
0 голосов
/ 02 мая 2019

У меня есть приложение, написанное на C ++, которое использует сокет (Winsock2.h). Он был разработан для Windows 10, и он прекрасно работает и работает в Windows 10. Существует старая машина XP, на которой должно работать это приложение (машина не может быть обновлена, так как содержит устаревший код, который не работает в более новых системах), но когда я пытаюсь запустить приложение на нем, я получаю сообщение об ошибке: «Не удалось найти точку входа в процедуру WSAPoll в библиотеке динамических ссылок WS2_32.dll».

Я попробовал следующее:

  1. Я скачал Visual Studio Express 2010 на компьютере с XP и попытался построить приложение на нем:
    • Код не компилируется, потому что он использует библиотеку libpqxx (я подозреваю, что libpqxx использует некоторый код c ++ 11, который не полностью поддерживается VS2010);
  2. Я загрузил набор инструментов XP (v141_xp) для Visual Studio 2017 и построил приложение для Windows 10 (я также скачал и установил в XP распространяемый Microsoft Visual C ++ для Visual Studio 2017);

    • Я получил ту же ошибку «Не удалось найти точку входа процедуры WSAPoll в библиотеке динамических ссылок WS2_32.dll».
  3. Я попытался использовать winsock.h и связать приложение с wsock32.lib:

    • Я получил ту же ошибку точки входа на WS2_32.lib (вероятно, VS связывает приложение с WS2_32.lib, даже если я указал использовать wsock32.liB).

Есть ли способ построить на VS2017 с помощью набора инструментов xp приложение, которое использует Ws2_32.lib для XP?

РЕДАКТИРОВАТЬ 2019-05-03 10: 30

Как заметил cprogrammer и Реми Лебо, WSAPoll не существует в XP. Дело в том, что я не использую WSAPoll в своем коде. Поэтому я последовал предложению «Отставной ниндзя» и написал с нуля приложение, использующее WinSock2, начиная с самых простых и добавляя функции шаг за шагом (*). Ну, весь мой код работал хорошо. Дело в том, что я включил еще одну библиотеку - libpqxx - и, вероятно, она использует WSAPoll.

Хорошо, у меня все еще есть проблема, но, по крайней мере, я знаю, где она

(*) Кстати, я уже пробовал то же самое в той части кода, в которой используется WS2_32.lib, но, поскольку проблема была в другой библиотеке, я все еще получил ошибку, поэтому предложение начать с нуля действительно помогло .

Ответы [ 2 ]

4 голосов
/ 02 мая 2019

В соответствии с документами , для WSAPoll минимальный поддерживаемый клиент - Windows 8.1, Windows Vista [настольные приложения |Приложения UWP]

Не может использоваться для приложений, ориентированных на Windows XP.

1 голос
/ 02 мая 2019

Ваше приложение (или одна из его зависимостей) имеет статическую связь с WSAPoll(), которого просто нет в XP, оно было представлено в Vista. Независимо от того, какой код вашего приложения использует WSAPoll(), его придется переписать для XP. Например, используя GetProcAddress() для динамического доступа к WSAPoll() вместо статического, и используя запасной вариант (select(), WSAAsyncSelect(), WSAEventSelect() и т. Д.), Когда WSAPoll() недоступен.

На самом деле, код должен быть переписан - точка, так как WSAPoll() не работает , и даже Microsoft официально заявляет, что WSAPoll() не будет исправлено и не должно использоваться.

...