首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

VC++ 透過 WMI 監控新進程啟動並取得名稱

     編輯:程式設計綜合問答

需求

C# 使用 ManagementEventWatcher 監聽 Win32_Process 建立事件,需移植至 VC++ 實現相同功能。

方案:C++ 使用 WMI (IWbemServices)

Windows Management Instrumentation (WMI) 提供 COM 介面,C++ 可透過 IWbemLocator、IWbemServices、IWbemObjectSink 訂閱事件。

關鍵步驟

  1. 初始化 COM:CoInitializeEx、CoInitializeSecurity。
  2. 建立 IWbemLocator 並連線 ROOT\\CIMV2 命名空間。
  3. 設定 Proxy Blanket(權限)。
  4. 實作 IWbemObjectSink 接收事件(Indicate 方法)。
  5. 使用 ExecNotificationQueryAsync 訂閱 WQL 查詢:
    SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'
  6. 在 Indicate 中解析 TargetInstance 取得 Name、ProcessId 等屬性。

程式碼架構

#define _WIN32_DCOM
#include 
#include 
#include 
#include 
#pragma comment(lib, "wbemuuid.lib")

class ProcessCreateSink : public IWbemObjectSink {
    // 實作 AddRef, Release, QueryInterface, Indicate, SetStatus
    // Indicate 內解析 IWbemClassObject 取得 Name
};

int main() {
    // 1. COM 初始化
    // 2. 連線 WMI
    // 3. 設定安全性
    // 4. 建立 UnsecuredApartment 取得 Stub Sink
    // 5. ExecNotificationQueryAsync 訂閱事件
    // 6. 訊息迴圈保持執行緒存活
    // 7. 清理資源
}

參考資源

替代方案

  • SetWindowsHookEx (WH_CBT/WH_SHELL):全域鉤子攔截視窗建立,需 DLL 注入,較複雜。
  • 工具函數輪詢:定時 CreateToolhelp32Snapshot 比對進程列表,簡單但有延遲。

總結

WMI 事件訂閱是最標準、無侵入式的進程監控方式,C++ 雖較 C# 繁瑣,但可完全掌控生命週期與效能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved