![]() |
Kommunikation zwischen DLL und EXE
Hallo.
Mir ist kein besserer Titel eingefallen, wer was besseres weiß, nur zu... Ich fang mal sofort an:
Delphi-Quellcode:
Wie kann ich im Hauptprogramm korrekt meine Strings übergeben, sodass ich sie in der DLL weiterverarbeiten kann? :stupid:
// gemeinsame Unit
type TData = packed record MyVar: PChar; end; PData=^TData; // DLL var Data: PData; begin New(Data); CallBack_GetData(Data); // ruft die procedure "GetData" aus dem Hauptprogramm auf //mach was mit Data.MyVar Dispose(Data); end; //Hauptprogramm procedure GetData(var MyP: PData); begin MyP.MyVar:=PChar(SomeEdit.Text); // hier ist meine Problemzone :-/ end; Danke im Voraus!! |
Re: Kommunikation zwischen DLL und EXE
Da ich mich mit Dlls nicht sonderlich auskenne, würde ich vorschlagen, dass du mal die Suche bemühst, also oben in der Website unter "Suchen". Ich glaube, dort könntest du vielleicht deine Lösung finden. Dann nochmal Herzlich Willkommen hier in der Delphi-Praxis, Paul Lincke :dp: :)
|
Re: Kommunikation zwischen DLL und EXE
Delphi-Quellcode:
library miep;
uses Windows; procedure tuwas(p: PChar); stdcall; begin Messagebox(0, p, p, MB_OK); end; exports tuwas index 1 name 'tuwas'; begin end.
Delphi-Quellcode:
so in etwa wuerde ich es machen :o)
procedure tuwas(p: PChar); stdcall; external 'miep.dll';
//aufruf tuwas(@edit1.text[1]) |
Re: Kommunikation zwischen DLL und EXE
|
Re: Kommunikation zwischen DLL und EXE
Jaja, während andere noch suchen, postest Du schon, das Gewitter gönne ich Dir :tongue:
|
Re: Kommunikation zwischen DLL und EXE
Sorry, ich hab mindestens 10 Minuten nach dem komplett anderem Thema gesucht (
![]() Tjaha, Detlef, das Alter :zwinker: |
Re: Kommunikation zwischen DLL und EXE
Der hochoffizielle Weg wäre folgender:
1. Der Caller (also die Funktion bzw. Prozedur die GetData aufruft) fordert Speicher an um den String zu erhalten. Dazu muss er natürlich wissen wieviel Speicher gebraucht wird. Entweder steht dies im Vorfeld schon fest weil es eine maximal Größe für den String gibt oder aber man ermittelt die Größe über einen separaten API Call. 2. Der Caller übergibt den Buffer und die Größe dann an die aufzurufende Funktion (GetData) die entsprechend den String in den Buffer kopiert. 3. Nachdem der Caller dann mit dem String gemacht hat was immer er machen wollte, gibt er den Speicher wieder frei. Eine Beispielimplementation findest Du hier:
Delphi-Quellcode:
Wenn Fragen da sind zum wieso oder weshalb einfach stellen :).
program Project1;
{$APPTYPE CONSOLE} uses windows; const MyString = 'Ich bin ein toller Teststring!'; function GetData(Buffer : PChar; BufferSize : cardinal) : cardinal; stdcall; begin if (BufferSize < Length(MyString) + 1) or IsBadWritePtr(Buffer, BufferSize) then // Buffer ist nicht groß genug oder wir haben keinen Schreibzugriff auf den Speicher. // Folglich geben wir die benötigte Größe zurück. result := Length(MyString) + 1 else begin // Buffer ist groß genug, also wird er mit Nullbytes gefüllt und danach // wird der String rüberkopiert. ZeroMemory(Buffer, BufferSize); CopyMemory(Buffer, @MyString[1], Length(MyString)); result := 0; end; end; var Data : PChar; DataSize : cardinal; begin // Wir müssen zuerst wissen wie groß der String ist, den wir holen wollen. // Wenn er eine fixe (maximale) Größe hat, kann man den Schritt einfach skipen. DataSize := GetData(nil, 0); writeln('DataSize: ', DataSize); GetMem(Data, DataSize); if GetData(Data, DataSize) <> 0 then writeln('Fehler beim Aufruf der Funktion.') else writeln(string(Data)); FreeMem(Data); readln; end. @1234588: Das nutzt ihm nichts, denn so wie ich seinen Code verstanden habe, möchte er von einer Funktion einen String zurück erhalten. |
Re: Kommunikation zwischen DLL und EXE
Danke für die freundliche Begrüßung und die vielen Antworten. :)
Bin bereits beim Suchen, Lesen und Verstehen, allerdings wollte ich noch anmerken (besonders @Vorposter), dass TData mehrere PChars enthält (hatte zur Demonstration nur den einen deklariert). Darum arbeite ich auch mit einem Record. Danke nochmal, melde mich sobald ich alles durchhab. :coder: |
Re: Kommunikation zwischen DLL und EXE
Nunja, ob ein String oder mehrere ist doch letztlich das selbe in grün ;). Allerdings ist die von mir beschriebene Methode die, mit der man in den meisten Fällen auf der sicheren Seite ist. Wie sieht der finale Record denn aus? Was sind das letztlich für Strings? In vielen Fällen (Dateinamen z.B.) ist die Größe ohnehin limitiert, weshalb man auf eine dynamische Ermittlung der benötigten Größe verzichten könnte zum Beispiel. Je mehr Infos du rausrückst um so eher wird Dir jemand helfen können ;).
|
Re: Kommunikation zwischen DLL und EXE
Guck mal hier:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:11 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