2013-03-23 3 views
8

私のコードでは、I/O完了ポートを持つ非同期I/Oを持っています。読み書きのためにコールバックは コールバック、私はハンドルを取得します(もちろんソケット、ファイルハンドル、名前付きパイプなどがあります)。 )。 そのようなルーチンで何か問題があった場合は、エラーをチェックしたいが、その "ネットワーク"ハンドル(ソケット、WSAGetLastError()を呼び出す必要がある)かどうかを知る方法または "非ネットワーク"ハンドル[パイプ、ファイルなど、私はGetLastError()を呼び出す必要がありますか?私はそれのために単純なフラグを使用していますが、その醜い、不自然な。 WSAGetLastError()が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ではあまり明確ではありません。

WSAGetLastError()の代わりにGetLastError()を使用しても安全ですか? WSAGetLastError()がWindows95以降、GetLastError()のエイリアスであっても、次のバージョンのWindowsではそれが当てはまると思うかもしれませんが、私は良いコードを書くことはできません:)

答えて

9

ws2_32.dllをリバースエンジニアリングするとGetLastErrorのラッパーにすぎません。見つけられます。 2つの類似の機能を有する背後

+0

ええ、私はそれを見ましたが、WSAGetLastError()ではなくGetLastError()を使用しますか?私は彼らがこれらの2つの機能を分離するとは思わない。 –

+1

特定のWinsockエラーのためにWSAGetLastErrorが安全に使用されていると思う。しかし、これは私の意見です。 – Xearinox

+1

ドキュメントが示唆している機能を使用する方がクリーンですが、この特定のケースでは、これらの2つの機能が別々の機能に分割される可能性は非常に低いです。 –

5

理由:完璧な機能SetLastErrorがすでに存在するときhttp://blogs.msdn.com/b/oldnewthing/archive/2005/09/08/462402.aspx

なぜ関数WSASetLastErrorは存在しませんか?

実際には、座って考えてみると、答えが分かります。

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

関連する問題