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

投稿時間:2004/06/18(Fri) 10:21
投稿者名:あいかわらず初心者のまま・・
Eメール:
URL :
タイトル:
同一PC上で起動しているEXEの確認
開発環境は VB6 Win2000です。
アプリケーション1にて、定期的にアプリケーション2が
同一PC上で起動されているか確認したく思っています。
確認するアプリ2もVBで作成したEXEであることが前提で、
時にはアプリ3やアプリ4も確認するので、
起動しているアプリ2・3・4側で、起動中はファイルを
書いて起動している事をしめす方法は考えていません。
アプリ2・3・4のexeファイルのパスは分かっている状態です。
そのExeが現在実行されているかどうか確認する方法はないでしょうか?

よろしくお願い致します。

投稿時間:2004/06/18(Fri) 10:30
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: 同一PC上で起動しているEXEの確認
API 関数を使用する事になると思うのですが、ここの[他のプロセスとの連携]の中の
[他のEXEのハンドルを取得しVBから終了する] のように キャプション名を与えて
ハンドルを取得し、取得できない場合は起動していないと判断する方法が一般的かと
思います。
又、簡単な方法ならWordの機能を使って
Private Sub Command1_Click()
    Dim wdApp As New Word.Application
    If wdApp.Tasks.Exists("メモ帳") = True Then
        MsgBox "メモ帳 は起動されています"
    End If
    wdApp.Quit
    Set wdApp = Nothing
End Sub
のような方法もあります。

投稿時間:2004/06/18(Fri) 11:54
投稿者名:はこ
Eメール:
URL :
タイトル:
Re: 同一PC上で起動しているEXEの確認
こんにちは。
今アプリ2が稼動中かどうかわかればいいってことですよね?
私は以前こんな方法で判定しました。


Public Function AppSearch(app_path As String) As Boolean
    Dim lngRet          As Long
    Dim process(1023)   As Long
    Dim lngSize         As Long
    Dim process_cnt     As Long
    Dim i               As Long
    
    '現在稼動中のプロセスID取得
    lngRet = EnumProcesses(process(0), UBound(process), lngSize)
    process_cnt = lngSize / 4
    
    '取得したプロセスIDから実行ファイル名を抽出し、
    '監視対象アプリが稼動中か判定
    For i = 0 To process_cnt - 1
        If GetProcessName(process(i)) = app_path Then
            AppSearch = True
            Exit For
        End If
    Next
End Function

Public Function GetProcessName(ByVal ProcessID As Long) As String
    Dim hProcess            As Long
    Dim hModules(1023)      As Long
    Dim lngSize             As Long
    Dim lngRet              As Long
    Dim i                   As Long
    Dim ExeFileName(255)    As Byte
    
    'プロセスハンドルを取得する
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, False, ProcessID)
    If hProcess <> 0 Then
        If EnumProcessModules(hProcess, hModules(0), UBound(hModules), lngSize) <> 0 Then
            'プロセスの実行ファイル名を取得する
            lngRet = GetModuleFileNameEx(hProcess, hModules(0), ExeFileName(0), UBound(ExeFileName))
            GetProcessName = Left$(StrConv(ExeFileName, vbUnicode), lngRet)
        End If
    End If
    
    'プロセスハンドルの開放
    CloseHandle (hProcess)
End Function

AppSearchに稼動中か判定したいexeファイルのパスを渡して、
Trueが返ってきたら稼動中で、Falseが返ってきたら稼動して
ないってことなんですけど、こんなんどうですか?

※APIや定数の定義は省略しています。

---
開発環境
WinXPPro SP1
VB6.0 SP5

投稿時間:2004/06/18(Fri) 12:25
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: 同一PC上で起動しているEXEの確認
こんな感じで。
    Dim Path As String
    Dim WQL As String
    Dim Count As Long

    Path = "C:\Windows\System32\Calc.exe"
    WQL = "SELECT * FROM Win32_Process WHERE" _
        & " ExecutablePath='" & Replace(Path, "\", "\\") & "'"
    Count = GetObject("winmgmts:").ExecQuery(WQL).Count
    If Count = 0 Then
        MsgBox "電卓は起動されていません。"
    Else
        MsgBox "電卓が" & CStr(Count) & "個起動されています。"
    End If

投稿時間:2004/06/18(Fri) 13:46
投稿者名:あいかわらず初心者のまま・・
Eメール:
URL :
タイトル:
ありがとうございました。
みなさん、たくさんお教えいただき有難うございました。

これで、解決しました。

花ちゃんさんのサンプルは、見せていただいていました。
説明不足だったのですが、確認するアプリのキャプションに
Ver情報などがあり、変化する恐れがあった為、
あえてプログラムパスからの起動確認にこだわっていたのです。

みなさん、本当にありがとうございました。

投稿時間:2004/06/18(Fri) 15:23
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: ありがとうございました。
> 花ちゃんさんのサンプルは、見せていただいていました。
> 説明不足だったのですが、確認するアプリのキャプションに
> Ver情報などがあり、変化する恐れがあった為、

クラス名で取得すれば変わらないし、又、Left$ 関数等で変化しない部分のキャプション
を照合すればいいのでは。
Excel なら Microsoft Excel の部分だけを照合するとか