当前位置: 首页 > article >正文

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,并将其属性设置为多行显示。

代码解释

  1. COM 初始化:使用 CoInitializeEx 初始化 COM 库,并使用 CoInitializeSecurity 设置 COM 库的安全级别。
  2. WMI 连接:创建 IWbemLocator 对象并连接到 ROOT\\CIMV2 命名空间。
  3. 执行查询:使用 IWbemServices 对象执行 WMI 查询,获取 Win32_BIOS 类的 Manufacturer 和 SerialNumber 属性。
  4. 处理结果:遍历查询结果,提取硬件厂商和序列号信息,并将其存储在 CString 对象中。
  5. 释放资源:释放所有 COM 对象并调用 CoUninitialize 释放 COM 库。

通过以上步骤,你可以在 MFC 应用程序中获取并显示硬件厂商和序列号信息。


http://www.kler.cn/a/565038.html

相关文章:

  • 如何搭建和管理 FTP 服务器
  • 【精】使用 Apktool 反编译 APK 并重新签名的详细教程
  • es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?底层的 lucene 介绍一下呗?倒排索引了解吗?
  • JVM 面试
  • GEO数据结构
  • DeepSeek 开源狂欢周(一)FlashMLA:高效推理加速新时代
  • vue从入门到精通(十六):自定义指令
  • 神经网络中感受野的概念和作用
  • 浅谈C++/C命名冲突
  • 跟着AI学vue第十一章
  • 面试JAVA集合常用方法总结
  • 微芯-AVR内核单片机
  • android 新增native binder service 方式(一)
  • PHP如何与HTML结合使用?
  • 在 JMeter 中使用 Python 脚本
  • Qt常用控件之下拉框QComboBox
  • 【每日前端面试-02】
  • Unity学习笔记之——ugui的性能优化
  • 一键导出数据库表到Excel
  • GDidees CMS v3.9.1本地文件泄露漏洞(CVE-2023-27179)