我想获得nVidia视频卡的驱动程序版本。所以我使用WMI并从“Win32_VideoController”类的“DriverVersion”对象中获得数据。但它像“9.18.13.1106”(文件版本),而我想要的是类似“311.06”(treiber版本)的东西。我在哪里可以获得这些信息?如果在WMI上不可能,我想知道其他方法来获得这些信息。谢谢。
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来查找我们需要使用的函数。在这种情况下,我们只使用了三个函数,所以处理起来并不困难,但是它仍然会极大地增加代码的长度。如果我们可以忽略所有这些无意义的东西,那么真正的代码只会按照以下一般顺序出现:
NVML.DLL
GetProcAddress
nvmlInit(); nvmlSystemGetDriverVersion(result, sizeof(result)); std::cout << result; nvmlShutdown();
无论如何,要构建它,您需要一个命令行,如下所示:
cl -Ic:\tdk\nvml\include nv_driver_version.cpp
...假设您已在c:\tdk上安装Tesla部署套件。无论如何,是的,我至少在某种程度上测试过,在我的桌面上打印出来:
c:\tdk
nVidia Driver version: 314.22
......与我安装的相匹配。
7ajki6be2#
要在Win64上通过C++获取Nvidia驱动程序版本:下载NVAPI https://developer.nvidia.com/rtx/path-tracing/nvapi/get-started,几MB下载存档的主文件夹包含几个头文件,其中一个是nvapi.h。编译时需要这些头文件。子文件夹amd64包含链接时需要的nvapi64.lib。下面的代码将显示驱动程序版本:
nvapi.h
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); } }
2条答案
按热度按时间blmhpbnm1#
你可以使用nVidia Tesla Deployment Kit中的NVML来实现这一点。你可以使用如下代码来检索内部驱动程序版本(你习惯于在nVidia驱动程序中看到的版本):
注意,如果你编写这个代码纯粹是为了自己使用,在一台你可以自由编辑PATH的机器上,你可以把它简化很多。大部分代码处理了这样一个事实,即它使用
NVML.DLL
,它在一个通常不在路径上的目录中,所以代码动态加载,并使用GetProcAddress
来查找我们需要使用的函数。在这种情况下,我们只使用了三个函数,所以处理起来并不困难,但是它仍然会极大地增加代码的长度。如果我们可以忽略所有这些无意义的东西,那么真正的代码只会按照以下一般顺序出现:
无论如何,要构建它,您需要一个命令行,如下所示:
...假设您已在
c:\tdk
上安装Tesla部署套件。无论如何,是的,我至少在某种程度上测试过,在我的桌面上打印出来:
......与我安装的相匹配。
7ajki6be2#
要在Win64上通过C++获取Nvidia驱动程序版本:
下载NVAPI https://developer.nvidia.com/rtx/path-tracing/nvapi/get-started,几MB
下载存档的主文件夹包含几个头文件,其中一个是
nvapi.h
。编译时需要这些头文件。子文件夹amd64包含链接时需要的nvapi64.lib
。下面的代码将显示驱动程序版本: