Zitat von
chaosben:
Zitat von
Basilikum:
AF_INET müsste 2 sein, nicht 0 (WinSock)
Na bitte, da haben wir den Schuldigen. Danke.
Und damit müsste auch das Problem des Thread-Autors gelöst sein.
Nicht ganz.
Delphi-Quellcode:
MIB_TCPTABLE_OWNER_PID = packed record
dwNumEntries: DWord;
table: array [0..ANY_SIZE - 1] of MIB_TCPROW_OWNER_PID ;
end;
"table" ist als Array deklariert, damit man alle Verbindungen ansprechen kann, allerdings stimmt die Größe nicht immer, sondern nur in dem Fall, dass es exakt eine
TCP-Verbindung gibt.
Um den Zugriff dynamisch zu gestalten wird der Array an der Stelle dynamsich erzeugt, d.h. es können (theoretisch) 0 bis N Element vorhanden sein.
Unter C ist das Ganze kein Problem, da es dort keine Informationen über Array-Größen gibt und man über "pTcpTable.dwNumEntries" weiss, wie viele Element der Array hat.
Unter Delphi geht es nicht so einfach.
Eine Möglichkeit ist es, sich einen typisierten Pointer ("PMIB_TCPROW_OWNER_PID") lokal anzulegen und durch den Speicher zu wandern, bis man alle Elemente erhalten hat.
Delphi-Quellcode:
var
pTable: PMIB_TCPROW_OWNER_PID;
i: DWORD;
begin
...
pTable := @pTcpTable.Table;
i := 0; // i dient als Index
while (i <= pTcpTable.dwNumEntries) do
begin
...
Inc(i);
Inc(pTable); // typisierte Pointer werden direkt um "sizeof(Type)" Byte weitergesetzt
end;
Eine andere Möglichkeit wäre es, selbst einen danamischen Array anzulegen mit "pTcpTable.dwNumEntries" Elementen und den erhaltenen Array dort hinein zu kopieren.
Array wieder freigeben! ("Finalize(MeinArray);")
Dann kann der Zugriff wie gewohnt über eine For-Schleife erfolgen.