//访问系统的硬件库
 hDevInfo = SetupDiGetClassDevs(NULL, 0, NULL,
    DIGCF_ALLCLASSES | DIGCF_PRESENT);
 if (hDevInfo == INVALID_HANDLE_VALUE)
 {
  goto cleanup_DeviceInfo;
 } //枚举硬件,获得需要的接口
 spDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
 for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &spDevInfoData); i++)
 {
  DWORD DataT ;
  LPTSTR p, buffer = NULL ;
  DWORD buffersize = 0 ;  //获得硬件的属性值
  while (!SetupDiGetDeviceRegistryProperty(hDevInfo, &spDevInfoData,
     SPDRP_HARDWAREID
, &DataT, (PBYTE) buffer, buffersize,
     &buffersize))
  {
   if (GetLastError() == ERROR_INVALID_DATA)
   {
    //不存在HardwareID. Continue.
    break ;
   }
   else if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
   {
    //buffer size不对.
    if (buffer)
     LocalFree(buffer);
    buffer = (LPTSTR) LocalAlloc(LPTR, buffersize);
   }
   else
   {
    //未知错误
    goto cleanup_DeviceInfo ;
   }
  }
  long  error;
  error = GetLastError();
  if (error == ERROR_INVALID_DATA )
   continue ;
 }
  我粘出了部分代码,我出错的问就这个函数,
    SetupDiGetDeviceRegistryProperty(hDevInfo, &spDevInfoData,SPDRP_HARDWAREID,   &DataT, (PBYTE) buffer, buffersize, &buffersize)),
这个函数我在XP,2000运行的好的返回值,,可是在98运行的时候,总返回一个真值,但是
  buffer这个参数却没有东西,不知道98与2000和XP在设备信息有什么区别,请高手指点一下!!!
  郁闷! MSDN也没有说明XP和2000与98区别! 请高手们指点一下,我会及时结贴给分!在线等!

解决方案 »

  1.   

    98要用98的DDK
    2k用2k的ddk不能混用
      

  2.   

    建议先预分配一块足够大的buffer,不要先调用SetupDiGetDeviceRegistryProperty来获取缓冲区大小
      

  3.   

    原是这样啊。。谢谢the one...去98上面试一试。。
      

  4.   

    我调试了一下,老是返回无效数据,那位大虾能说明一下关于SetupDiGetDeviceRegistryProperty
      在98其参数是是如何设置的呢?跟xp,2000有什么不同啊?????
      

  5.   

    98/XP在这个函数上应该没有什么差别,你这样试一下
    DWORD DataT;
    BYTE buffer[500] = {0};
    SetupDiGetDeviceRegistryProperty(hDevInfo, &spDevInfoData,SPDRP_HARDWAREID,   &DataT, (PBYTE) buffer, sizeof(buffer), &buffersize);
      

  6.   

    98里面没试过,你的程序应该是没有问题的.
    是不是98中DDK引用的库文件不一样?!
      

  7.   

    to gdsdyl:
        我也是这么想的,我也在看CSDN文档(http://kb.csdn.net/.net/Articles/200603/a89f5005-c2a3-4d14-b359-33da2ddc3ea1.html),说里因为API不一样而出现错识!
      to  theone:
    /****************************** 我的做法: */
      TCHAR buffer[512]={0};
      //ZeroMemory(buffer,512); 
      //获得硬件的属性值
      SetupDiGetDeviceRegistryProperty(hDevInfo, &spDevInfoData,
         SPDRP_CAPABILITIES, &DataT, (PBYTE) buffer, sizeof(buffer),
         &buffersize))
    /******************************************/
     我试过了,buffer里面什么都没有,而且buffersize每次返回 不是0就是4
      getlasterror()每次的返回的值大多数时候是13 (ERROR_INVALID_DATA);
      我想是不是SPDRP_HARDWAREID这个参数对于设备是不是在98下面没有作用???
      

  8.   

    一般的函数应用在2K以上及98下时,MSDN都会在其下面说明不同的用法的啊仔细看看
      

  9.   

    to Stefine:
         我把这个函数在MSDN又仔细(E文不是很好,连猜到估)看了一次,发现这个对可移除设备在只在XP之后系统才支持. 但是对于这个SPDRP_HARDWAREID参数是没有说明98,2000和XP区别.所以说这个应该支持,但是buffer里面的应该是返回设备ID(对吧?),却没有.
      唉.而且98蓝屏的次数多得吓死人,我在98测试的时候,蓝屏N多次了!!!!!
        
      

  10.   

    1. 你需要获取什么设备的信息?如果有明确的设备类的话,建议在SetupDiGetClassDevs中制定设备类,设置GUID来缩小枚举范围,
    2. SPDRP_HARDWAREID在98下肯定可以枚举到,我曾经做过,没有问题的。从你返回值来看,似乎是注册表中信息不对,根据你枚举到的设备,看看注册表中此项信息是否正常
      

  11.   

    先谢谢theone了,
       我是枚举主要是一个USB设备,
       我想注册表信息应该有的,因为我从设备管理器中可以看到我要枚举设备了。。
       如果注册表信息错了的话?设备管理器应该是看不到吧?
       theone:
       你能不能留下你的MSN,能向请教吗?我留下我的MSN:[email protected]