AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Kommunikation zwischen DLL und EXE
Thema durchsuchen
Ansicht
Themen-Optionen

Kommunikation zwischen DLL und EXE

Ein Thema von Paul Lincke · begonnen am 11. Mai 2008 · letzter Beitrag vom 12. Mai 2008
Antwort Antwort
Paul Lincke

Registriert seit: 4. Jan 2008
2 Beiträge
 
Turbo Delphi für Win32
 
#1

Kommunikation zwischen DLL und EXE

  Alt 11. Mai 2008, 16:56
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?

Danke im Voraus!!
  Mit Zitat antworten Zitat
Larsi

Registriert seit: 10. Feb 2007
2.262 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Kommunikation zwischen DLL und EXE

  Alt 11. Mai 2008, 18:20
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
Ein Tag ohne Delphi ist ein verlorener Tag!

Homepage zu meinem neuen Programm: StreamZ
  Mit Zitat antworten Zitat
1234588

Registriert seit: 14. Jan 2007
Ort: Stuttgart
164 Beiträge
 
#3

Re: Kommunikation zwischen DLL und EXE

  Alt 11. Mai 2008, 18:30
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)
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Kommunikation zwischen DLL und EXE

  Alt 11. Mai 2008, 18:35
Hi,

schau doch mal hier. Da geht es um eine ähnliche Konstellation.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Kommunikation zwischen DLL und EXE

  Alt 11. Mai 2008, 18:39
Jaja, während andere noch suchen, postest Du schon, das Gewitter gönne ich Dir
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Kommunikation zwischen DLL und EXE

  Alt 11. Mai 2008, 18:43
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.

Tjaha, Detlef, das Alter
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#7

Re: Kommunikation zwischen DLL und EXE

  Alt 11. Mai 2008, 19:05
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.
Fridolin Walther
  Mit Zitat antworten Zitat
Paul Lincke

Registriert seit: 4. Jan 2008
2 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Kommunikation zwischen DLL und EXE

  Alt 11. Mai 2008, 19:20
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.
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#9

Re: Kommunikation zwischen DLL und EXE

  Alt 11. Mai 2008, 19:33
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 .
Fridolin Walther
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Kommunikation zwischen DLL und EXE

  Alt 12. Mai 2008, 09:58
Guck mal hier: http://www.michael-puff.de/Artikel/2...String_DLL.php
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort


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