Visual Basic 6.0でWin32APIを用いてRS-232Cで通信するプログラムを作っています。
CreateFile()でポートを開き、ハンドル番号を得て、プログラム終了前にそのハンドルを指定してCloseHandle()シリアルポートをクローズします。
ところが、何らかの原因でそのハンドルのクローズを行わなかった場合(例えば、デバッグ中にプログラムを終了させる)、シリアルポートは開っぱなしのようで、再度プログラムを実行しようとするとCreateFile()でポートを開くことが出来ません。
この状態は、VB6を再起動しない限り続きます。
そこでお聞きしたいのですが、プログラム上で、現在シリアルポートを開いているハンドル番号を知る方法はあるのでしょうか?
開いたときにメモするのも煩わしいため、なんとかならないかと悩んでいます。
どうぞよろしくお願いします。
No.4ベストアンサー
- 回答日時:
VB6.0でデバック実行している場合、VCやVB.netなどど違い、VB6.0のIDEプロセスの内部で実行されます。
そのため、質問のようにハンドルクローズを忘れたりすると、IDEがそのハンドル保持プロセスとなるため、ハンドルを無理やり指定してもう一度IDEで閉じさせるか、IDEそのものを落とすしか方法がなくなります。(正直ほとんどバグぢゃないのか?って気がしますが・・・)対策方法は#2さんや#3さんが回答されている方法が現実的だと思います。
余談ですが・・・今VB6.0で作るのは正直オススメできないですね・・・Windows7ではデバックできないし・・・
No.3
- 回答日時:
サブクラス化してやると安全にシリアルポートが閉じることはできそうですが。
※ただ本来の使用方法から考えると邪道な方法
過去には、サブクラス化する事でデバッグ時に正しく終了しないと、VBごと落ちるという問題がありました。
その問題へのプログラミング手法として対策が考えられて、
WM_NCDESTROY
メッセージは、VB-IDEから終了された場合でもデバッグ中のプログラムで受け取れる事が判った。
つまり、元々サブクラス化しているのでWM_NCDESTROYメッセージが受け取れる。
そのメッセージでサブクラス化を終了させれば、VB-IDEから終了された場合でも問題がないと。
応用すれば、VB-IDEから終了されてポートが開きっぱなしってのは防げます。
ま、もしかしたらステップ実行した場合、Endで終了した場合にVBごと落ちるような事は発生するかも知れません。
※私自身は経験がないですが。
開発上の都合の為だけにサブクラス化、邪道かも知れませんが場合によっては便利です。
No.1
- 回答日時:
何をしたいのか良くわかりませんが
強制的にハンドル番号だけを合わせてクローズ関数だけ
呼んでもしても多分閉じないんじゃないかと思いますが
(あくまで予想やったことなし)
ためしでやるのであればオープンで取得したハンドル番号を
どこかのファイルに書き出す(簡単なのはINIファイル)
等すれば可能でしょう
この回答への補足
回答ありがとうございます。
> 強制的にハンドル番号だけを合わせてクローズ関数だけ
> 呼んでもしても多分閉じないんじゃないかと思いますが
ハンドル番号をメモしておいて、後からCloseHandle()を呼び出せば、ポートは閉じるのは確認しました。
MSCommを使ってプログラムを開発していたときは、VBのIDEに制御が戻ればポートは勝手に閉じていたのですが、Win32APIを使うと、ポートを閉じずにIDEに制御が戻ったとき、ポートが開っぱなしになり、VisualBasicを一旦終了しない限りそれが続くんです。
もしかして、コンパイルして実行形式になったプログラムでは発生しない問題なのかもしれません。
普通、あるプログラムが開いたハンドルは、そのプログラムで閉じずに終了してもOSが閉じますよね?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- その他(プログラミング・Web制作) プログラムの起動、利用について、使用期間を設定する方法 3 2023/08/06 21:03
- Windows 10 windows11 update の「更新の再開」について初歩的な質問なのですが 1 2022/10/19 00:57
- Excel(エクセル) パイパーリンク 1 2022/09/04 16:13
- その他(プログラミング・Web制作) マウスオーバー→ホイール回転でスクロールできない 2 2022/10/31 10:06
- Windows 7 Media Playerが開かない。ファイルアイコンを右クリックしても「プロパティ」が表示されない。 2 2023/02/05 14:45
- Visual Basic(VBA) フレームワーク「4.8.1」で、[Sub Main]が動かない。助けて下さい 3 2022/11/14 15:40
- Windows 10 Visual StudioとVisual C++ Build Toolsについて 1 2023/04/16 03:42
- ノートパソコン Windows 10 動作改善方法 6 2023/04/26 22:30
- ダイヤルアップ Raspberry Piでアナログモデム経由で音声再生 1 2022/05/20 18:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Macターミナルで実行中のプログ...
-
プログラミング ソースコード
-
VB上で実行中の無限ループの止め方
-
終了してもプログラムが実行し...
-
JavaScriptでレースゲームを作...
-
プリントスクリーンをプログラ...
-
バックグラウンドからフォアグ...
-
SNMPマネージャAPIでメモリリー...
-
なんかC言語でプログラム書いて...
-
C言語でプログラムを再起動
-
C言語で途中までしか、プログラ...
-
MACで動く実行ファイルをWindow...
-
アクセス[ファイルを開かずに、...
-
VB6とExitProcess
-
他のPC上にあるexeを、そのP...
-
VB.NETでVSSからのソース取得と...
-
コマンドプロンプト プログラム...
-
clock関数は正確じゃないの?
-
UNIX・・実行できないのはなぜ?
-
並列計算をしたときのシステム...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Macターミナルで実行中のプログ...
-
MACで動く実行ファイルをWindow...
-
sendkeysにてALT+CTRL+INSERTを...
-
他のPC上にあるexeを、そのP...
-
VB上で実行中の無限ループの止め方
-
system関数を使用してsuコマン...
-
VBAで外部プログラムを非表示で...
-
実行時エラー429
-
プロセス間通信について
-
並列計算をしたときのシステム...
-
終了してもプログラムが実行し...
-
システム資源とは?
-
C言語で途中までしか、プログラ...
-
PIC のデータEEPROMに書き込み...
-
RPG パラメーターについて
-
Windows10でDOSゲーム
-
ラズパイ プログラム 自動起動 ...
-
プログラムを走らせる
-
C言語でフォルダを開く
-
アクセス[ファイルを開かずに、...
おすすめ情報