11

私のコードでは、I/O完了ポートを備えた非同期I/Oがあり、読み取り/書き込み完了コールバックの場合、HANDLE(もちろん、ソケット、ファイルハンドル、名前付きパイプなど)を取得します。

したがって、そのようなルーチンで何かが間違っている場合は、エラーを確認したいのですが、それが「ネットワーク」HANDLE(aSOCKETなので、呼び出す必要がありますWSAGetLastError())か「非ネットワーク」HANDLE(名前付きパイプ、ファイルなど)かどうかを確認する方法は、だから私は)を呼び出す必要がありますGetLastError()か?そのために単純なフラグを使用していますが、その醜くて不便です。

誰かがそれWSAGetLastError()が単なるエイリアスであることを確認できればGetLastError()、私は後者のみを使用します。

そのようです:

http://www.tech-archive.net/Archive/Development/microsoft.public.win32.programmer.networks/2007-08/msg00034.html

http://us.generation-nt.com/wsagetlasterror-just-an-alias-getlasterror-help-28256642.html

しかし、誰かがそれを確認できますか?MSDNは、このトピックについてあまり明確ではありません。

GetLastError()そして、代わりに使用しても安全でしょうWSAGetLastError()か?WSAGetLastError()つまり、誰かが主張しているように、Windows95以降のエイリアスでさえあれば、GetLastError()それは次のバージョンのWindowsにも当てはまると思いますが、想定する上で適切なコードを書くことはできません:)

4

2 に答える 2

13

ws2_32.dllをリバースエンジニアリングすると、GetLastErrorの単なるラッパーになります。

于 2013-03-23T11:46:45.543 に答える
9

2つの同様の機能を持つ理由:http://blogs.msdn.com/b/oldnewthing/archive/2005/09/08/462402.aspx

完全に適切な関数SetLastErrorがすでに存在するのに、なぜ関数WSASetLastErrorが存在するのですか?

実際、座って考えれば、あなたも答えを知っています。

Winsockは元々、16ビットWindowsと32ビットWindowsの両方で実行するために開発されました。従来のWinsock関数が非同期通知のウィンドウメッセージに基づいていることに注目してください。16ビットの世界では、SetLastError関数はありませんでした。したがって、Winsockは16ビット実装用に独自のバージョンを提供する必要がありました。また、ソースコードの互換性が重要であるため、32ビットバージョンもありました。もちろん、16ビットバージョンを知らない場合、32ビットバージョンは振り返ってみるとちょっとばかげているように見えます。

于 2014-02-20T10:42:29.167 に答える