ZBLOG

windows平台上C++代码如何确定英伟达显卡是否安装?

在Windows平台上,可以通过以下几种C++方法检测NVIDIA显卡是否安装:

方法1:使用NVML(NVIDIA Management Library)

#include <windows.h>
#include <nvml.h>
#include <iostream>

#pragma comment(lib, "nvml.lib")

bool hasNvidiaGPU() {
    nvmlReturn_t result = nvmlInit();
    if (result != NVML_SUCCESS) {
        return false;
    }

    unsigned int deviceCount = 0;
    result = nvmlDeviceGetCount(&deviceCount);
    
    nvmlShutdown();
    
    return (result == NVML_SUCCESS && deviceCount > 0);
}

int main() {
    if (hasNvidiaGPU()) {
        std::cout << "检测到NVIDIA显卡" << std::endl;
    } else {
        std::cout << "未检测到NVIDIA显卡" << std::endl;
    }
    return 0;
}

方法2:查询注册表(无需额外依赖)

#include <windows.h>
#include <iostream>

bool checkNvidiaRegistry() {
    HKEY hKey;
    LONG result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
                             TEXT("SYSTEM\\CurrentControlSet\\Services\\nvlddmkm"), 
                             0, 
                             KEY_READ, 
                             &hKey);
    
    if (result == ERROR_SUCCESS) {
        RegCloseKey(hKey);
        return true;
    }
    
    // 也可以检查设备管理器中的硬件ID
    result = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                        TEXT("HARDWARE\\DEVICEMAP\\VIDEO"),
                        0,
                        KEY_READ,
                        &hKey);
                        
    if (result != ERROR_SUCCESS) return false;

    char value[256];
    DWORD size = sizeof(value);
    
    // 枚举所有视频设备
    for (DWORD i = 0; ; i++) {
        char name[256];
        DWORD nameSize = sizeof(name);
        
        if (RegEnumValue(hKey, i, name, &nameSize, NULL, NULL, 
                        (LPBYTE)value, &size) != ERROR_SUCCESS) {
            break;
        }
        
        if (strstr(value, "nvidia") || strstr(value, "NV")) {
            RegCloseKey(hKey);
            return true;
        }
    }
    
    RegCloseKey(hKey);
    return false;
}

int main() {
    if (checkNvidiaRegistry()) {
        std::cout << "通过注册表检测到NVIDIA显卡" << std::endl;
    } else {
        std::cout << "注册表中未找到NVIDIA显卡信息" << std::endl;
    }
}

方法3:使用WMI查询(更可靠)

#define _WIN32_DCOM
#include <iostream>
#include <comdef.h>
#include <Wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")

bool checkNvidiaViaWMI() {
	HRESULT hres;

	hres = CoInitializeEx(0, COINIT_MULTITHREADED); 
	if (FAILED(hres)) return false;

	hres = CoInitializeSecurity(
		NULL,
		-1,
		NULL,
		NULL,
		RPC_C_AUTHN_LEVEL_DEFAULT,
		RPC_C_IMP_LEVEL_IMPERSONATE,
		NULL,
		EOAC_NONE,
		0);

	if (FAILED(hres)) { CoUninitialize(); return false; }

	CComPtr<IWbemLocator> pLoc;	
	hres = CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER,
                          IID_IWbemLocator,(LPVOID*)&pLoc);

	CComPtr<IWbemServices> pSvc;	
	hres = pLoc->ConnectServer(_bstr_t(L"root\\cimv2"), NULL,NULL,NULL,NULL,NULL,NULL,&pSvc);

	hres = CoSetProxyBlanket(pSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL,RPC_C_AUTHN_LEVEL_CALL,
                           RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE);

	CComPtr<IEnumWbemClassObject> pEnumerator;	
	hres=pSvc->ExecQuery(bstr_t("WQL"), bstr_t("SELECT * FROM Win32_VideoController"),
                       WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumerator);

	while(pEnumerator){
	    CComPtr<IWbemClassObject> pclsObj{};
	    ULONG uReturn=0;

	    hres=pEnumerator->Next(WBEM_INFINITE,1,&pclsObj,&uReturn);		
	    if(uReturn==0){break;} 

	    VARIANT vtProp{};
	    hres=pclsObj->Get(L"Description",0,&vtProp,NULL,NULL);			
	    if(SUCCEEDED(hres)){
	        if(wcsstr(vtProp.bstrVal,L"NVIDIA")){
	            VariantClear(&vtProp);				
	            pSvc.Release();	pLoc.Release();	pEnumerator.Release();				
	            CoUninitialize();				
	            return true;			
	        }			
	        VariantClear(&vtProp);		
	    }	
     }

     CoUninitialize();
     return false;
}

各方法比较:

方法 优点 缺点
NVML NVIDIA官方方案,最准确 需要安装驱动和NVML库
注册表 无需额外依赖 可能不准确
WMI Windows原生方案 COM编程较复杂

建议优先使用NVML方案,如需零依赖可考虑注册表或WMI方案。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23306

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?