WMIでのプロセスの起動・終了監視について
●環境
Microsoft VC++ 6.0
Windows XP Pro
●質問
http://mrxray.on.coocan.jp/Delphi/plSamples/902_ …
の「04_プロセス(アプリケーション)の起動と終了を監視」を参考に、VCに置き換えて作成したのですが途中で詰まってしまいました。
get_Classによる取得までできて、プロセスの作成・終了までは分かるようになったのですが
そのプロセスの情報が取得できません(プロセスIDや名前など)、参考にしたページ(Delphi)ではTargetInstanceから取得できるようなのですが、VCではそのプロパティ(?)が見つからず情報を取得出来ませんでした
どうすれば、プロセスの情報を取得出来るのでしょうか?
よろしくお願いします。
●ソース
_COM_SMARTPTR_TYPEDEF(ISWbemEventSource, __uuidof(ISWbemEventSource));
_COM_SMARTPTR_TYPEDEF(ISWbemObject, __uuidof(ISWbemObject));
_COM_SMARTPTR_TYPEDEF(ISWbemObjectPath, __uuidof(ISWbemObjectPath));
ISWbemEventSourcePtr SWbemEventSourcePtr;
hResult = SWbemServices->ExecNotificationQuery(_bstr_t(L"SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'"),
_bstr_t(L"WQL"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&SWbemEventSourcePtr);
while(TRUE)
{
ISWbemObjectPtr SWbemObjectPtr;
hResult = SWbemEventSourcePtr->NextEvent(-1, &SWbemObjectPtr);
CString ccc;
{
ISWbemObjectPathPtr SWbemObjectPathPtr;
hResult = SWbemObjectPtr->get_Path_(&SWbemObjectPathPtr);
CComBSTR ClassString;
hResult = SWbemObjectPathPtr->get_Class(&ClassString);
ccc = ClassString;
}
■■■ここでプロセスに関する情報を取得したい■■■
if(ccc == "__InstanceCreationEvent"){
// プロセス作成
}
else if(ccc == "__InstanceDeletionEvent"){
// プロセス終了
}
}
No.2ベストアンサー
- 回答日時:
} else if( wcscmp( vtClass.bstrVal, L"__InstanceDeletionEvent" ) == 0 ) {
// Get the value of the Name property
hResult = pwbcoProcess->Get( L"TargetInstance", 0, &vtTargetInstance, 0, 0 );
pwbcoInstance = ( IWbemClassObject * )(vtTargetInstance.ppdispVal);
hResult = pwbcoInstance->Get( L"Caption", 0, &vtCaption, 0, 0 );
wprintf( L"%s : Delete\n", vtCaption.bstrVal );
VariantClear( &vtTargetInstance );
VariantClear( &vtCaption );
iCount++;
}
VariantClear( &vtClass);
}
pNameSpace->Release();
pLocator->Release();
pEnumerator->Release();
pwbcoInstance->Release();
pwbcoProcess->Release();
CoUninitialize();
return 0;
}
/////////////////////////////////////////////////////
// stdafax.h
/////////////////////////////////////////////////////
#pragma once
#define _WIN32_DCOM
#include "targetver.h"
#include <windows.h>
#include <wbemidl.h>
#include <comutil.h>
#include <stdio.h>
#include <tchar.h>
VC++6.0 では、そのままではコンパイルが通らないかもしれません。
その場合は、最新の Windows SDK をインストールすればよいでしょう。
お礼が遅くなりすみませんでした。
大変詳しい回答を頂き本当にありがとうございました。
サンプロを参考に、何とかWMIによるキャプション取得に成功しました。
少しですがWMIのコツがつかめた気がします。
本当にありがとうございました。
No.1
- 回答日時:
Visual Studio 2008 で作ってみました。
Windows XP(win32)、Windows 7(x64)で動作確認しました。
字数の関係でエラーチェックは省略しています。
// stdafx.h
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
HRESULT hResult = CoInitialize(0);
hResult = CoInitializeSecurity(NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL);
IWbemLocator *pLocator = NULL;
hResult = CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,IID_IWbemLocator,(LPVOID *)&pLocator);
IWbemServices *pNameSpace = 0;
hResult = pLocator->ConnectServer(_bstr_t(L"\\\\.\\ROOT\\CIMV2"),NULL,NULL,NULL,0,NULL,NULL,&pNameSpace);
hResult = CoSetProxyBlanket(pNameSpace,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL,RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE);
IEnumWbemClassObject* pEnumerator = NULL;
hResult = pNameSpace->ExecNotificationQuery(_bstr_t(L"WQL"),_bstr_t(L"SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'" ),WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumerator);
IWbemClassObject *pwbcoProcess;
VARIANT vtClass;
IWbemClassObject *pwbcoInstance;
VARIANT vtTargetInstance;
VARIANT vtCaption;
ULONG ulReturn = 0;
int iCount = 0;
while(iCount < 100){
hResult = pEnumerator->Next(WBEM_INFINITE,1,&pwbcoProcess,&ulReturn);
if(0 == ulReturn){
break;
}
SAFEARRAY *pNames;
hResult = pwbcoProcess->GetNames(NULL,WBEM_FLAG_ALWAYS,NULL,&pNames);
hResult = pwbcoProcess->Get(L"__CLASS",0,&vtClass,0,0);
if(wcscmp(vtClass.bstrVal,L"__InstanceCreationEvent") == 0){
hResult = pwbcoProcess->Get(L"TargetInstance",0,&vtTargetInstance,0,0);
pwbcoInstance = (IWbemClassObject *)(vtTargetInstance.ppdispVal);
hResult = pwbcoInstance->Get(L"Caption",0,&vtCaption,0,0);
wprintf(L"%s:Create\n",vtCaption.bstrVal);
VariantClear(&vtTargetInstance);
VariantClear(&vtCaption);
iCount++;
}
つづく・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 バッチファイルでのエクスプローラー終了 1 2022/05/30 14:32
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- その他(コンピューター・テクノロジー) Texについてです。 jpgファイルを貼り付けても表示されないのですが、どうしたら表示できますか? 1 2022/06/30 23:42
- Firefox(ファイヤーフォックス) firefoxが頻繁に停止する 1 2023/01/09 10:26
- フリーソフト AOMEI Backupper でバックアップが取れない 2 2022/07/17 22:28
- 政治 私は文部科学省ヘ入り込んで投稿した私の建議文を彼らが私の依頼まましましょうか。? 2 2023/08/22 07:08
- 医学 医学に詳しい方にお尋ね致します。 摂取した水分は最終的には尿になりますが、そのプロセスがよく分かりま 4 2023/01/16 14:57
- 日本株 SBI証券HYPER SBI 2のエラー 1 2023/01/31 13:38
- その他(ソフトウェア) ソフトが異常終了します 1 2022/08/28 01:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
タスクマネージャーのプロセス...
-
起動中の他のプログラム(orプ...
-
プロセスが実行中かどうか調べ...
-
他のEXEが起動しているかの確認
-
Windowsでのfork方法
-
ノートンのパフォーマンス警告...
-
C++のプログラムをバックグラウ...
-
WSH.Runで待機できません
-
別のプロセスの関数を呼び出す...
-
バックグラウンドのプロセスの...
-
異なるプロセス間でのイベント...
-
プロセスハンドル or ウインド...
-
iTunesで「CDをインポート」→CD...
-
なぜ女性は男性が忘れたことを...
-
ADOでアクセスのレコードに...
-
vb.netでEXCEL起動がうまくでき...
-
VBAで別プロセスのExcelのフル...
-
親子プロセス間でのデータの受...
-
フレームワークとプロセスの違...
-
Macターミナルで実行中のプログ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
explorer.exeが異様にメモリを食う
-
タスクマネージャーのプロセス...
-
C#でのbatファイル実行結果取得
-
プロセスのアタッチ・デタッチ...
-
VB6.0 SHELLで起動...
-
プロセスIDからウィンドウハ...
-
Process.Startの戻り値を後で取得
-
ウィンドウのタイトルからプロ...
-
他のEXEが起動しているかの確認
-
ADOでアクセスのレコードに...
-
怪しいプロセス教えてください。
-
別のプロセスの関数を呼び出す...
-
C++のプログラムをバックグラウ...
-
Linuxでのスレッド間メッセージ...
-
C++でシェルを起動
-
プロセスIDの取得方法について
-
OSPFでプロセスを分ける意義に...
-
非表示になったエクセルは?
-
Windowsでのfork方法
おすすめ情報