Daw Thomas!
Jo, det kan godt la' sig gøre, her er en stump kode:
procedure TRS232F.FindFreePorts(var PortList: TStringlist);
var
N,ErrCode: integer;
Hndl: THandle;
begin
Memo1.Lines.Clear;
PortList.Clear;
for N:= 1 to 8 do
begin
if N <> MousePortNo file://never test the mouse
port!
then begin
SetLastError(0);
Hndl:= CreateFile(
PChar(Port[N]), file://file name
GENERIC_READ or GENERIC_WRITE, file://desired access
0, file://share mode
Nil, file://security attributes
Open_Existing, file://creation distribution
FILE_FLAG_OVERLAPPED, file://flags and attributes
0 file://template file
);
ErrCode:= GetLastError;
case ErrCode of
0: begin
PortList.Append(Port[N]); file://free port, save it
Memo1.Lines.Append(Port[N]+' is free.');
end;
2: Memo1.Lines.Append(Port[N]+' is not installed.');
5: Memo1.Lines.Append(Port[N]+' is in use by another program.');
else Memo1.Lines.Append(Port[N]+' fails. Errorcode:
'+IntToStr(ErrCode));
end; file://case...
if Hndl <> INVALID_HANDLE_VALUE then CloseHandle(Hndl); file://free
port
end
else begin
Memo1.Lines.Append(Port[N]+' is used by the mouse.');
end; file://if...
end; file://for...
end;
Det essentielle er funktionen CreateFile, der returnerer en handle til
porten. Funktionen sætter også en fejlkode, der læses med GetLastError.
Fejlkoden er nul, hvis porten eksisterer og er fri. Husk inden kaldet til
CreateFile at presette fejlkoden til nul med funktionen SetLastError.
Som du kan se, overspringes en evt. museport. Det var nødvendigt på min PC,
der har musen på COM1 og anvender Logitech Mouseware version 9.0. Der skete
det, at testen sagde fri port - og værre endnu - musen frøs uhjælpeligt
fast. Surt show, så jeg kigger i Registry inden testen, så jeg kan udelukke
en evt. museport. Linierne med Memo1 bruger jeg til info, dem kan du bare
slette.
Mvh RH.
|