Я хочу получить версию драйвера видеокарты nVidia.
Поэтому я использовал WMI и получил данные от объекта «DriverVersion» класса «Win32_VideoController».
Но это было похоже на «9.18.13.1106» (версия файла), и я хотел что-то вроде «311.06» (версия treiber).
Где я могу получить эту информацию?
Если это невозможно на WMI, я хочу узнать другой способ получить это.
Благодарю.
Вы можете сделать это, используя NVML от nVidia Tesla Deployment Kit. Вы можете получить внутреннюю версию драйвера (ту, которую вы привыкли видеть для драйвера 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
…при условии, что вы установили Tesla Deployment Kit в c:\tdk
,
В любом случае, да, я проверял это хотя бы до некоторой степени. На моем рабочем столе это распечатывает:
nVidia Driver version: 314.22
…что соответствует тому, что я установил.
Других решений пока нет …