列舉系統裝置

Max Woods發表於2014-10-13

方法一:

#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\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;
}

 

相關文章