【VBA】【Excel(64bit)】WinSockのエラーコードの取得方法まとめ(WSAStartup時は戻り値、WSAStartup成功後はErr.LastDllErrorを使うこと、 VBAではWSAGetLastErrorは使えないぞ!)

C言語系のサンプルコードでは、Winsock関連のエラーコード(詳細)を取得する場合、Microsoftのドキュメント通り、WSAGetLastError()を使うコードが散開している。(一例)

これを真似て、VB(VBA)からwinsockを使ったコードを作成していたが、どうもエラー処理がうまく動かない。

インターネットで同じようなチャレンジをされている方のコードも参考にしたが、そちらもどうも動いていないように思える。

そこで、検証用のコードを作成し結果を取得してみた。

サンプルコード全量

WSAStartupの成功と失敗、WSAStartup成功後、socket作成の成功と失敗パターンを網羅している。

実行結果(WSAStartup成功の場合)

実行結果(WSAStartup失敗の場合:ありえないバージョン指定)

WSAStartupの戻り値で判断できることがわかる。

実行結果(socket作成成功の場合)

実行結果(socket作成失敗の場合)

Microsoftのドキュメントでは、WSAGetLastError()の利用を進めているが、VBAではErrオブジェクトの、Err.LastDllErrorを使う必要があることがよくわかった。これすごくハマってしまった。

参考リンク

Winsock send() function returns -1 but WSAGetLastError() is 0 (Excel VBA Macro) – Stack Overflow

API関数使用時のエラー情報を取得(VB6.0) – VBレスキュー(花ちゃん) (sakura.ne.jp)

どちらのサイトも、Err.LastDllErrorを利用することを示唆する内容が記載されてた。そういうことだったのか。。

最後に

ExcelのVBAがPythonに置き換わるかもといわれる中、すでに枯れ切ったVBA + 懐かしのWindowsAIP  加えてちょっとマニアックなWinsockというパターンで今更苦しむ人はいないもしれませんが、もしこれからチャレンジされる方、WSAGetLastError()にはどうぞお気をつけください。

コメント

タイトルとURLをコピーしました