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

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 应用程序中获取并显示硬件厂商和序列号信息。

相关文章:

  • JSX 实现列表渲染
  • 为AI聊天工具添加一个知识系统 之125 详细设计之66 智能语义网络
  • DeepSeek赋能智慧港口:点亮全球航运的智慧灯塔,开启智能航运新纪元
  • Vue框架的使用 搭建打包 Vue的安全问题(Xss,源码泄露)
  • Vue3状态管理新选择:Pinia使用完全指南
  • 和鲸科技携手四川气象,以 AI 的力量赋能四川气象一体化平台建设
  • 课程2. 用PyTorch训练神经网络与梯度下降
  • NAT 技术:网络中的 “地址魔术师”
  • a_init: Unable to get log name. Retval:[-4]是什么故障
  • javaweb将上传的图片保存在项目文件webapp下的upload文件夹下
  • PyCharm 的使用 + PyCharm快捷键 + 切换中文界面
  • 管理后台环境配置
  • C++ 中 cin 和 cout 教程
  • Exoplayer(MediaX)实现音频变调和变速播放
  • git -学习笔记
  • vscode下载安装教程(附安装包)vscode图文安装教程最新版
  • leetcode707----设计链表【链表增删改打印等操作】
  • 深入理解Java反射机制:从基础到高级应用
  • vue3表单验证的时候访问接口如果有值就通过否则不通过.主动去触发校验
  • MySQL分库分表之带来查询相关问题
  • 以色列在加沙发起新一轮强攻,同步与哈马斯展开“无条件谈判”
  • 特写|银耳种植“北移”到沧州盐山,村民入伙可年增收4万元
  • 著名文博专家吴远明因交通事故离世,享年75岁
  • 上市公司重大资产重组新规九要点:引入私募“反向挂钩”,压缩审核流程
  • 孟夏韵评《无序的学科》丨误读与重构的文化漂流
  • 阳光保险拟设立私募证券投资基金,总规模200亿元