[英]Winsock2.h vs winsock2.h and wsock32.lib vs 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中”。
我嘗試了以下方法:
我下載了適用於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所注意到的那樣,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.