Версия драйвера nVidia от WMI не то, что я хочу

Я хочу получить версию драйвера видеокарты nVidia.
Поэтому я использовал WMI и получил данные от объекта «DriverVersion» класса «Win32_VideoController».
Но это было похоже на «9.18.13.1106» (версия файла), и я хотел что-то вроде «311.06» (версия treiber).
Где я могу получить эту информацию?
Если это невозможно на WMI, я хочу узнать другой способ получить это.
Благодарю.

3

Решение

Вы можете сделать это, используя 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

…что соответствует тому, что я установил.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]