![]() |
Re: DLL mehrere Strings auslesen
Also hier die DLL
Delphi-Quellcode:
und das Programm
function GetNetworkAdapter: string;
var MibRow: TMibIfRow; IntfTable: PMibIfTable; Size: DWORD; I: Integer; Adapter : array[1..5] of string; begin Size := 0; If GetIfTable(nil, Size, True) <> ERROR_INSUFFICIENT_BUFFER then Exit; IntfTable := AllocMem(Size); Try If GetIfTable(IntfTable, Size, True) = NO_ERROR then For I := 0 to IntfTable^.dwNumEntries -1 do begin {$R-} MibRow := IntfTable.Table[I]; adapter[1] :=(PChar(@MibRow.bDescr[0]) + ' @ ' + InttoStr(MibRow.dwSpeed div 1000000)+ ' MBit/s'); adapter[2] :=(PChar(@MibRow.bDescr[1]) + ' @ ' + InttoStr(MibRow.dwSpeed div 1000000)+ ' MBit/s'); adapter[3] :=(PChar(@MibRow.bDescr[2]) + ' @ ' + InttoStr(MibRow.dwSpeed div 1000000)+ ' MBit/s'); adapter[4] :=(PChar(@MibRow.bDescr[3]) + ' @ ' + InttoStr(MibRow.dwSpeed div 1000000)+ ' MBit/s'); adapter[5] :=(PChar(@MibRow.bDescr[4]) + ' @ ' + InttoStr(MibRow.dwSpeed div 1000000)+ ' MBit/s'); result := (PChar(@MibRow.bDescr[0]) + ' @ ' + InttoStr(MibRow.dwSpeed div 1000000)+ ' MBit/s' ); {$R+} end; Finally FreeMem(IntfTable); end; end; exports GetNetworkAdapter; begin end.
Delphi-Quellcode:
function GetNetworkAdapter : string;
external 'C:\Dokumente und Einstellungen\Bettina & Detlef\Desktop\Delphi\11032009\DLL4\GetNetworkAdapters.dll'; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var adapter : array of string; begin // ComboBox1.Items.Add(getnetworkadapter); getnetworkadapter; //combobox1.Items.add(adapter[1]); end; |
Re: DLL mehrere Strings auslesen
*** push ***
|
Re: DLL mehrere Strings auslesen
Mein Vorschlag wäre ja das ganze aufzusplitten:
in der DLL zwei Funktionen:
Delphi-Quellcode:
Der Aufruf müsste dann nach folgendem Schema erfolgen (Pseudocode):
function GetNetworkAdapterCount: integer;
function GetNetworkAdapter(index: integer; buffer: PChar; size: integer): integer;
Code:
GetNetworkAdapter wird also 2 mal pro Wert aufgerufen.
ac = GetNetworkAdapterCount;
for i = 0 to ac - 1 begin size = GetNetworkAdapter(i, nil, 0); -> erstelle einen Buffer mit der Länge size GetNetworkAdapter(i, buffer, size); -> verwende Buffer weiter.. z.B. als String in eine Stringlist oder in ein Array end; Im ersten Aufruf weiss die DLL durch buffer = nil dass sie die Länge des Strings zurückgeben muss. Beim zweiten Aufruf kopiert sie den String aus der DLL in den Buffer der ja in der Anwendung selbst definiert ist. Wichtig ist das kopieren, denn wenn der Buffer in der DLL freigegeben wird, ist nicht sicher ob da wirklich noch daten drin sind. Alternativ kannst du wie oben schon erwähnt auch callbacks einsetzen. |
Re: DLL mehrere Strings auslesen
Wenn du sowieso schon ShareMem verwendest, kannst du direkt ein array of String zurückgeben:
Delphi-Quellcode:
type TDynStringArray = array of String;
function GetNetworkAdapters: TDynStringArray; begin //... end; |
Re: DLL mehrere Strings auslesen
sorry aber ich schnall das nicht.
der soll mir per array of string die 4 adapter aus der dll in die combobox des programms schaufeln. |
Re: DLL mehrere Strings auslesen
Habe mich jetzt stundenlang durch google und tutorials geklickt, aber wirklich schlauer bin ich nciht geworden.
meine dll funktioniert soweit perfekt. ich kann mir die adaper schön per showmessage zeigen lassen. Nur wie bekomme ich die in die combobox oder was auch immer in mein hauptprogramm. Mit dem array of string verstehe ich das absolut nicht, bin da wohl zu blöd für. Dank an alle die mir bisher schon geholfen haben. |
Re: DLL mehrere Strings auslesen
Habe mich jetzt nochmal schlau gemacht, aber der Erfolg lässt weiter auf sich warten.
Mache es zurzeit so, dass ich in der DLL sagen muss welchen Adapter ich nun ansteuern will.
Delphi-Quellcode:
function GetNetworkAdapter(var J : integer) : string;
var MibRow: TMibIfRow; IntfTable: PMibIfTable; Size: DWORD; I : Integer; begin Size := 0; If GetIfTable(nil, Size, True) <> ERROR_INSUFFICIENT_BUFFER then Exit; IntfTable := AllocMem(Size); Try If GetIfTable(IntfTable, Size, True) = NO_ERROR then // For I := 0 to IntfTable^.dwNumEntries -1 do [b]I := 0;[/b] begin MibRow := IntfTable.Table[I]; result := (PChar(@MibRow.bDescr[0]) + ' @ ' + InttoStr(MibRow.dwSpeed div 1000000)+ ' MBit/s'); end; Finally FreeMem(IntfTable); end; end; exports GetNetworkAdapter; begin end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz