MFC获取所有硬件厂商和序列号
在 MFC(Microsoft Foundation Classes)中获取所有硬件厂商和序列号,可以通过 WMI(Windows Management Instrumentation)来实现。WMI 提供了一个统一的接口,用于管理和监控 Windows 系统中的各种硬件和软件组件。以下是一个详细的示例代码,展示了如何在 MFC 应用程序中获取硬件厂商和序列号:
步骤 1:创建 MFC 应用程序
首先,使用 Visual Studio 创建一个新的 MFC 应用程序,选择 “基于对话框” 的应用程序类型。
步骤 2:添加必要的头文件和库
在对话框类的头文件(例如 YourDialog.h
)中添加以下头文件:
#include <comdef.h>
#include <wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
步骤 3:实现获取硬件厂商和序列号的函数
在对话框类的实现文件(例如 YourDialog.cpp
)中添加以下函数:
CString GetHardwareVendorAndSerial()
{
CString result;
HRESULT hres;
// 初始化 COM 库
hres = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hres))
{
result.Format(_T("Failed to initialize COM library (0x%08X)"), hres);
return result;
}
// 设置 COM 库的安全级别
hres = CoInitializeSecurity(
NULL,
-1, // COM authentication
NULL, // Authentication services
NULL, // Reserved
RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication
RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation
NULL, // Authentication info
EOAC_NONE, // Additional capabilities
NULL // Reserved
);
if (FAILED(hres))
{
CoUninitialize();
result.Format(_T("Failed to initialize security (0x%08X)"), hres);
return result;
}
// 创建 WMI 服务的代理对象
IWbemLocator* pLoc = NULL;
hres = CoCreateInstance(
CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (LPVOID*)&pLoc);
if (FAILED(hres))
{
CoUninitialize();
result.Format(_T("Failed to create IWbemLocator object (0x%08X)"), hres);
return result;
}
IWbemServices* pSvc = NULL;
hres = pLoc->ConnectServer(
_bstr_t(L"ROOT\\CIMV2"),
NULL,
NULL,
0,
NULL,
0,
0,
&pSvc
);
if (FAILED(hres))
{
pLoc->Release();
CoUninitialize();
result.Format(_T("Could not connect to WMI service (0x%08X)"), hres);
return result;
}
hres = CoSetProxyBlanket(
pSvc,
RPC_C_AUTHN_WINNT,
RPC_C_AUTHZ_NONE,
NULL,
RPC_C_AUTHN_LEVEL_CALL,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE
);
if (FAILED(hres))
{
pSvc->Release();
pLoc->Release();
CoUninitialize();
result.Format(_T("Could not set proxy blanket (0x%08X)"), hres);
return result;
}
IEnumWbemClassObject* pEnumerator = NULL;
hres = pSvc->ExecQuery(
bstr_t("WQL"),
bstr_t("SELECT Manufacturer, SerialNumber FROM Win32_BIOS"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);
if (FAILED(hres))
{
pSvc->Release();
pLoc->Release();
CoUninitialize();
result.Format(_T("Query for hardware vendor and serial information failed (0x%08X)"), hres);
return result;
}
IWbemClassObject* pclsObj = NULL;
ULONG uReturn = 0;
while (pEnumerator)
{
hres = pEnumerator->Next(WBEM_INFINITE, 1,
&pclsObj, &uReturn);
if (0 == uReturn)
{
break;
}
VARIANT vtProp;
// 获取硬件厂商信息
hres = pclsObj->Get(L"Manufacturer", 0, &vtProp, 0, 0);
if (SUCCEEDED(hres))
{
if (vtProp.vt == VT_BSTR)
{
result += _T("Hardware Manufacturer: ");
result += vtProp.bstrVal;
result += _T("\n");
}
VariantClear(&vtProp);
}
// 获取序列号信息
hres = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0);
if (SUCCEEDED(hres))
{
if (vtProp.vt == VT_BSTR)
{
result += _T("Serial Number: ");
result += vtProp.bstrVal;
result += _T("\n");
}
VariantClear(&vtProp);
}
pclsObj->Release();
}
pEnumerator->Release();
pSvc->Release();
pLoc->Release();
CoUninitialize();
if (result.IsEmpty())
{
result = _T("No hardware vendor and serial information available.");
}
return result;
}
步骤 4:在对话框中显示信息
在对话框类的 OnInitDialog
函数中调用 GetHardwareVendorAndSerial
函数,并将结果显示在一个 CListBox
或 CEdit
控件中。以下是一个示例:
BOOL CYourDialog::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 获取硬件厂商和序列号信息
CString info = GetHardwareVendorAndSerial();
// 在 CEdit 控件中显示信息
CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT_INFO);
if (pEdit)
{
pEdit->SetWindowText(info);
}
return TRUE;
}
步骤 5:添加控件
在对话框资源中添加一个 CEdit
控件,将其 ID 设置为 IDC_EDIT_INFO
,并将其属性设置为多行显示。
代码解释
- COM 初始化:使用
CoInitializeEx
初始化 COM 库,并使用CoInitializeSecurity
设置 COM 库的安全级别。 - WMI 连接:创建
IWbemLocator
对象并连接到ROOT\\CIMV2
命名空间。 - 执行查询:使用
IWbemServices
对象执行 WMI 查询,获取Win32_BIOS
类的Manufacturer
和SerialNumber
属性。 - 处理结果:遍历查询结果,提取硬件厂商和序列号信息,并将其存储在
CString
对象中。 - 释放资源:释放所有 COM 对象并调用
CoUninitialize
释放 COM 库。
通过以上步骤,你可以在 MFC 应用程序中获取并显示硬件厂商和序列号信息。