方法一:
#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; }