Ответ: Я давно это делаю, других способов не знаю.
Делаю примерно так (Дельфи)
P := StrNew ( ' ' );
QAvailCOMMPorts := 0;
For i := 1 to QuantCommPorts do
begin
AvailCOMMPorts [ i ] := false;
Str ( i : 0, S );
S := 'COM' + S;
P := StrPCopy ( P, S );
id := CreateFile ( P, GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
If id <> INVALID_HANDLE_VALUE
then begin
AvailCOMMPorts [ i ] := true;
QAvailCOMMPorts := QAvailCOMMPorts + 1;
CloseHandle ( id );
end;
end;