getPortsWithFullMessages static method
Using getPortsWithFullMessages to get Serial Ports Info
Parameter: {String classGUIDStr = GUID_DEVINTERFACE_COMPORT}, refer to https://learn.microsoft.com/en-us/windows-hardware/drivers/install/guid-devinterface-comport
You can set classGUIDStr = GUID_DEVINTERFACE_USB_DEVICE
return PortInfo({
required this.portName,
required this.friendlyName,
required this.hardwareID,
})
;
Implementation
// required this.manufactureName,
/// })];
static List<PortInfo> getPortsWithFullMessages(
{String classGUIDStr = GUID_DEVINTERFACE_COMPORT}) {
/// Storage port information
var portInfoLists = <PortInfo>[];
/// Set Class GUID
final classGUID = calloc<GUID>();
classGUID.ref.setGUID(classGUIDStr);
/// Get Device info handle
final hDeviceInfo = SetupDiGetClassDevs(
classGUID, nullptr, 0, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
if (hDeviceInfo != INVALID_HANDLE_VALUE) {
/// Init device info data
final devInfoData = calloc<SP_DEVINFO_DATA>();
devInfoData.ref.cbSize = sizeOf<SP_DEVINFO_DATA>();
/// Enum device
for (var i = 0;
SetupDiEnumDeviceInfo(hDeviceInfo, i, devInfoData) == TRUE;
i++) {
/// Init [PortName] and [friendlyName] Pointer
final portName = calloc<Uint8>(256);
final pcbData = calloc<DWORD>()..value = 255;
final friendlyName = calloc<BYTE>(256);
final hardwareID = calloc<BYTE>(256);
final manufactureName = calloc<BYTE>(256);
/// [SP_DEVICE_INTERFACE_DATA] in dart
// final deviceInterfaceData = calloc<SP_DEVICE_INTERFACE_DATA>();
// deviceInterfaceData.ref.cbSize = sizeOf<SP_DEVICE_INTERFACE_DATA>();
//
// final deviceInterfaceDetailData =
// calloc<SP_DEVICE_INTERFACE_DETAIL_DATA_>(1024);
// deviceInterfaceDetailData.ref.cbSize =
// sizeOf<SP_DEVICE_INTERFACE_DETAIL_DATA_>();
try {
var hDevKey = SetupDiOpenDevRegKey(hDeviceInfo, devInfoData,
DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ);
if (hDevKey != INVALID_HANDLE_VALUE) {
RegQueryValueEx(
hDevKey, TEXT("PortName"), nullptr, nullptr, portName, pcbData);
RegCloseKey(hDevKey);
}
/// Get friendly name
if (SetupDiGetDeviceRegistryProperty(
hDeviceInfo,
devInfoData,
SPDRP.SPDRP_FRIENDLYNAME,
nullptr,
friendlyName,
255,
nullptr) !=
TRUE) {
continue;
}
/// Get Hardware ID
if (SetupDiGetDeviceRegistryProperty(hDeviceInfo, devInfoData,
SPDRP.SPDRP_HARDWAREID, nullptr, hardwareID, 255, nullptr) !=
TRUE) {
continue;
}
/// Get MFG
if (SetupDiGetDeviceRegistryProperty(hDeviceInfo, devInfoData,
SPDRP.SPDRP_MFG, nullptr, manufactureName, 255, nullptr) !=
TRUE) {
continue;
}
// if (SetupDiEnumDeviceInterfaces(hDeviceInfo, devInfoData, classGUID, i, deviceInterfaceData) != TRUE) {
// continue;
// }
//
// if (SetupDiGetDeviceInterfaceDetail(hDeviceInfo, deviceInterfaceData, deviceInterfaceDetailData, 1023, nullptr, nullptr) != TRUE) {
// continue;
// }
/// Convert Wchar to String
final String portNameStr = portName.cast<Utf16>().toDartString();
final String friendlyNameStr =
friendlyName.cast<Utf16>().toDartString();
// final String interfaceDetailDataStr = deviceInterfaceDetailData.ref.DevicePath;
// print(interfaceDetailDataStr);
final String hardwareIDStr = hardwareID.cast<Utf16>().toDartString();
final String manufactureNameStr =
manufactureName.cast<Utf16>().toDartString();
/// add to lists
portInfoLists.add(PortInfo(
portName: portNameStr,
friendlyName: friendlyNameStr,
hardwareID: hardwareIDStr,
manufactureName: manufactureNameStr));
} finally {
free(portName);
free(pcbData);
free(friendlyName);
free(hardwareID);
free(manufactureName);
// free(deviceInterfaceData);
// free(deviceInterfaceDetailData);
}
}
/// [Destroy Device Info List]
SetupDiDestroyDeviceInfoList(hDeviceInfo);
}
return portInfoLists;
}