Delphi 枚举串口
1、根据ClassName 'Ports' 找出相应的GUID。
2、根据GUID找到已安装设备的信息。
3、枚举设备集中的设备信息。
4、打开设备的注册表项特定的配置信息。
5、根据返回的注册表项查找‘PortName’对应的串口号。
//Delphi 7中枚举系统串口
function EnumSystemSerial: TStringList; stdcall; var Key: HKEY; GUID: TGUID; Buffer: PChar; Index: Integer; Judge: Boolean; BufferType: DWORD; RequiredSize: DWORD; hDeviceInfo: HDEVINFO; SerialList: TStringList; DeviceInfo: SP_DEVINFO_DATA; begin Index := 0; SerialList := TStringList.Create; if not SetupDiClassGuidsFromName('Ports',@GUID,1,@Requiredsize) then begin Result := SerialList; Exit; end; hDeviceInfo := SetupDiGetClassDevs(@GUID, nil, 0, DIGCF_PRESENT or DIGCF_PROFILE); if Cardinal(hDeviceInfo) = INVALID_HANDLE_VALUE then begin Result := SerialList; Exit; end; DeviceInfo.cbSize := SizeOf(SP_DEVINFO_DATA); while True do begin Judge := SetupDiEnumDeviceInfo(hDeviceInfo, Index, @DeviceInfo); if (Judge = False) and (GetLastError = ERROR_NO_MORE_ITEMS) then begin Break; end; Key := SetupDiOpenDevRegKey(hDeviceInfo, @DeviceInfo, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ); RegQueryValueEx(Key, 'PortName', nil, @BufferType, nil, @RequiredSize); GetMem(Buffer, RequiredSize); RegQueryValueEx(Key, 'PortName', nil, @BufferType, PByte(Buffer), @RequiredSize); SerialList.Add(Buffer); Inc(Index); end; SetupDiDestroyDeviceInfoList(hDeviceInfo); Result := SerialList; end;