Nvidiaドライバのバージョン番号を読み込む

21067 ワード

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);

通常、グラフィックスドライブはデフォルトの場所にインストールされます.の