- ベストアンサー
CloseHandleのエラーについて
現在、VC++6.0、winXP SP2でRS232Cを使った通信プログラムを作っています。 プログラム自体はできたのですが、異常系のテストをしようとして困っています。 CloseHandle()で、COMポートを閉じるのに失敗した場合、ポートの状態がどうなるのかを知りたいのですが、私が探した限り、ネットには失敗例が載って折らず、困っています。 ご存知の方がいらっしゃいましたら、ご教授願います。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>オープンしたポートをPCから抜いたりしたのですが、 >普通にクローズしてしまったので COMはあんまりやったことありませんが、 それは、ポートが物理的にいきなり抜かれたからといって、 Windows上で動作していているプログラムが開いているハンドルが いきなり無効になるわけではないからでしょう。 普通は開いているハンドルを元に、GetCommStateとかで 状態を確認してから、クローズとかをする必要がある気がします。 ステータス取得失敗の理由も恐らく、GetLastErrorなどで取れる 気がしますし。。。
その他の回答 (3)
- aris-wiz
- ベストアンサー率38% (96/252)
>GetCommStateなど と書きましたが、 やるなら、別スレッドなどを起こして、 WaitCommEventなどでエラーを監視するのが一番よさそうです。 #回線のエラー状態まで調べられるみたいですし。
お礼
色々と詳しくご丁寧な回答をありがとうございました。 スレッドなど、色々試してみたいと思います。
- rinkun
- ベストアンサー率44% (706/1571)
CloseHandleを失敗させるにはハンドル以外のものを渡すとか。 与えるパラメータが適正だったらCloseHandleでエラーになることはないんじゃないかな。 普通はCloseHandleの返値なんてみないことの方が多いと思うけど。 あとCOMポートを閉じるのに失敗というのは良く知らないけど、オープン時に占有するなら他でオープンしようとしてもできないとか、そういう状態になるんじゃないかと思う。 これを引き起こすなら手っ取り早いのはCloseHandleを呼ばないことだね。 デバッガを使ってCloseHandleを呼び出す手前でハンドルをNULLにしたら?
お礼
普通はCloseHandleの返り値は見ないんですね。 初めて知りました。 でも、もう少し勉強してみようと思います。 丁寧なご回答、ありがとうございました。
- aris-wiz
- ベストアンサー率38% (96/252)
Windowsなどには成功可否しか返さない関数に対して、 GetLastErrorという拡張エラー値をとる関数が用意されています。 これで取得できたエラーコードはFormatMessage関数かnetコマンドで メッセージを見ることができます。 GetLastErrorは直前の関数の拡張エラーを返すので、 呼び出し順序には注意が必要です。
お礼
丁寧なご回答、ありがとうございました。
補足
回答ありがとうございます。 GetLastError関数の存在は知っていました。 ご丁寧にありがとうございます。 ただ、私が知りたいのはそれではなく、どうやったらポートを閉じるのを失敗させることができるかなんです。 今のところ、オープンしたポートをPCから抜いたりしたのですが、普通にクローズしてしまったので・・・ 説明不足ですみません。
補足
> それは、ポートが物理的にいきなり抜かれたからといって、 > Windows上で動作していているプログラムが開いているハンドルが > いきなり無効になるわけではないからでしょう。 そうなんですね! 物理的に無効になれば失敗すると思っていました。 まだまだ勉強不足ですみません。 > 普通は開いているハンドルを元に、GetCommStateとかで > 状態を確認してから、クローズとかをする必要がある気がします。 この処理も行っていませんでした。 参考になりました。ありがとうございます!