Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Kommunikation zwischen DLL und EXE (https://www.delphipraxis.net/113619-kommunikation-zwischen-dll-und-exe.html)

Paul Lincke 11. Mai 2008 16:56


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:
// 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;
Wie kann ich im Hauptprogramm korrekt meine Strings übergeben, sodass ich sie in der DLL weiterverarbeiten kann? :stupid:

Danke im Voraus!!

Larsi 11. Mai 2008 18:20

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: :)

1234588 11. Mai 2008 18:30

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:
procedure tuwas(p: PChar); stdcall; external 'miep.dll';


//aufruf

tuwas(@edit1.text[1])
so in etwa wuerde ich es machen :o)

Die Muhkuh 11. Mai 2008 18:35

Re: Kommunikation zwischen DLL und EXE
 
Hi,

schau doch mal hier. Da geht es um eine ähnliche Konstellation.

DeddyH 11. Mai 2008 18:39

Re: Kommunikation zwischen DLL und EXE
 
Jaja, während andere noch suchen, postest Du schon, das Gewitter gönne ich Dir :tongue:

Die Muhkuh 11. Mai 2008 18:43

Re: Kommunikation zwischen DLL und EXE
 
Sorry, ich hab mindestens 10 Minuten nach dem komplett anderem Thema gesucht (das hier), bis ich es dann hatte und merkte, eig. hab ich doch was anderes gesucht. :tongue:

Tjaha, Detlef, das Alter :zwinker:

Fridolin Walther 11. Mai 2008 19:05

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:
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.
Wenn Fragen da sind zum wieso oder weshalb einfach stellen :).

@1234588:
Das nutzt ihm nichts, denn so wie ich seinen Code verstanden habe, möchte er von einer Funktion einen String zurück erhalten.

Paul Lincke 11. Mai 2008 19:20

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:

Fridolin Walther 11. Mai 2008 19:33

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 ;).

Luckie 12. Mai 2008 09:58

Re: Kommunikation zwischen DLL und EXE
 
Guck mal hier: http://www.michael-puff.de/Artikel/2...String_DLL.php


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