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);
正常来说显卡驱动都安装在默认位置。。。