• ベストアンサー

CloseHandleのエラーについて

現在、VC++6.0、winXP SP2でRS232Cを使った通信プログラムを作っています。 プログラム自体はできたのですが、異常系のテストをしようとして困っています。 CloseHandle()で、COMポートを閉じるのに失敗した場合、ポートの状態がどうなるのかを知りたいのですが、私が探した限り、ネットには失敗例が載って折らず、困っています。 ご存知の方がいらっしゃいましたら、ご教授願います。

質問者が選んだベストアンサー

  • ベストアンサー
  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.3

>オープンしたポートをPCから抜いたりしたのですが、 >普通にクローズしてしまったので COMはあんまりやったことありませんが、 それは、ポートが物理的にいきなり抜かれたからといって、 Windows上で動作していているプログラムが開いているハンドルが いきなり無効になるわけではないからでしょう。 普通は開いているハンドルを元に、GetCommStateとかで 状態を確認してから、クローズとかをする必要がある気がします。 ステータス取得失敗の理由も恐らく、GetLastErrorなどで取れる 気がしますし。。。

hiro-0130
質問者

補足

> それは、ポートが物理的にいきなり抜かれたからといって、 > Windows上で動作していているプログラムが開いているハンドルが > いきなり無効になるわけではないからでしょう。 そうなんですね! 物理的に無効になれば失敗すると思っていました。 まだまだ勉強不足ですみません。 > 普通は開いているハンドルを元に、GetCommStateとかで > 状態を確認してから、クローズとかをする必要がある気がします。 この処理も行っていませんでした。 参考になりました。ありがとうございます!

その他の回答 (3)

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.4

>GetCommStateなど と書きましたが、 やるなら、別スレッドなどを起こして、 WaitCommEventなどでエラーを監視するのが一番よさそうです。 #回線のエラー状態まで調べられるみたいですし。

hiro-0130
質問者

お礼

色々と詳しくご丁寧な回答をありがとうございました。 スレッドなど、色々試してみたいと思います。

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.2

CloseHandleを失敗させるにはハンドル以外のものを渡すとか。 与えるパラメータが適正だったらCloseHandleでエラーになることはないんじゃないかな。 普通はCloseHandleの返値なんてみないことの方が多いと思うけど。 あとCOMポートを閉じるのに失敗というのは良く知らないけど、オープン時に占有するなら他でオープンしようとしてもできないとか、そういう状態になるんじゃないかと思う。 これを引き起こすなら手っ取り早いのはCloseHandleを呼ばないことだね。 デバッガを使ってCloseHandleを呼び出す手前でハンドルをNULLにしたら?

hiro-0130
質問者

お礼

普通はCloseHandleの返り値は見ないんですね。 初めて知りました。 でも、もう少し勉強してみようと思います。 丁寧なご回答、ありがとうございました。

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.1

Windowsなどには成功可否しか返さない関数に対して、 GetLastErrorという拡張エラー値をとる関数が用意されています。 これで取得できたエラーコードはFormatMessage関数かnetコマンドで メッセージを見ることができます。 GetLastErrorは直前の関数の拡張エラーを返すので、 呼び出し順序には注意が必要です。

hiro-0130
質問者

お礼

丁寧なご回答、ありがとうございました。

hiro-0130
質問者

補足

回答ありがとうございます。 GetLastError関数の存在は知っていました。 ご丁寧にありがとうございます。 ただ、私が知りたいのはそれではなく、どうやったらポートを閉じるのを失敗させることができるかなんです。 今のところ、オープンしたポートをPCから抜いたりしたのですが、普通にクローズしてしまったので・・・ 説明不足ですみません。

関連するQ&A