Windows 读取硬件信息

Win32_Processor 读取 CPU 型号

1#include <stdio.h>
2#include <stdlib.h>
3#include <windows.h>
4#include <wbemidl.h>
5
6#pragma comment(lib, "wbemuuid.lib")
7#pragma comment(lib, "ole32.lib")
8#pragma comment(lib, "oleaut32.lib")
9
10int main() {
11    HRESULT hres;
12    IWbemLocator *pLoc = NULL;
13    IWbemServices *pSvc = NULL;
14    IEnumWbemClassObject *pEnumerator = NULL;
15    IWbemClassObject *pclsObj = NULL;
16    ULONG uReturn = 0;
17    BSTR bstrNamespace = NULL;
18    BSTR bstrQuery = NULL;
19
20    // 1. 初始化 COM
21    hres = CoInitializeEx(NULL, COINIT_MULTITHREADED);
22    if (FAILED(hres)) {
23        printf("CoInitializeEx failed: 0x%08lx\n", hres);
24        return 1;
25    }
26
27    // 2. 初始化 COM 安全性
28    hres = CoInitializeSecurity(
29        NULL, -1, NULL, NULL,
30        RPC_C_AUTHN_LEVEL_DEFAULT,
31        RPC_C_IMP_LEVEL_IMPERSONATE,
32        NULL, EOAC_NONE, NULL
33    );
34    if (FAILED(hres) && hres != RPC_E_TOO_LATE) {
35        // RPC_E_TOO_LATE 表示已初始化过安全性,可以忽略
36        printf("CoInitializeSecurity failed: 0x%08lx\n", hres);
37        CoUninitialize();
38        return 1;
39    }
40
41    // 3. 创建 WMI 定位器
42    hres = CoCreateInstance(
43        &CLSID_WbemLocator,
44        NULL,
45        CLSCTX_INPROC_SERVER,
46        &IID_IWbemLocator,
47        (LPVOID*)&pLoc
48    );
49    if (FAILED(hres)) {
50        printf("CoCreateInstance failed: 0x%08lx\n", hres);
51        CoUninitialize();
52        return 1;
53    }
54
55    // 4. 连接到 WMI 命名空间
56    bstrNamespace = SysAllocString(L"ROOT\\CIMV2");
57    if (bstrNamespace == NULL) {
58        printf("SysAllocString failed\n");
59        pLoc->lpVtbl->Release(pLoc);
60        CoUninitialize();
61        return 1;
62    }
63
64    hres = pLoc->lpVtbl->ConnectServer(
65        pLoc,
66        bstrNamespace,
67        NULL, NULL, NULL, 0, NULL, NULL,
68        &pSvc
69    );
70    SysFreeString(bstrNamespace);
71    if (FAILED(hres)) {
72        printf("ConnectServer failed: 0x%08lx\n", hres);
73        pLoc->lpVtbl->Release(pLoc);
74        CoUninitialize();
75        return 1;
76    }
77
78    // 5. 设置代理安全级别
79    hres = CoSetProxyBlanket(
80        (IUnknown*)pSvc,
81        RPC_C_AUTHN_WINNT,
82        RPC_C_AUTHZ_NONE,
83        NULL,
84        RPC_C_AUTHN_LEVEL_CALL,
85        RPC_C_IMP_LEVEL_IMPERSONATE,
86        NULL,
87        EOAC_NONE
88    );
89    if (FAILED(hres)) {
90        printf("CoSetProxyBlanket failed: 0x%08lx\n", hres);
91        pSvc->lpVtbl->Release(pSvc);
92        pLoc->lpVtbl->Release(pLoc);
93        CoUninitialize();
94        return 1;
95    }
96
97    // 6. 执行 WQL 查询
98    bstrQuery = SysAllocString(L"SELECT Name FROM Win32_Processor");
99    if (bstrQuery == NULL) {
100        printf("SysAllocString failed\n");
101        pSvc->lpVtbl->Release(pSvc);
102        pLoc->lpVtbl->Release(pLoc);
103        CoUninitialize();
104        return 1;
105    }
106
107    hres = pSvc->lpVtbl->ExecQuery(
108        pSvc,
109        L"WQL",
110        bstrQuery,
111        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
112        NULL,
113        &pEnumerator
114    );
115    SysFreeString(bstrQuery);
116    if (FAILED(hres)) {
117        printf("ExecQuery failed: 0x%08lx\n", hres);
118        pSvc->lpVtbl->Release(pSvc);
119        pLoc->lpVtbl->Release(pLoc);
120        CoUninitialize();
121        return 1;
122    }
123
124    // 7. 遍历查询结果
125    printf("CPU Model(s):\n");
126    while (1) {
127        hres = pEnumerator->lpVtbl->Next(pEnumerator, WBEM_INFINITE, 1, &pclsObj, &uReturn);
128        if (uReturn == 0) {
129            break;
130        }
131
132        VARIANT vtProp;
133        VariantInit(&vtProp);
134
135        hres = pclsObj->lpVtbl->Get(pclsObj, L"Name", 0, &vtProp, 0, 0);
136        if (SUCCEEDED(hres)) {
137            if (vtProp.vt == VT_BSTR && vtProp.bstrVal != NULL) {
138                //  BSTR 转为宽字符输出
139                wprintf(L"  %s\n", vtProp.bstrVal);
140            }
141            VariantClear(&vtProp);
142        }
143
144        pclsObj->lpVtbl->Release(pclsObj);
145    }
146
147    // 8. 清理资源
148    pEnumerator->lpVtbl->Release(pEnumerator);
149    pSvc->lpVtbl->Release(pSvc);
150    pLoc->lpVtbl->Release(pLoc);
151    CoUninitialize();
152
153    return 0;
154}