簡體   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