来自WMI的nVidia驱动版本不是我想要的
nVidia driver version from WMI is not what I want
我想获得nVidia显卡的驱动程序版本。所以我使用WMI并从"Win32_VideoController"类的"DriverVersion"对象中获取数据。但它是"9.18.13.1106"(文件版本),我想要的是"311.06"(文件版本)。我从哪里可以得到这些信息?如果在WMI上是不可能的,我想知道其他的方法。谢谢。
您可以使用nVidia的Tesla部署工具包中的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:tdknvmlinclude nv_driver_version.cpp
…假设你已经在c:tdk
安装了特斯拉部署工具包。
nVidia Driver version: 314.22
…
在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 foundn");
} else if (status != NVAPI_OK) {
NvAPI_GetErrorMessage(status, str);
std::printf("error initializing nvapi: %sn", 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: %sn", str);
} else {
std::printf("driver version %d.%d", version / 100, version % 100);
}
}
相关文章:
- 如何设置一个范围来提取我想要获得的信息
- 链接列表运算符重载没有打印出我想要的内容
- 莱克斯没有返回我想要的东西
- 而不是那么多的 if 语句,我想要一个逻辑,我可以用一个语句或优化的方式来完成
- 我想要一个具有子函数的函数访问相同的命名函数,而不使用它取决于其子类的类
- 如何让m_refcount变量打印出我想要的值而不是垃圾
- 我想要一个改变数组快速排序的2个数字的函数
- 输出不是我想要C++的
- 使用运算符覆盖排序没有得到我想要的
- C ++,否则文本程序不会进入我想要的途径
- 如何声明一个未知大小的数组,然后输入直到我想要,然后获取数组的大小
- 我如何使用 juce 的文件过滤器描述我想要的文件过滤器?
- 如何设置此视觉工作室 (2015) 自定义生成步骤(工具?基本上,我想要一个修改头文件(c ++)的预处理器步骤
- 代码不会发送我想要的权衡
- 无法在openGL和GLUT中为我想要的确切对象设置动画
- 我如何强迫Visual Studio使用我想要的依赖性库名称
- 我的 OpenGL QQuickItem 没有我想要的大小
- 我可以/应该在 #ifndef 后输入任何我想要的东西
- C++ microshell,输入一个命令并使用fork(),dup(),pipe()将其通过管道传输到进程。只是我没有得到我想要的结果
- 来自WMI的nVidia驱动版本不是我想要的