c++ WMI中的nVidia驱动程序版本不是我想要的

kyvafyod  于 2022-12-30  发布在  其他
关注(0)|答案(2)|浏览(223)

我想获得nVidia视频卡的驱动程序版本。所以我使用WMI并从“Win32_VideoController”类的“DriverVersion”对象中获得数据。但它像“9.18.13.1106”(文件版本),而我想要的是类似“311.06”(treiber版本)的东西。我在哪里可以获得这些信息?如果在WMI上不可能,我想知道其他方法来获得这些信息。谢谢。

blmhpbnm

blmhpbnm1#

你可以使用nVidia Tesla Deployment Kit中的NVML来实现这一点。你可以使用如下代码来检索内部驱动程序版本(你习惯于在nVidia驱动程序中看到的版本):

#include <iostream>
#include <string>
#include <stdlib.h>
#include <nvml.h>
#include <windows.h>

namespace { 
typedef nvmlReturn_t (*init)();
typedef nvmlReturn_t (*shutdown)();
typedef nvmlReturn_t (*get_version)(char *, unsigned);

class NVML {
    init nvmlInit;
    shutdown nvmlShutdown;
    get_version nvmlGetDriverVersion;

    std::string find_dll() {
        std::string loc(getenv("ProgramW6432"));
        loc += "\\Nvidia Corporation\\nvsmi\\nvml.dll";
        return loc;
    }

public:    
    NVML() {
        HMODULE lib = LoadLibrary(find_dll().c_str());
        nvmlInit = (init)GetProcAddress(lib, "nvmlInit");
        nvmlShutdown = (shutdown)GetProcAddress(lib, "nvmlShutdown");
        nvmlGetDriverVersion = (get_version)GetProcAddress(lib, "nvmlSystemGetDriverVersion");

        if (NVML_SUCCESS != nvmlInit())
            throw(std::runtime_error("Unable to initialize NVML"));
    }

    std::string get_ver() {
        char buffer[81];
        nvmlGetDriverVersion(buffer, sizeof(buffer));
        return std::string(buffer);
    }

    ~NVML() {
        if (NVML_SUCCESS != nvmlShutdown())
            throw(std::runtime_error("Unable to shut down NVML"));
    }
};
}

int main() {  
    std::cout << "nVidia Driver version: " << NVML().get_ver();
}

注意,如果你编写这个代码纯粹是为了自己使用,在一台你可以自由编辑PATH的机器上,你可以把它简化很多。大部分代码处理了这样一个事实,即它使用NVML.DLL,它在一个通常不在路径上的目录中,所以代码动态加载,并使用GetProcAddress来查找我们需要使用的函数。在这种情况下,我们只使用了三个函数,所以处理起来并不困难,但是它仍然会极大地增加代码的长度。
如果我们可以忽略所有这些无意义的东西,那么真正的代码只会按照以下一般顺序出现:

nvmlInit();
nvmlSystemGetDriverVersion(result, sizeof(result));
std::cout << result;
nvmlShutdown();

无论如何,要构建它,您需要一个命令行,如下所示:

cl -Ic:\tdk\nvml\include nv_driver_version.cpp

...假设您已在c:\tdk上安装Tesla部署套件。
无论如何,是的,我至少在某种程度上测试过,在我的桌面上打印出来:

nVidia Driver version: 314.22

......与我安装的相匹配。

7ajki6be

7ajki6be2#

要在Win64上通过C++获取Nvidia驱动程序版本:
下载NVAPI https://developer.nvidia.com/rtx/path-tracing/nvapi/get-started,几MB
下载存档的主文件夹包含几个头文件,其中一个是nvapi.h。编译时需要这些头文件。子文件夹amd64包含链接时需要的nvapi64.lib。下面的代码将显示驱动程序版本:

#include <iostream>

extern "C" {
    #include "nvapi.h"
}

int main() {
    NvAPI_Status status = NVAPI_OK;
    NvAPI_ShortString str;
    
    status = NvAPI_Initialize();
    if (status == NVAPI_LIBRARY_NOT_FOUND) {
        //in this case NvAPI_GetErrorMessage() will only return an empty string
        std::printf("error no nvidia driver found\n");

    } else if (status != NVAPI_OK) {
        NvAPI_GetErrorMessage(status, str);
        std::printf("error initializing nvapi: %s\n", str);
    }

    NvU32 version = 0;
    NvAPI_ShortString branch;
    status = NvAPI_SYS_GetDriverAndBranchVersion(&version, branch);
    if (status != NVAPI_OK) {
        NvAPI_GetErrorMessage(status, str);
        std::printf("error getting driver version: %s\n", str);

    } else {
        std::printf("driver version %d.%d", version / 100, version % 100);
    }
}

相关问题