Nvidiaドライバのバージョン番号を読み込む
Solution 1レジストリ情報を読み込んではいけません.多くのコンピュータのレジストリ情報が失われています.Solution 2は、dxgiでグラフィックスのバージョン番号を読み込みます.デスクトップでは通常、デュアルグラフィックスのノートパソコン側では、デフォルトのグラフィックスカードが核で表示されているため、核で表示されたバージョン番号が読み込まれます.Solution 3コマンドラインパイプを呼び出し、Nvidia Driverディレクトリのexeを実行し、返却情報のバージョン番号を切り取る
通常、グラフィックスドライブはデフォルトの場所にインストールされます.の
#include
#include "Windows.h"
#include
// string wstring
std::wstring string2wstring(std::string str)
{
std::wstring result;
// , ,
int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), NULL, 0);
TCHAR* buffer = new TCHAR[len + 1];
//
MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), buffer, len);
buffer[len] = '\0'; //
//
result.append(buffer);
delete[] buffer;
return result;
}
// wstring string
std::string wstring2string(std::wstring wstr)
{
std::string result;
// , ,
int len = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), NULL, 0, NULL, NULL);
char* buffer = new char[len + 1];
//
WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), buffer, len, NULL, NULL);
buffer[len] = '\0';
//
result.append(buffer);
delete[] buffer;
return result;
}
std::wstring ExeCmd(std::wstring pszCmd)
{
//
SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};
HANDLE hRead, hWrite;
if (!CreatePipe(&hRead, &hWrite, &sa, 0))
{
return TEXT(" ");
}
// ( hWrite
STARTUPINFO si = {sizeof(STARTUPINFO)};
GetStartupInfo(&si);
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
si.hStdError = hWrite;
si.hStdOutput = hWrite;
//
PROCESS_INFORMATION pi;
if (!CreateProcess(NULL, (LPWSTR)pszCmd.c_str(), NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi))
{
return TEXT("Cannot create process");
}
// hWrite
CloseHandle(hWrite);
//
std::string strRetTmp;
char buff[1024] = {0};
DWORD dwRead = 0;
strRetTmp = buff;
while (ReadFile(hRead, buff, 1024, &dwRead, NULL))
{
strRetTmp += buff;
}
CloseHandle(hRead);
LPCSTR pszSrc = strRetTmp.c_str();
int nLen = MultiByteToWideChar(CP_ACP, 0, buff, -1, NULL, 0);
if (nLen == 0)
return std::wstring(L"");
wchar_t* pwszDst = new wchar_t[nLen];
if (!pwszDst)
return std::wstring(L"");
MultiByteToWideChar(CP_ACP, 0, pszSrc, -1, pwszDst, nLen);
std::wstring strRet(pwszDst);
delete[] pwszDst;
pwszDst = NULL;
return strRet;
}
std::wstring cmdstr = L"C:/Program Files/NVIDIA Corporation/NVSMI/nvidia-smi.exe";
std::wstring resultwstr = ExeCmd(cmdstr);
std::string resultstr = wstring2string(resultwstr);
std::string driverVersionInfo = "Driver Version:";
int VersionStartLocation = resultstr.find(driverVersionInfo) + driverVersionInfo.size() + 1;
std::string versionNumber = resultstr.substr(VersionStartLocation,6);
qDebug() << QString::fromStdString(versionNumber);
通常、グラフィックスドライブはデフォルトの場所にインストールされます.の