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

Visual Basic 6.0でWin32APIを用いてRS-232Cで通信するプログラムを作っています。
CreateFile()でポートを開き、ハンドル番号を得て、プログラム終了前にそのハンドルを指定してCloseHandle()シリアルポートをクローズします。

ところが、何らかの原因でそのハンドルのクローズを行わなかった場合(例えば、デバッグ中にプログラムを終了させる)、シリアルポートは開っぱなしのようで、再度プログラムを実行しようとするとCreateFile()でポートを開くことが出来ません。
この状態は、VB6を再起動しない限り続きます。

そこでお聞きしたいのですが、プログラム上で、現在シリアルポートを開いているハンドル番号を知る方法はあるのでしょうか?
開いたときにメモするのも煩わしいため、なんとかならないかと悩んでいます。

どうぞよろしくお願いします。

A 回答 (4件)

VB6.0でデバック実行している場合、VCやVB.netなどど違い、VB6.0のIDEプロセスの内部で実行されます。

そのため、質問のようにハンドルクローズを忘れたりすると、IDEがそのハンドル保持プロセスとなるため、ハンドルを無理やり指定してもう一度IDEで閉じさせるか、IDEそのものを落とすしか方法がなくなります。(正直ほとんどバグぢゃないのか?って気がしますが・・・)

対策方法は#2さんや#3さんが回答されている方法が現実的だと思います。

余談ですが・・・今VB6.0で作るのは正直オススメできないですね・・・Windows7ではデバックできないし・・・
    • good
    • 0

サブクラス化してやると安全にシリアルポートが閉じることはできそうですが。


※ただ本来の使用方法から考えると邪道な方法

過去には、サブクラス化する事でデバッグ時に正しく終了しないと、VBごと落ちるという問題がありました。
その問題へのプログラミング手法として対策が考えられて、
WM_NCDESTROY
メッセージは、VB-IDEから終了された場合でもデバッグ中のプログラムで受け取れる事が判った。
つまり、元々サブクラス化しているのでWM_NCDESTROYメッセージが受け取れる。
そのメッセージでサブクラス化を終了させれば、VB-IDEから終了された場合でも問題がないと。

応用すれば、VB-IDEから終了されてポートが開きっぱなしってのは防げます。

ま、もしかしたらステップ実行した場合、Endで終了した場合にVBごと落ちるような事は発生するかも知れません。
※私自身は経験がないですが。

開発上の都合の為だけにサブクラス化、邪道かも知れませんが場合によっては便利です。
    • good
    • 0

No1 の回答と同意ですが、


Open 時に Debug.Print
で出力しておけばいいだけではないでしょうか
    • good
    • 0

何をしたいのか良くわかりませんが


強制的にハンドル番号だけを合わせてクローズ関数だけ
呼んでもしても多分閉じないんじゃないかと思いますが
(あくまで予想やったことなし)

ためしでやるのであればオープンで取得したハンドル番号を
どこかのファイルに書き出す(簡単なのはINIファイル)
等すれば可能でしょう

この回答への補足

回答ありがとうございます。
> 強制的にハンドル番号だけを合わせてクローズ関数だけ
> 呼んでもしても多分閉じないんじゃないかと思いますが

ハンドル番号をメモしておいて、後からCloseHandle()を呼び出せば、ポートは閉じるのは確認しました。

MSCommを使ってプログラムを開発していたときは、VBのIDEに制御が戻ればポートは勝手に閉じていたのですが、Win32APIを使うと、ポートを閉じずにIDEに制御が戻ったとき、ポートが開っぱなしになり、VisualBasicを一旦終了しない限りそれが続くんです。

もしかして、コンパイルして実行形式になったプログラムでは発生しない問題なのかもしれません。
普通、あるプログラムが開いたハンドルは、そのプログラムで閉じずに終了してもOSが閉じますよね?

補足日時:2010/04/08 14:33
    • good
    • 0

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