Funkcja z WinAPI blokuje niektore komputery... dlaczego??

0

Witam
Znalazlem ta funkcje w serwisie 4p.
no i pieknie lata i wykrywa wszystkie dostepne porty COM
jednak gdy odpwlilem ja na laptopie kolegi program sie zawiesil
niestety nie wiem nic o konfiguracji drugiego komputera.
ale na pewno jestto wina tej funkcji!
czy ktos ma pomysl co jest nie tak? Lub ktory fragment kodu
moze powodowac zawieszanie (zapetlanie?) sie aplikacji?

Function ListaPortow: TStringList;
var
  n, MaxPorts: integer;
  Port: THandle;
  PortName: string;
  Lista: TStringList;
begin
  Lista := TStringList.create;
  if Win32PlatForm = VER_PLATFORM_WIN32_NT then
    MaxPorts := 256
  else { if VER_PLATFORM_WIN32_WINDOWS }
    MaxPorts := 9;
  for n := 1 to MaxPorts do
  begin
    PortName := '\\.\COM' + IntToStr(n);
    Port := CreateFile(PChar(PortName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0);
    if (Port <> INVALID_HANDLE_VALUE) then
      Lista.Add('COM  '+IntToStr(n));
    CloseHandle(Port);
  end;
  result := lista;
end;
0

Spróbuj coś takiego (główna różnica polega w zamykaniu pliku portu tylko, gdy udało się go otworzyć.

function ListaPortow(): TStringList;
var n, MaxPorts: integer;
    Port: THandle;
    PortName: string;
begin
result:=TStringList.Create();
if Win32PlatForm = VER_PLATFORM_WIN32_NT then
  MaxPorts := 256
else
  MaxPorts := 9;
for n := 1 to MaxPorts do
  begin
  PortName := 'COM' + IntToStr(n);
  Port := CreateFile(PChar('\\.\'+PortName), 0, 0, nil, OPEN_EXISTING, 0, 0);
  if (Port <> INVALID_HANDLE_VALUE) then
    begin
    result.Add(PortName);
    CloseHandle(Port);
    end;
  end;
end;

//Ale rzeczywiście powinieneś raczej używać indeksowania po urządzeniach niż po udostępnianych przez nie zasobach. - jak poniżej napisał reichel

0

dla systemow z rodziny NT istnieje funkcja zwracajaca nazwy urzadzen w systemie

QueryDosDevice

i ta wydaje mi sie lepsza

1 użytkowników online, w tym zalogowanych: 0, gości: 1