ZBLOG

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

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

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

  1. #include <windows.h>
  2. #include <nvml.h>
  3. #include <iostream>
  4. #pragma comment(lib, "nvml.lib")
  5. bool hasNvidiaGPU() {
  6. nvmlReturn_t result = nvmlInit();
  7. if (result != NVML_SUCCESS) {
  8. return false;
  9. }
  10. unsigned int deviceCount = 0;
  11. result = nvmlDeviceGetCount(&deviceCount);
  12. nvmlShutdown();
  13. return (result == NVML_SUCCESS && deviceCount > 0);
  14. }
  15. int main() {
  16. if (hasNvidiaGPU()) {
  17. std::cout << "检测到NVIDIA显卡" << std::endl;
  18. } else {
  19. std::cout << "未检测到NVIDIA显卡" << std::endl;
  20. }
  21. return 0;
  22. }

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

  1. #include <windows.h>
  2. #include <iostream>
  3. bool checkNvidiaRegistry() {
  4. HKEY hKey;
  5. LONG result = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
  6. TEXT("SYSTEM\\CurrentControlSet\\Services\\nvlddmkm"),
  7. 0,
  8. KEY_READ,
  9. &hKey);
  10. if (result == ERROR_SUCCESS) {
  11. RegCloseKey(hKey);
  12. return true;
  13. }
  14. // 也可以检查设备管理器中的硬件ID
  15. result = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
  16. TEXT("HARDWARE\\DEVICEMAP\\VIDEO"),
  17. 0,
  18. KEY_READ,
  19. &hKey);
  20. if (result != ERROR_SUCCESS) return false;
  21. char value[256];
  22. DWORD size = sizeof(value);
  23. // 枚举所有视频设备
  24. for (DWORD i = 0; ; i++) {
  25. char name[256];
  26. DWORD nameSize = sizeof(name);
  27. if (RegEnumValue(hKey, i, name, &nameSize, NULL, NULL,
  28. (LPBYTE)value, &size) != ERROR_SUCCESS) {
  29. break;
  30. }
  31. if (strstr(value, "nvidia") || strstr(value, "NV")) {
  32. RegCloseKey(hKey);
  33. return true;
  34. }
  35. }
  36. RegCloseKey(hKey);
  37. return false;
  38. }
  39. int main() {
  40. if (checkNvidiaRegistry()) {
  41. std::cout << "通过注册表检测到NVIDIA显卡" << std::endl;
  42. } else {
  43. std::cout << "注册表中未找到NVIDIA显卡信息" << std::endl;
  44. }
  45. }

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

  1. #define _WIN32_DCOM
  2. #include <iostream>
  3. #include <comdef.h>
  4. #include <Wbemidl.h>
  5. #pragma comment(lib, "wbemuuid.lib")
  6. bool checkNvidiaViaWMI() {
  7. HRESULT hres;
  8. hres = CoInitializeEx(0, COINIT_MULTITHREADED);
  9. if (FAILED(hres)) return false;
  10. hres = CoInitializeSecurity(
  11. NULL,
  12. -1,
  13. NULL,
  14. NULL,
  15. RPC_C_AUTHN_LEVEL_DEFAULT,
  16. RPC_C_IMP_LEVEL_IMPERSONATE,
  17. NULL,
  18. EOAC_NONE,
  19. 0);
  20. if (FAILED(hres)) { CoUninitialize(); return false; }
  21. CComPtr<IWbemLocator> pLoc;
  22. hres = CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER,
  23. IID_IWbemLocator,(LPVOID*)&pLoc);
  24. CComPtr<IWbemServices> pSvc;
  25. hres = pLoc->ConnectServer(_bstr_t(L"root\\cimv2"), NULL,NULL,NULL,NULL,NULL,NULL,&pSvc);
  26. hres = CoSetProxyBlanket(pSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL,RPC_C_AUTHN_LEVEL_CALL,
  27. RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE);
  28. CComPtr<IEnumWbemClassObject> pEnumerator;
  29. hres=pSvc->ExecQuery(bstr_t("WQL"), bstr_t("SELECT * FROM Win32_VideoController"),
  30. WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumerator);
  31. while(pEnumerator){
  32. CComPtr<IWbemClassObject> pclsObj{};
  33. ULONG uReturn=0;
  34. hres=pEnumerator->Next(WBEM_INFINITE,1,&pclsObj,&uReturn);
  35. if(uReturn==0){break;}
  36. VARIANT vtProp{};
  37. hres=pclsObj->Get(L"Description",0,&vtProp,NULL,NULL);
  38. if(SUCCEEDED(hres)){
  39. if(wcsstr(vtProp.bstrVal,L"NVIDIA")){
  40. VariantClear(&vtProp);
  41. pSvc.Release(); pLoc.Release(); pEnumerator.Release();
  42. CoUninitialize();
  43. return true;
  44. }
  45. VariantClear(&vtProp);
  46. }
  47. }
  48. CoUninitialize();
  49. return false;
  50. }

各方法比较:

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

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


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?