[リストへもどる]
一括表示

投稿時間:2003/06/04(Wed) 16:46
投稿者名:たくみ
URL :
タイトル:
アプリケーションの二重起動を防ぎたいのですが。
VBから、コマンドボタンを押して、ヘルプファイルを呼び出すプログラムを
作成したのですが、押すたびに起動してしまうことに気づきました。
FindWindowを使うのではなく、プロセスIDを取得してオブジェクトの存在を
判別して処理をしたいと考えたのですが、初心者なもので、よくわかりません。
(使用するのは、WaitForSingleObjectでよろしいのでしょうか?)
どのようにしたらよいのでしょうか。どなたか教えてください。

呼び出すまでの流れは以下のような感じです。

Dim File    As String
Dim ret     As Long
    
File = App.path & "\aaa.hlp"
ret = ShellExecute(Me.hwnd, "Open", File, _
      vbNullString, vbNullString, SW_SHOWNORMAL)

投稿時間:2003/06/04(Wed) 17:28
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: アプリケーションの二重起動を防ぎたいのですが。
ある掲示板に下記のような回答がありました。

ShellExecute では不可能です。
ShellExecuteEx API関数で fMask にSEE_MASK_NOCLOSEPROCESS を指定して起動すれば
hProcessが得られるので、WaitForSingleObject API関数で待機、
CloseHandle API関数でhProcessを破棄
という手順で良いでしょう。


又、下記のような起動方法もあります。
Private Sub Command1_Click()
    Dim Ret As Long
    Ret = Shell(Environ("ComSpec") & " /c start C:\Test.hlp", vbHide)
End Sub

投稿時間:2003/06/04(Wed) 18:37
投稿者名:Lantern
Eメール:
URL :
タイトル:
Re: アプリケーションの二重起動を防ぎたいのですが。
ヘルプファイルに限りますが、
API:WinHelp
を使用されるのがいいと思いますよ。
(私はヘルプファイルの起動は通常こちらを使用します)

Private Declare Function WinHelp Lib "user32" _
            Alias "WinHelpA" _
           (ByVal hwnd As Long, ByVal lpHelpFile As String, _
            ByVal wCommand As Long, ByVal dwData As Long) As Long

VBのアプリケーションウィザードでプロジェクト作成すると
ヘルプの検索・トピックス等の呼び出しコードを自動で作ってくれます。
参考になると思います。

投稿時間:2003/06/05(Thu) 11:16
投稿者名:Lantern
Eメール:
URL :
タイトル:
Re^2: アプリケーションの二重起動を防ぎたいのですが。
WinHelpで起動したヘルプファイルは
2重起動されません。

ShellやShellExecute、CreateProcessなど等で
起動してしまうと2重起動を抑止する処理が必要に
なるので、WinHelpを使用したらいいと思うのですが。

投稿時間:2003/06/05(Thu) 14:12
投稿者名:たくみ
URL :
タイトル:
ありがとうございました
>Lantern さん
ありがとうございます。
今回はWinHelpのAPIを使い、ヘルプを制御することができました。
二重起動の制御もいらないので多少なりともわかりやすくてよかったです。

>花ちゃん
ご教授ありがとうございます。
WaitForSingleObject や、ShellExecuteEx について調べ、いろいろ試してみたのですが
結局あと少し(?!)がわかりませんでした。(自分の認識ですが…^^;)
ヘルプの制御ができたといっても、当初のやり方とは別なものになってしまった&他のアプリに対して
このプログラムが汎用できないので、もう少しこれについて勉強したいと思います。

APIに触れたのが初な私には、複数のAPIを使用してのプログラムはちょっと難しかったかなぁ。
なんて考えてますが、1日ほど時間を費やした結果、自分にとって、ある程度のモノになって
よかったとは思ってます。