AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DLL mehrere Strings auslesen

Ein Thema von S4SH1981 · begonnen am 15. Mär 2009 · letzter Beitrag vom 25. Mär 2009
Antwort Antwort
Seite 2 von 2     12   
S4SH1981

Registriert seit: 13. Jul 2007
59 Beiträge
 
#11

Re: DLL mehrere Strings auslesen

  Alt 19. Mär 2009, 15:53
Also hier die DLL

Delphi-Quellcode:
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.
und das Programm

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;
  Mit Zitat antworten Zitat
S4SH1981

Registriert seit: 13. Jul 2007
59 Beiträge
 
#12

Re: DLL mehrere Strings auslesen

  Alt 20. Mär 2009, 13:03
*** push ***
  Mit Zitat antworten Zitat
Benutzerbild von cruiser
cruiser

Registriert seit: 23. Dez 2003
Ort: Königsbrück/Sachsen
455 Beiträge
 
Delphi 7 Enterprise
 
#13

Re: DLL mehrere Strings auslesen

  Alt 20. Mär 2009, 13:58
Mein Vorschlag wäre ja das ganze aufzusplitten:

in der DLL zwei Funktionen:

Delphi-Quellcode:
function GetNetworkAdapterCount: integer;

function GetNetworkAdapter(index: integer; buffer: PChar; size: integer): integer;
Der Aufruf müsste dann nach folgendem Schema erfolgen (Pseudocode):

Code:
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;
GetNetworkAdapter wird also 2 mal pro Wert aufgerufen.

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.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#14

Re: DLL mehrere Strings auslesen

  Alt 20. Mär 2009, 14:02
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;
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
S4SH1981

Registriert seit: 13. Jul 2007
59 Beiträge
 
#15

Re: DLL mehrere Strings auslesen

  Alt 20. Mär 2009, 16:47
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.
  Mit Zitat antworten Zitat
S4SH1981

Registriert seit: 13. Jul 2007
59 Beiträge
 
#16

Re: DLL mehrere Strings auslesen

  Alt 20. Mär 2009, 21:35
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.
  Mit Zitat antworten Zitat
S4SH1981

Registriert seit: 13. Jul 2007
59 Beiträge
 
#17

Re: DLL mehrere Strings auslesen

  Alt 25. Mär 2009, 19:14
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz