Chinaunix首页 | 论坛 | 博客
  • 博客访问: 462133
  • 博文数量: 191
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 172
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-31 14:35
个人简介

没有时间把一件事情做好,却有时间把一件事情反复做!

文章分类

全部博文(191)

文章存档

2016年(2)

2015年(74)

2014年(111)

2013年(4)

我的朋友

分类: WINDOWS

2014-09-12 10:38:22

原文地址:枚举系统设备 作者:yf956613

方法一:
#include
#include
#include
#include
#include
#include
#pragma comment(lib, "setupapi.lib")
#define BUFSIZE    1024
#define SM_SERVERR    289
int main()
{
    HDEVINFO hDevInfo;
    SP_DEVINFO_DATA DeviceInfoData;
    DWORD i;
    hDevInfo = SetupDiGetClassDevs((LPGUID) &GUID_DEVCLASS_PORTS, 0, 0,DIGCF_PRESENT);
    /*
    GUID_DEVCLASS_FDC软盘控制器
    GUID_DEVCLASS_DISPLAY显示卡
    GUID_DEVCLASS_CDROM光驱
    GUID_DEVCLASS_KEYBOARD键盘
    GUID_DEVCLASS_COMPUTER计算机
    GUID_DEVCLASS_SYSTEM系统
    GUID_DEVCLASS_DISKDRIVE磁盘驱动器
    GUID_DEVCLASS_MEDIA声音、视频和游戏控制器
    GUID_DEVCLASS_MODEMMODEM
    GUID_DEVCLASS_MOUSE鼠标和其他指针设备
    GUID_DEVCLASS_NET网络设备器
    GUID_DEVCLASS_USB通用串行总线控制器
    GUID_DEVCLASS_FLOPPYDISK软盘驱动器
    GUID_DEVCLASS_UNKNOWN未知设备
    GUID_DEVCLASS_SCSIADAPTERSCSI 和 RAID 控制器
    GUID_DEVCLASS_HDCIDE ATA/ATAPI 控制器
    GUID_DEVCLASS_PORTS端口(COM 和 LPT)
    GUID_DEVCLASS_MONITOR监视器
    */
    if (hDevInfo == INVALID_HANDLE_VALUE)
    {
        DWORD dwError = GetLastError();
        // Insert error handling here.
        return 1;
    }
    // Enumerate through all devices in Set.
    DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
    for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i,  &DeviceInfoData);  i++)
    {
        DWORD DataT;
        char buffer[2048];
        DWORD buffersize = sizeof(buffer);
        while (!SetupDiGetDeviceRegistryProperty(
            hDevInfo,
            &DeviceInfoData,
            SPDRP_FRIENDLYNAME,
            &DataT,
            (PBYTE)buffer,
            buffersize,
            &buffersize))
        {
            if (GetLastError() ==    ERROR_INSUFFICIENT_BUFFER)
            {
                // Change the buffer size.
                //if (buffer) LocalFree(buffer);
            }
            else
            {
                // Insert error handling here.
                break;
            }
        }
        if (buffer != NULL)
        {
            printf("%s\r\n", buffer);
        }
        if (buffer)
        {
            LocalFree(buffer);
        }
    }
    if ( GetLastError() != NO_ERROR &&   GetLastError() != ERROR_NO_MORE_ITEMS )
    {
        return 1;
    }
    // Cleanup
    SetupDiDestroyDeviceInfoList(hDevInfo);
    return 0;
}
方法二:
/* 函数名 : GetSerialPortsReg
*  说  明 : 通过注册表枚举系统串口数量,并列出所有串口的系统名
*
*  参  数 : pListStr, 串口名称列表
*  返回值 : int, 系统串口个数
*/
int GetSerialPortsReg(char (*pListStr)[80])
{
    HKEY hKey;
    LPCTSTR data_Set="HARDWARE\\DEVICEMAP\\SERIALCOMM\\";
    long ret0 = (::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_Set, 0, KEY_READ, &hKey));
    if(ret0 != ERROR_SUCCESS)
    {
        return -1;
    }
    int i = 0;
    CHAR Name[25] = {0};
    UCHAR szPortName[80] = {0};
    LONG Status;
    DWORD dwIndex = 0;
    DWORD dwName;
    DWORD dwSizeofPortName;
    DWORD Type;
    dwName = sizeof(Name);
    dwSizeofPortName = sizeof(szPortName);
    do
    {
        memset(Name,0,25);
        memset(szPortName,0,sizeof(szPortName));
        dwName           = VALUENAMEMAX;
        dwSizeofPortName = VALUENAMEMAX;
        Status = RegEnumValue(hKey, dwIndex++, Name, &dwName, NULL, &Type,
            szPortName, &dwSizeofPortName);
        if(strcmp(Name ,"Winachsf0") == 0 )//过滤掉识别出来的蓝牙设备
        continue;
        if((Status == ERROR_SUCCESS)||(Status == ERROR_MORE_DATA))
        {
            if (pListStr != NULL)
            {
                memcpy(*(pListStr + i), (LPCSTR)szPortName, 80);
            }
            i++;
        }
    } while((Status == ERROR_SUCCESS)||(Status == ERROR_MORE_DATA));
    RegCloseKey(hKey);
    return i;
}
阅读(990) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~