- ベストアンサー
Visual Basic 6.0でWin32APIを用いてRS-232Cで通信するプログラムのハンドル番号の取得方法
- Visual Basic 6.0でWin32APIを用いてRS-232Cで通信するプログラムのハンドル番号を知る方法について紹介します。
- シリアルポートを開いた状態でプログラムを終了してしまった場合、ポートが開いたままとなり、再度プログラムを実行することができません。
- しかし、プログラム上で現在シリアルポートを開いているハンドル番号を知る方法があります。この方法を利用することで、手動でハンドル番号をメモする必要がなくなります。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
VB6.0でデバック実行している場合、VCやVB.netなどど違い、VB6.0のIDEプロセスの内部で実行されます。そのため、質問のようにハンドルクローズを忘れたりすると、IDEがそのハンドル保持プロセスとなるため、ハンドルを無理やり指定してもう一度IDEで閉じさせるか、IDEそのものを落とすしか方法がなくなります。(正直ほとんどバグぢゃないのか?って気がしますが・・・) 対策方法は#2さんや#3さんが回答されている方法が現実的だと思います。 余談ですが・・・今VB6.0で作るのは正直オススメできないですね・・・Windows7ではデバックできないし・・・
その他の回答 (3)
- BellBell
- ベストアンサー率54% (327/598)
サブクラス化してやると安全にシリアルポートが閉じることはできそうですが。 ※ただ本来の使用方法から考えると邪道な方法 過去には、サブクラス化する事でデバッグ時に正しく終了しないと、VBごと落ちるという問題がありました。 その問題へのプログラミング手法として対策が考えられて、 WM_NCDESTROY メッセージは、VB-IDEから終了された場合でもデバッグ中のプログラムで受け取れる事が判った。 つまり、元々サブクラス化しているのでWM_NCDESTROYメッセージが受け取れる。 そのメッセージでサブクラス化を終了させれば、VB-IDEから終了された場合でも問題がないと。 応用すれば、VB-IDEから終了されてポートが開きっぱなしってのは防げます。 ま、もしかしたらステップ実行した場合、Endで終了した場合にVBごと落ちるような事は発生するかも知れません。 ※私自身は経験がないですが。 開発上の都合の為だけにサブクラス化、邪道かも知れませんが場合によっては便利です。
- nak777r
- ベストアンサー率36% (49/136)
No1 の回答と同意ですが、 Open 時に Debug.Print で出力しておけばいいだけではないでしょうか
- koi1234
- ベストアンサー率53% (1866/3459)
何をしたいのか良くわかりませんが 強制的にハンドル番号だけを合わせてクローズ関数だけ 呼んでもしても多分閉じないんじゃないかと思いますが (あくまで予想やったことなし) ためしでやるのであればオープンで取得したハンドル番号を どこかのファイルに書き出す(簡単なのはINIファイル) 等すれば可能でしょう
補足
回答ありがとうございます。 > 強制的にハンドル番号だけを合わせてクローズ関数だけ > 呼んでもしても多分閉じないんじゃないかと思いますが ハンドル番号をメモしておいて、後からCloseHandle()を呼び出せば、ポートは閉じるのは確認しました。 MSCommを使ってプログラムを開発していたときは、VBのIDEに制御が戻ればポートは勝手に閉じていたのですが、Win32APIを使うと、ポートを閉じずにIDEに制御が戻ったとき、ポートが開っぱなしになり、VisualBasicを一旦終了しない限りそれが続くんです。 もしかして、コンパイルして実行形式になったプログラムでは発生しない問題なのかもしれません。 普通、あるプログラムが開いたハンドルは、そのプログラムで閉じずに終了してもOSが閉じますよね?