Qt5 win10 通过WMI获取Nvidia driver Version 驱动版本

1 篇文章 0 订阅

一、环境
我的开发环境是Qt5.12.10,win10系统。
二、使用WMI获取计算机显示适配器的详细信息,包括显卡的型号,显卡驱动的版本号,以及显卡当前的状态。
三、代码示例

#define _WIN32_DCOM
#include <QDebug>
#include <iostream>
#include <comdef.h>
#include <Wbemidl.h>
#include <string>
#pragma comment(lib, "wbemuuid.lib")

const QString MainWindow::getNvidiaDriverVersion()
{
    QString driverVersion;
    HRESULT hres;
    
    // Initialize COM.
    hres = CoInitializeEx(0, COINIT_APARTMENTTHREADED);
    if (FAILED(hres))
    {
        qDebug() << "Failed to initialize COM library. " << "Error code = 0x" << hex << hres << endl;
        return "get failed";
    }

    // Initialize
    hres = CoInitializeSecurity(
                NULL,
                -1,                             // COM negotiates service
                NULL,                           // Authentication services
                NULL,                           // Reserved
                RPC_C_AUTHN_LEVEL_DEFAULT,      // authentication
                RPC_C_IMP_LEVEL_IMPERSONATE,    // Impersonation
                NULL,                           // Authentication info
                EOAC_NONE,                      // Additional capabilities
                NULL                            // Reserved
                );


    if (FAILED(hres))
    {
        qDebug() << "Failed to initialize security. " << "Error code = 0x" << hex << hres << endl;
        CoUninitialize();         // Program has failed.
        return "get failed";
    }

    // Obtain the initial locator to Windows Management
    // on a particular host computer.
    IWbemLocator *pLoc = 0;

    hres = CoCreateInstance(
                CLSID_WbemLocator,
                0,
                CLSCTX_INPROC_SERVER,
                IID_IWbemLocator, (LPVOID *)&pLoc);

    if (FAILED(hres))
    {
        qDebug() << "Failed to create IWbemLocator object. " << "Error code = 0x" << hex << hres << endl;
        CoUninitialize();
        return "get failed";
    }

    IWbemServices *pSvc = 0;

    // Connect to the root\cimv2 namespace with the
    // current user and obtain pointer pSvc
    // to make IWbemServices calls.
    hres = pLoc->ConnectServer(
                _bstr_t(L"ROOT\\CIMV2"), // WMI namespace
                NULL,                    // User name
                NULL,                    // User password
                0,                       // Locale
                NULL,                    // Security flags
                0,                       // Authority
                0,                       // Context object
                &pSvc                    // IWbemServices proxy
                );

    if (FAILED(hres))
    {
        qDebug() << "Could not connect. Error code = 0x" << hex << hres << endl;
        pLoc->Release();
        CoUninitialize();
        return "get failed";
    }

    qDebug() << "Connected to ROOT\\CIMV2 WMI namespace" << endl;

    // Set the IWbemServices proxy so that impersonation
    // of the user (client) occurs.
    hres = CoSetProxyBlanket(
                pSvc,                         // the proxy to set
                RPC_C_AUTHN_WINNT,            // authentication service
                RPC_C_AUTHZ_NONE,             // authorization service
                NULL,                         // Server principal name
                RPC_C_AUTHN_LEVEL_CALL,       // authentication level
                RPC_C_IMP_LEVEL_IMPERSONATE,  // impersonation level
                NULL,                         // client identity
                EOAC_NONE                     // proxy capabilities
                );

    if (FAILED(hres))
    {
        qDebug() << "Could not set proxy blanket. Error code = 0x" << hex << hres << endl;
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return "get failed";
    }


    // Use the IWbemServices pointer to make requests of WMI.
    // Make requests here:

    // For example, query for all the running processes
    IEnumWbemClassObject* pEnumerator = NULL;
    hres = pSvc->ExecQuery(
                bstr_t("WQL"),
                bstr_t("SELECT * FROM Win32_VideoController"),
                WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
                NULL,
                &pEnumerator);

    if (FAILED(hres))
    {
        qDebug() << "Query for processes failed. " << "Error code = 0x" << hex << hres << endl;
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return "get failed";
    }
    else
    {
        IWbemClassObject *pclsObj;
        ULONG uReturn = 0;

        while (pEnumerator)
        {
            hres = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
            if (0 == uReturn)
            {
                break;
            }

            VARIANT vtProp;
            VARIANT vtProp2;

            // Get the value of the Name property
            hres = pclsObj->Get(L"Description", 0, &vtProp, 0, 0);
            WCHAR* des;
            des = vtProp.bstrVal;

            driverVersion += QString::fromWCharArray(des) + "\n";
            qDebug() << "Description: " <<  QString::fromWCharArray(des) << endl;

            hres = pclsObj->Get(L"Availability", 0, &vtProp2, 0, 0);
            qDebug() << "Availability: " << vtProp2.uintVal << endl;

            VariantClear(&vtProp);
            VariantClear(&vtProp2);
        }

    }

    pSvc->Release();
    pLoc->Release();
    CoUninitialize();

    return driverVersion;
}

四、运行结果如下图所示
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

跳跃的曲奇饼

你的鼓励是我创造更大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值