用SetupDiBuildClassInfoList获得GUID列表,但查里面的信息却只有一个类中有内容。用其它人发表的列存储设备的函数可以列出存储设备,其它设备怎样列呀,CPU、RAM、网卡...

解决方案 »

  1.   

    读xpddk下的src目录下的enable例子。
      

  2.   

    查GUID要在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class项目中有的GUID
    刚好给你一段我的枚举代码,枚举出来的信息会填充入HDEVINFO中,可以传到DDK的StateChange函数中处理 TCHAR * GUIDString = NULL;
    GUID guid;
    ZeroMemory(&guid, sizeof(GUID));
    switch(nIndex)
    {

    case 0: // 0 代表软驱
    if(1 == nStatus){
    ChangeDeviceStatus(cDeviceStatus&(~DISFLOPPY));//为启用置位
    }
    if(0 == nStatus){
    ChangeDeviceStatus(cDeviceStatus|DISFLOPPY);//禁用
    }

    GUIDString = _T("4D36E980-E325-11CE-BFC1-08002BE10318");
    UuidFromString((unsigned char *)GUIDString, &guid);
    break; 
    case 1: // 1 代表光驱 
    if(1 == nStatus){
    ChangeDeviceStatus(cDeviceStatus&(~DISCDROM));
    }
    if(0 == nStatus){
    ChangeDeviceStatus(cDeviceStatus|DISCDROM);
    }
    GUIDString = _T("4D36E965-E325-11CE-BFC1-08002BE10318");
    UuidFromString((unsigned char *)GUIDString, &guid);
    break;
    case 2: // 2 代表移动存储设备
    if(1 == nStatus){
    ChangeDeviceStatus(cDeviceStatus&(~DISUSBSTOR));
    }
    if(0 == nStatus){
    ChangeDeviceStatus(cDeviceStatus|DISUSBSTOR);
    }
    //GUIDString = _T("36FC9E60-C465-11CF-8056-444553540000");
    GUIDString = _T("4D36E967-E325-11CE-BFC1-08002BE10318");
    UuidFromString((unsigned char *)GUIDString, &guid);
    break;
    case 3://  3 代表打印机
    if(1 == nStatus){
    ChangeDeviceStatus(cDeviceStatus&(~DISPRINTER));
    }
    if(0 == nStatus){
    ChangeDeviceStatus(cDeviceStatus|(DISPRINTER));
    }
    // GUIDString = _T("F37C5810-4D3F-11d0-B4BF-00AA00BBB723");
    GUIDString = _T("4D36E979-E325-11CE-BFC1-08002BE10318");
    UuidFromString((unsigned char *)GUIDString, &guid);
    break;
    case 4://  4代表MODEM
    if(1 == nStatus){
    ChangeDeviceStatus(cDeviceStatus&(~DISMODEM));
    }
    if(0 == nStatus){
    ChangeDeviceStatus(cDeviceStatus|(DISMODEM));
    }
    GUIDString = _T("4D36E96D-E325-11CE-BFC1-08002BE10318");
    UuidFromString((unsigned char *)GUIDString, &guid);
    break;
    }

    hDevInfo = SetupDiGetClassDevs(&guid,NULL,NULL,DIGCF_PRESENT);
    if (INVALID_HANDLE_VALUE == hDevInfo)
    {
    FormatMSG(GetLastError(), &lpszMsg);
    throw lpszMsg;
    }

    DWORD i;
    SP_DEVINFO_DATA DeviceInfoData;
    ZeroMemory(&DeviceInfoData, sizeof(SP_DEVINFO_DATA));
    DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

    for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); ++i)
    {
    if (1 == nStatus)
    {
    StateChange(DICS_ENABLE, i, hDevInfo);

    }
    else if (0 == nStatus)
    {
    StateChange(DICS_DISABLE, i, hDevInfo);

    }
    return SetupDiDestroyDeviceInfoList(hDevInfo);
      

  3.   

    SetupDiGetClassDevs(&guid,NULL,NULL,DIGCF_PRESENT)最后一个标志可以让你枚举所有的设备看MSDN