CloseHandleのエラーについて

解決済みの質問

CloseHandleのエラーについて

現在、VC++6.0、winXP SP2でRS232Cを使った通信プログラムを作っています。
プログラム自体はできたのですが、異常系のテストをしようとして困っています。

CloseHandle()で、COMポートを閉じるのに失敗した場合、ポートの状態がどうなるのかを知りたいのですが、私が探した限り、ネットには失敗例が載って折らず、困っています。

ご存知の方がいらっしゃいましたら、ご教授願います。

投稿日時 - 2008-09-02 14:43:08

連想キーワード:

QNo.4297934

困ってます

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

>オープンしたポートをPCから抜いたりしたのですが、
>普通にクローズしてしまったので
COMはあんまりやったことありませんが、
それは、ポートが物理的にいきなり抜かれたからといって、
Windows上で動作していているプログラムが開いているハンドルが
いきなり無効になるわけではないからでしょう。

普通は開いているハンドルを元に、GetCommStateとかで
状態を確認してから、クローズとかをする必要がある気がします。
ステータス取得失敗の理由も恐らく、GetLastErrorなどで取れる
気がしますし。。。

投稿日時 - 2008-09-03 14:47:39

補足

> それは、ポートが物理的にいきなり抜かれたからといって、
> Windows上で動作していているプログラムが開いているハンドルが
> いきなり無効になるわけではないからでしょう。

そうなんですね!
物理的に無効になれば失敗すると思っていました。
まだまだ勉強不足ですみません。

> 普通は開いているハンドルを元に、GetCommStateとかで
> 状態を確認してから、クローズとかをする必要がある気がします。

この処理も行っていませんでした。
参考になりました。ありがとうございます!

投稿日時 - 2008-09-04 11:08:47

ANo.3

2人が「このQ&Aが役に立った」と投票しています

[  前へ  |  次へ ]

ベストアンサー以外の回答(3件中 1~3件目)

ANo.4

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

投稿日時 - 2008-09-03 14:53:54

お礼

色々と詳しくご丁寧な回答をありがとうございました。

スレッドなど、色々試してみたいと思います。

投稿日時 - 2008-09-04 11:11:28

ANo.2

CloseHandleを失敗させるにはハンドル以外のものを渡すとか。
与えるパラメータが適正だったらCloseHandleでエラーになることはないんじゃないかな。
普通はCloseHandleの返値なんてみないことの方が多いと思うけど。

あとCOMポートを閉じるのに失敗というのは良く知らないけど、オープン時に占有するなら他でオープンしようとしてもできないとか、そういう状態になるんじゃないかと思う。
これを引き起こすなら手っ取り早いのはCloseHandleを呼ばないことだね。
デバッガを使ってCloseHandleを呼び出す手前でハンドルをNULLにしたら?

投稿日時 - 2008-09-02 21:58:25

お礼

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

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

投稿日時 - 2008-09-04 11:08:01

ANo.1

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

あわせてチェックしたい
  • RS232Cポート ...
  • VC++でRS232C(COMポート通信) ...
  • VC++.NETを使用したRS232c通信プログラム ...
PR

OKWaveのオススメ

教えて弁護士さん!

お金の悩みQ&A特集はこちら