Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi String aus DLL verschicken (https://www.delphipraxis.net/69250-string-aus-dll-verschicken.html)

gmc616 12. Mai 2006 12:09


String aus DLL verschicken
 
Hallo DP'ler,

ich habe schon einmal versucht mein Problem zu schildern (daten uebertragen von dll nach exe), hab aber leider keine erfolgsversprechende Antwort bekommen. :cry:
Vieleicht ist mein Weg dort auch der Falsche. k.A.
Deswegen möchte ich mein Anliegen etwas allgemeiner erklären. :stupid:

Mal angenommen wir würden ein ganz einfaches Testprogramm schreiben, bestehen aus einer EXE und einer DLL.
Die EXE enthält eine TForm, nennen wir sie FormEXE. Darauf befinden sich ein TButton und ein TEdit.
Unsere DLL besteht ebenfalls aus einer TForm (FormDLL), einem TButton und einem TEdit.

Funktionieren soll das ganze so:

Beim Klick auf den Button in der FormEXE soll die DLL geladen, und die FormDLL angezeigt werden.
Jetzt schreiben wir in das Edit der FormDLL etwas hinein und klicken anschließend auf den Button der FormDLL.
Nun soll der Inhalt (der String) aus FormDll.Edit an die FormEXE gesendet und dort im Edit geschrieben werden.
Das ganze soll mit einer Message funktionieren, da die EXE darauf regieren und evtl. mit dem String noch etwas anstellen soll ( AnsiUpperCase z.B.).

Ich möchte quasi in der DLL etwas tun, und wenn ich fertig bin, klicke ich auf einen Button (in der DLL), sende der EXE eine Nachricht und die EXE erledigt denn Rest (was auch immer).

Wie stelle ich das an? :gruebel:

Wichtig dabei ist, das die EXE nach dem Empfang der Nachricht keine Funktion aus der DLL rufen darf.
Später sollen nämlich in dem String alle relevanten Informationen stehen, die die EXE zum weiter arbeiten benötigt.
Und ich möchte, wenn möglich, auf Speichermanager wie ShareMem oder FastMem verzichten.

Alle meine Versuche endeten mit Schutzverletzungen und Exceptions. :wall:

Bitte helft mir weiter.
Über ein Beispiel würde ich mich tierisch freuen. :bounce2:

Danke
gmc

Luckie 12. Mai 2006 12:12

Re: String aus DLL verschicken
 
Nimm doch Hier im Forum suchenWM_COPYDATA oder Pipes oder MemoryMappedFiles.

SirThornberry 12. Mai 2006 12:19

Re: String aus DLL verschicken
 
Mir ist unklar warum du mit messages arbeiten willst wenn die DLL von der Exe selbst geladen wird. Dadurch sind die Daten ja schon in einem gemeinsam genutzten Speicherbereich so das du direkt auf die Daten zugreifen kannst.

RavenIV 12. Mai 2006 12:46

Re: String aus DLL verschicken
 
Zitat:

Zitat von SirThornberry
Mir ist unklar warum du mit messages arbeiten willst wenn die DLL von der Exe selbst geladen wird. Dadurch sind die Daten ja schon in einem gemeinsam genutzten Speicherbereich so das du direkt auf die Daten zugreifen kannst.

vermutlich soll die DLL austauschbar sein.
z.B. versch.Kunden => versch.Funktionen.

gmc616 12. Mai 2006 12:49

Re: String aus DLL verschicken
 
Mit WM_COPYDATA hab ich schon rumprobiert, wie schon in HIER beschrieben. Irgendwie habe da einen Fehler drin, weiß aber nicht wo und welchen.

Pipes funktionieren, wenn ich das richtig gelesen habe, über Sockets. Das möchte ich eigendlich nicht, weil ich nicht sicher sein kann, ob nicht später auf einem Rechner eine Firewall dazwischen steht.

MemoryMappedFiles ... hmmm :gruebel: ... schau ich mir mal an.

Eine Message deswegen, weil ich die Exe, von der DLL aus, dazu anregen möchte, etwas zu tun.
Ich wüßte sonst nicht wie, wenn nicht mit einer Message.
Schließlich kann ich doch von der DLL aus keine Funktionen der Exe rufen. Oder doch? Wenn ja, wie?

Zitat:

Zitat von SirThornberry
... wenn die DLL von der Exe selbst geladen wird. Dadurch sind die Daten ja schon in einem gemeinsam genutzten Speicherbereich so das du direkt auf die Daten zugreifen kannst.

hmm ... und wie mache ich das? :duck:

Austausch bar soll die DLL zwar nicht unbedingt sein, aber es sollen mehrere DLL's auf eine gleiche Art und Weise mit der Hostanwendung arbeiten.

RavenIV 12. Mai 2006 12:57

Re: String aus DLL verschicken
 
Zitat:

Zitat von gmc616
Pipes funktionieren, wenn ich das richtig gelesen habe, über Sockets. Das möchte ich eigendlich nicht, weil ich nicht sicher sein kann, ob nicht später auf einem Rechner eine Firewall dazwischen steht.

Papperlapap.
Das ist Kommunikation innerhalb des PCs. Die Firewall bekommt nur Verbindungen, die über die Netzwerkkarte gehen mit.

Zitat:

Zitat von gmc616
Eine Message deswegen, weil ich die Exe, von der DLL aus, dazu anregen möchte, etwas zu tun.
Ich wüßte sonst nicht wie, wenn nicht mit einer Message.
Schließlich kann ich doch von der DLL aus keine Funktionen der Exe rufen. Oder doch? Wenn ja, wie?

sicher kannst du das.

himitsu 12. Mai 2006 13:29

Re: String aus DLL verschicken
 
Zitat:

Zitat von RavenIV
Zitat:

Zitat von gmc616
Schließlich kann ich doch von der DLL aus keine Funktionen der Exe rufen. Oder doch? Wenn ja, wie?

sicher kannst du das.

genau ... du kannst z.B. eine Funktion der DLL aufrufen und dieser einen Pointer auf eine Funktion in der EXE mitgeben, diesen Pointer speicherst du und rufst darüber dann die Funktion in der EXE auf ^^

gmc616 12. Mai 2006 14:28

Re: String aus DLL verschicken
 
Cool, das funktioniert! :bounce2:

DANKE! :thumb:

Hätte ich auch selbst drauf kommen können/müssen! :oops:

Das eröffnet einem ja vollkommen neue Möglichkeiten :coder:

js747a 7. Jul 2020 13:25

AW: String aus DLL verschicken
 
du kannst z.B. eine Funktion der DLL aufrufen und dieser einen Pointer auf eine Funktion in der EXE mitgeben, diesen Pointer speicherst du und rufst darüber dann die Funktion in der EXE auf

Schön wenn einer mal ein Beispiel posten würde. Anscheinend sind hier nur Specialisten und Hobbyprogramierer verstehen immer nur ein Teil.
Und wenn mal ein Beispiel dabei ist funktioniert es nicht weil man immer noch eine andere Komponente haben muss oder es variabelen gibt die im Beispiel nicht zu finden sind.

himitsu 7. Jul 2020 13:49

AW: String aus DLL verschicken
 
Im Prinzip genauso, wie mit den bekannten Event-Methoden der VCL. (Button.OnClick usw.)
Delphi-Quellcode:
// EXE

type TMyProc: procedure({s: string}); // was Selbstdeklariertes oder was Fertiges, z.B. ala TNotifyEvent, TThreadMethod oder TThreadProcedure

function SetEvent(Value: TMyProc);
  external MyDLL;

procedure MakeIt(...); // alternativ kann man auch den Event-Zeiger hier direkt übergeben
  external MyDLL;
Delphi-Quellcode:
// DLL

type TMyProc: procedure({s: string});

var Event: TMyProc; // es muß keine globale Variable sein

function SetEvent(Value: TMyProc);
begin
  Event := Value;
end;

procedure MakeIt(...); // oder sonstwo ... z.B. aus einem Thread
begin
  ...
  if Assigned(Event) then
    Event({s});
  ...
end;
Was für einen Zeiger man nimmt, dass kann man sich gern aussuchen.
Delphi-Quellcode:
type
  TMyProc: procedure({s: string}); // nur Prozeduren und statische Klassenmethoden
  TMyProc: procedure({s: string}) of object; // nur Objektmethoden und Klassenmethoden
  TMyProc: reference to procedure({s: string}); // alles


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:30 Uhr.
Seite 1 von 2  1 2      

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