アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

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

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

A 回答 (4件)

>オープンしたポートをPCから抜いたりしたのですが、


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

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

この回答への補足

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

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

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

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

補足日時:2008/09/04 11:08
    • good
    • 0

>GetCommStateなど


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

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

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

お礼日時:2008/09/04 11:11

CloseHandleを失敗させるにはハンドル以外のものを渡すとか。


与えるパラメータが適正だったらCloseHandleでエラーになることはないんじゃないかな。
普通はCloseHandleの返値なんてみないことの方が多いと思うけど。

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

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

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

お礼日時:2008/09/04 11:08

Windowsなどには成功可否しか返さない関数に対して、


GetLastErrorという拡張エラー値をとる関数が用意されています。
これで取得できたエラーコードはFormatMessage関数かnetコマンドで
メッセージを見ることができます。

GetLastErrorは直前の関数の拡張エラーを返すので、
呼び出し順序には注意が必要です。

この回答への補足

回答ありがとうございます。

GetLastError関数の存在は知っていました。
ご丁寧にありがとうございます。

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

補足日時:2008/09/02 15:43
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/09/04 11:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!