- ベストアンサー
WMIでのプロセスの起動・終了監視について
- WMIを使用してVC++でプロセスの起動・終了監視を行う方法について教えてください。
- 参考にしたページではプロセスの情報を取得する方法が記載されていましたが、VC++では見つけることができませんでした。
- プロセスの情報を取得する方法を教えていただけますか?
- みんなの回答 (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 をインストールすればよいでしょう。
その他の回答 (1)
- tsukasa-12r
- ベストアンサー率65% (358/549)
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++; } つづく・・・
お礼
お礼が遅くなりすみませんでした。 大変詳しい回答を頂き本当にありがとうございました。 サンプロを参考に、何とかWMIによるキャプション取得に成功しました。 少しですがWMIのコツがつかめた気がします。 本当にありがとうございました。