- - PR -
VBで2重起動防止について
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-05-31 19:22
現在、VB6で2重起動しているかどうかを調べるアプリケーションを作成しています。OpenProcessで起動したnotepadや他のアプリケーションのプロセスハンドルを取得して、それをGetExitCodeProcessで終了しているかどうかを調べるようにしています。
現在困っているのは、notepadなどを起動させてプロセスハンドルを取得して、その値を保持しておいて、作成した2重起動プログラムでそのプロセスハンドルの起動確認をすると、起動しているのに、「終了ステータス」が返ってきたりしています。openprocessを呼んでいるプログラムと2重起動を確認するプログラムが全く別なのですが、これが問題なのでしょうか。プロセスハンドルの用い方がよくわかっていないのですが、OpenProcessを呼び出したプログラム内でしかGetExitCodeProcessを用いてアプリケーションの起動確認はできないのでしょうか。 例えば、プロセスハンドルの値をプログラム中で表示させて、別のプログラムを走らせてそのプロセスハンドルを用いてアプリケーションが起動中かどうかの判定は可能なのでしょうか? どなた様か、お分かりの方がいらっしゃいましたら、ご教示願います。 | ||||||||
|
投稿日時: 2005-06-01 07:11
そのとおり。
CreateProcessでハンドルを継承させれば可能ですけど。 プロセスが起動しているか否かを知りたいだけなら、EnumProcessesでプロセスを列挙し、GetModuleFileNameで実行ファイル名を確認するのでは駄目なのですか? | ||||||||
|
投稿日時: 2005-06-01 11:34
返答ありがとうございます。
下記の方法をためしていて、少々不明な点が発生したので、ご教授願いますでしょうか。 >GetModuleFileNameで実行ファイル名を確認するのでは駄目なのですか? タスクマネージャーでプロセスの一覧を表示させたときに、実行しているEXE名は表示されているのに、PIDが表示されていない場合があります。 例 イメージ名 PID A.exe 1234 B.exe C.exe 実際に起動させたB.exeを終了させると、A,B,Cの3つのexe`がすべて消えてしまいます。 こういった場合、実際はB.exeの名前を取得したいのにA.exe以外GetModuleFileNameでは取得できません。PIDが表示されないexe名を取得する方法はあるのでしょうか。 | ||||||||
|
投稿日時: 2005-06-07 22:26
現在、CreateProcessでハンドルを継承することによって、GetExitCodeProcessで起動確認を行おうとしているのですが、継承するためにはCreateProcessの引数をどのように設定すればよいのかが、わかりません。
たぶん、下記のセキュリティ記述子、ハンドルの継承オプション部分を設定するのだろうとは思うのですが、これらを「TRUE」にするだけでは、うまくいきません。 BOOL CreateProcess( LPCTSTR lpApplicationName, // 実行可能モジュールの名前 LPTSTR lpCommandLine, // コマンドラインの文字列 LPSECURITY_ATTRIBUTES lpProcessAttributes, // セキュリティ記述子 LPSECURITY_ATTRIBUTES lpThreadAttributes, // セキュリティ記述子 BOOL bInheritHandles, // ハンドルの継承オプション DWORD dwCreationFlags, // 作成のフラグ LPVOID lpEnvironment, // 新しい環境ブロック LPCTSTR lpCurrentDirectory, // カレントディレクトリの名前 LPSTARTUPINFO lpStartupInfo, // スタートアップ情報 LPPROCESS_INFORMATION lpProcessInformation // プロセス情報 ); どなた様かご存知の方がいらっしゃいましたら、是非ご教授願います。 | ||||||||
|
投稿日時: 2005-06-07 22:44
SetHandleInformation() のリファレンスを読んでみてください。
|
1