解決済みの質問
現在、VC++6.0、winXP SP2でRS232Cを使った通信プログラムを作っています。
プログラム自体はできたのですが、異常系のテストをしようとして困っています。
CloseHandle()で、COMポートを閉じるのに失敗した場合、ポートの状態がどうなるのかを知りたいのですが、私が探した限り、ネットには失敗例が載って折らず、困っています。
ご存知の方がいらっしゃいましたら、ご教授願います。
投稿日時 - 2008-09-02 14:43:08
>オープンしたポートをPCから抜いたりしたのですが、
>普通にクローズしてしまったので
COMはあんまりやったことありませんが、
それは、ポートが物理的にいきなり抜かれたからといって、
Windows上で動作していているプログラムが開いているハンドルが
いきなり無効になるわけではないからでしょう。
普通は開いているハンドルを元に、GetCommStateとかで
状態を確認してから、クローズとかをする必要がある気がします。
ステータス取得失敗の理由も恐らく、GetLastErrorなどで取れる
気がしますし。。。
投稿日時 - 2008-09-03 14:47:39
補足
> それは、ポートが物理的にいきなり抜かれたからといって、
> Windows上で動作していているプログラムが開いているハンドルが
> いきなり無効になるわけではないからでしょう。
そうなんですね!
物理的に無効になれば失敗すると思っていました。
まだまだ勉強不足ですみません。
> 普通は開いているハンドルを元に、GetCommStateとかで
> 状態を確認してから、クローズとかをする必要がある気がします。
この処理も行っていませんでした。
参考になりました。ありがとうございます!
投稿日時 - 2008-09-04 11:08:47
2人が「このQ&Aが役に立った」と投票しています
ベストアンサー以外の回答(3件中 1~3件目)
CloseHandleを失敗させるにはハンドル以外のものを渡すとか。
与えるパラメータが適正だったらCloseHandleでエラーになることはないんじゃないかな。
普通はCloseHandleの返値なんてみないことの方が多いと思うけど。
あとCOMポートを閉じるのに失敗というのは良く知らないけど、オープン時に占有するなら他でオープンしようとしてもできないとか、そういう状態になるんじゃないかと思う。
これを引き起こすなら手っ取り早いのはCloseHandleを呼ばないことだね。
デバッガを使ってCloseHandleを呼び出す手前でハンドルをNULLにしたら?
投稿日時 - 2008-09-02 21:58:25
お礼
普通はCloseHandleの返り値は見ないんですね。
初めて知りました。
でも、もう少し勉強してみようと思います。
丁寧なご回答、ありがとうございました。
投稿日時 - 2008-09-04 11:08:01
Windowsなどには成功可否しか返さない関数に対して、
GetLastErrorという拡張エラー値をとる関数が用意されています。
これで取得できたエラーコードはFormatMessage関数かnetコマンドで
メッセージを見ることができます。
GetLastErrorは直前の関数の拡張エラーを返すので、
呼び出し順序には注意が必要です。
投稿日時 - 2008-09-02 15:33:22
補足
回答ありがとうございます。
GetLastError関数の存在は知っていました。
ご丁寧にありがとうございます。
ただ、私が知りたいのはそれではなく、どうやったらポートを閉じるのを失敗させることができるかなんです。
今のところ、オープンしたポートをPCから抜いたりしたのですが、普通にクローズしてしまったので・・・
説明不足ですみません。
投稿日時 - 2008-09-02 15:43:27
お礼
丁寧なご回答、ありがとうございました。
投稿日時 - 2008-09-04 11:07:06
OKWaveのオススメ
おすすめリンク