zoukankan      html  css  js  c++  java
  • 枚举系统设备

    方法一:

    #include <windows.h> 
    #include <stdio.h>
    #include <setupapi.h>
    #include <devguid.h>
    #include <regstr.h>
    #include <shlwapi.h>
    
    #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
    ", 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;
    }
  • 相关阅读:
    ctrl+d与ctrl+c
    SIGTERM等信号含义
    truss命令
    strings命令
    touch命令
    C语言的readlink
    P1065 [NOIP2006 提高组] 作业调度方案
    P1786 帮贡排序
    P1098 [NOIP2007 提高组] 字符串的展开
    P1591 阶乘数码
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/4022856.html
Copyright © 2011-2022 走看看