请教关于获取NVIDIA独显硬件ID问题

「已注销」 2014-08-26 05:13:07
NVIDIA官方提供的demo code编译运行后不能读出NVIDIA独显,当EnumDisplayDevices枚举index为0,读出Intel集显ID,当index为3,debug中可以读出NVIDIA显卡信息,但是此时StateFlags 为0,函数fail,这是为什么?怎样才可以读出电脑上所有显卡的ID?而不是读出第一个就停止了。



// Example code to retrieve vendor and device ID's for the primary display
// device.
//
// NOTE: Visual Studio 6 does not ship with a winuser.h that defines the
// EnumDisplayDevices function so in order to compile this code, you'll
// need to install the Platform SDK.
#include "stdafx.h"
#include <windows.h>

#include <string>
#include <iostream>

using namespace std;

bool GetDeviceIdentification(string &vendorID, string &deviceID)
{
DISPLAY_DEVICE dd;
dd.cb = sizeof(DISPLAY_DEVICE);

int i = 0;
string id;

// locate primary display device
while (EnumDisplayDevices(NULL, i, &dd, 0))
{
if (dd.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE)
{
id = dd.DeviceID;
break;
}
i++;
}

if (id == "") return false;

// get vendor ID
vendorID = id.substr(8, 4);

// get device ID
deviceID = id.substr(17, 4);

return true;
}

int main(void)
{
string vendorID;
string deviceID;

if (GetDeviceIdentification(vendorID, deviceID))
{
cout << "Vendor ID: " << vendorID << endl;
cout << "Device ID: " << deviceID << endl;
}
else
cout << "Unable to locate device information" << endl;
cin.get();

return 0;
}
...全文
623 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
shen_wei 2014-08-28
  • 打赏
  • 举报
回复
你可以去Nvidia的官方去下载。。
「已注销」 2014-08-27
  • 打赏
  • 举报
回复
用TRACE输出的话要加afx.h,加了之后就会有#error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]这样的错误,如果在设置里再改成在dll中使用MFC又有其他很多错误了。
zgl7903 2014-08-27
  • 打赏
  • 举报
回复
试试调试框中输出所有信息

#pragma pack(push, 8)
  typedef struct _DISPLAY_DEVICEEX {
    DWORD cb;
    TCHAR DeviceName[32];
    TCHAR DeviceString[128];
    DWORD StateFlags;
    TCHAR DeviceID[128];
    TCHAR DeviceKey[128];
  } DISPLAY_DEVICEEX, *PDISPLAY_DEVICEEX;
#pragma pack(pop)

  DISPLAY_DEVICEEX dd = { sizeof(DISPLAY_DEVICEEX) };

  int iDisp = 0;
  while(  EnumDisplayDevices(NULL, iDisp++, (DISPLAY_DEVICE*)&dd, 0) )
  {
    TRACE(_T("Name=[%s] Str=[%s] Flag=%08XH ID=[%s] Key=[%s]\n"), 
      dd.DeviceName, dd.DeviceString, dd.StateFlags, dd.DeviceID, dd.DeviceKey);
  }
「已注销」 2014-08-27
  • 打赏
  • 举报
回复
引用 3 楼 zgl7903 的回复:
while (EnumDisplayDevices(NULL, i++, &dd, 0)) 后面有个break 在不是PRIMARY_DEVICE时中断了
你是看我传的图片是因为PRIMARY_DEVICE中断了?还是运行代码到PRIMARY_DEVICE就会中断? 应该不会 吧,这个我也改过和增加过,MSDN上描述的stageflags共有6个,PRIMARY_DEVICE这个意思是主要的设备,其他的意思也没有表明是独显,集显独显和外接显示器设备有点模糊了,不知道这里对不对? 反正当i=1,2时,debug可以看到读出了Intel device,可是运行都会失败。
zgl7903 2014-08-27
  • 打赏
  • 举报
回复
while (EnumDisplayDevices(NULL, i++, &dd, 0)) 后面有个break 在不是PRIMARY_DEVICE时中断了
「已注销」 2014-08-27
  • 打赏
  • 举报
回复
有木有人帮忙看看呢?
「已注销」 2014-08-27
  • 打赏
  • 举报
回复
引用 7 楼 shen_wei 的回复:
NVAPI_INTERFACE NvAPI_EnumPhysicalGPUs ( NvPhysicalGpuHandle nvGPUHandle[NVAPI_MAX_PHYSICAL_GPUS], NvU32 * pGpuCount ) 这个才是Nvidia的官方函数。。。
这个才是呀?我那个是demo工具,应该只是读出集显的sample而已, 你可以把链接发给我看看嘛?谢谢
shen_wei 2014-08-27
  • 打赏
  • 举报
回复
NVAPI_INTERFACE NvAPI_EnumPhysicalGPUs ( NvPhysicalGpuHandle nvGPUHandle[NVAPI_MAX_PHYSICAL_GPUS], NvU32 * pGpuCount ) 这个才是Nvidia的官方函数。。。
「已注销」 2014-08-26
  • 打赏
  • 举报
回复

另外不同电脑显卡的顺序也不同吧?

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧