在我的代码中,我有I / O完成端口的异步I / O,对于读/写完成回调,我得到一个HANDLE
(当然可以是一个套接字,文件句柄,命名管道等。)
因此,如果此例程出现问题,我想检查错误,但是如何知道它是否是“网络”HANDLE
(SOCKET
,所以我应该调用{{1} })或“非网络”WSAGetLastError()
(命名管道,文件等,所以我应该调用HANDLE
)?我正在使用一个简单的标志,但它的丑陋和不方便。
如果有人可以确认GetLastError()
只是WSAGetLastError()
的别名,我将只使用后者。
似乎如此:
http://us.generation-nt.com/wsagetlasterror-just-an-alias-getlasterror-help-28256642.html
但有人可以证实吗? MSDN在这个主题上并不是很清楚。
使用GetLastError()
代替GetLastError()
是否安全?我的意思是,如果WSAGetLastError()
甚至是Windows95的别名WSAGetLastError()
,因为Windows95就像有人声称的那样,我可以假设它对于下一个版本的Windows也是如此 - 但是我们不能写出好的代码假设:)
答案 0 :(得分:12)
如果您对ws2_32.dll进行逆向工程,它只是GetLastError的包装器,您会找到它。
答案 1 :(得分:9)
有两个类似功能的原因:http://blogs.msdn.com/b/oldnewthing/archive/2005/09/08/462402.aspx
为什么函数WSASetLastError在已经存在完美的函数SetLastError时存在?
实际上,如果你坐下来思考它,你也知道答案。
Winsock最初开发用于在16位Windows和32位Windows上运行。请注意经典Winsock函数是如何基于异步通知的窗口消息的。在16位世界中,没有SetLastError函数。因此,Winsock必须为16位实现提供自己的版本。由于源代码兼容性很重要,因此也有32位版本。当然,如果您不了解16位版本,那么32位版本在回顾过程中看起来有点愚蠢。