掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
プログラムが起動されたことを知るには? (ID:140845)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
もしかして、VBScript 版のソースを参考にされたのでしょうか? そのコードだと、ポーリング間隔(1 秒ごと)の DoEvents が実行されるまでの間、 VB アプリが応答無し状態になってしまいますので、VB6 から利用する場合には、 非同期メソッドを用いて、イベントで処理する事をお奨めします。 それと、監視したいのはアプリの起動だけなのですよね。であれば、 __InstanceOperationEvent を使うのは少々大袈裟で、 __InstanceCreationEvent で十分かもしれません。 ' === 参照設定:Microsoft WMI Scripting V1.2 Libary === Option Explicit Private WithEvents InstanceCreationEvent As WbemScripting.SWbemSink 'Private WithEvents InstanceOperationEvent As WbemScripting.SWbemSink 'Private WithEvents InstanceDeletionEvent As WbemScripting.SWbemSink 'Private WithEvents InstanceModificationEvent As WbemScripting.SWbemSink Private Sub Form_Load() Const PollingInterval As Integer = 1 Dim Locator As WbemScripting.SWbemLocator Set Locator = New WbemScripting.SWbemLocator Dim Service As WbemScripting.SWbemServices Set Service = Locator.ConnectServer() Dim WQL As String Set InstanceCreationEvent = New WbemScripting.SWbemSink WQL = "SELECT * FROM __InstanceCreationEvent WITHIN " _ & CStr(PollingInterval) & " WHERE TargetInstance ISA 'Win32_Process'" Service.ExecNotificationQueryAsync InstanceCreationEvent, WQL End Sub Private Sub InstanceCreationEvent_OnObjectReady( _ ByVal objWbemObject As WbemScripting.ISWbemObject, _ ByVal objWbemAsyncContext As WbemScripting.ISWbemNamedValueSet) Dim Win32_Process As WbemScripting.SWbemObjectEx Set Win32_Process = objWbemObject.TargetInstance Dim dt As WbemScripting.SWbemDateTime Set dt = New WbemScripting.SWbemDateTime dt.Value = Win32_Process.CreationDate Dim sDate As String sDate = Format(dt.GetVarDate(True), "yyyy/MM/dd hh:mm:ss") sDate = sDate & Format(".000000", CDec(dt.Microseconds) / CDec(1000000)) Debug.Print "----------" Debug.Print "プロセス名 ["; Win32_Process.Name; "]" Debug.Print "プロセスID ["; Win32_Process.ProcessID; "]" Debug.Print "起動元プロセス ["; Win32_Process.ParentProcessID; "]" Debug.Print "実行ファイル名 ["; Win32_Process.ExecutablePath; "]" Debug.Print "コマンドライン ["; Win32_Process.CommandLine; "]" Debug.Print "起動日時 ["; sDate; "]" End Sub なお、細かい情報までは必要ではないのであれば、Win32_ProcessStartTrace クラスを 使うという手もあります。こちらを使うと、ポーリング間隔の指定が不要になります。 (システムの監視負荷も若干軽減されるらしい…未検証) Option Explicit Private WithEvents InstanceCreationEvent As WbemScripting.SWbemSink Private Sub Form_Load() Dim Locator As WbemScripting.SWbemLocator Set Locator = New WbemScripting.SWbemLocator Dim Service As WbemScripting.SWbemServices Set Service = Locator.ConnectServer() Dim WQL As String Set InstanceCreationEvent = New WbemScripting.SWbemSink WQL = "SELECT * FROM Win32_ProcessStartTrace" Service.ExecNotificationQueryAsync InstanceCreationEvent, WQL End Sub Private Sub InstanceCreationEvent_OnObjectReady( _ ByVal objWbemObject As WbemScripting.ISWbemObject, _ ByVal objWbemAsyncContext As WbemScripting.ISWbemNamedValueSet) Debug.Print "----------" Debug.Print "プロセス名 ["; objWbemObject.ProcessName; "]" Debug.Print "プロセスID ["; objWbemObject.ProcessID; "]" Debug.Print "起動元プロセス ["; objWbemObject.ParentProcessID; "]" End Sub
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.