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

Funkcja z WinAPI blokuje niektore komputery... dlaczego??
Johny_Morfina
  • Rejestracja:ponad 22 lata
  • Ostatnio:ponad 5 lat
  • Postów:448
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?

Kopiuj
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;

SZ
  • Rejestracja:ponad 21 lat
  • Ostatnio:ponad 15 lat
  • Postów:3356
0

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

Kopiuj
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


Dzięki wszystkim forumowiczom za lata wspólnych dyskusji; miłej zabawy w programowanie!
Sławomir "Szczawik" Włodkowski
reichel
  • Rejestracja:ponad 20 lat
  • Ostatnio:około 14 lat
0

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

QueryDosDevice

i ta wydaje mi sie lepsza


Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.