Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi KEINE Nachricht an Programm schicken ... (https://www.delphipraxis.net/88869-keine-nachricht-programm-schicken.html)

gmc616 22. Mär 2007 11:25


KEINE Nachricht an Programm schicken ...
 
Hallo DP,

Folgendes Scenario:
Ich schreibe an einem Hauptprogramm und einer Editor-DLL.
Mein Hauptprogramm lädt ein Dokument aus einer Datenbank und speichert es auf Platte. Dann lädt es dyn. die Editor-DLL welche dann das Dokument zur Bearbeitung öffnet. Wunderbar, das funktioniert.

Wenn ich das Dokument wieder speichern möchte, habe ich es bis jetzt so gelöst, das die DLL das Dokument auf die Platte schreibt und danach dem Hauptprogramm per PostMessage eine Nachricht schickt. Bei Empfang der Nachricht kopiert das Hauptprogramm das Dokument wieder in die Datenbank und beendet ggf. die Editor-Dll.

Um Dokumente zu öffnen nutze ich im Hauptprogramm (m)eine Klasse TMyDoc die im Create die DLL lädt, im Destroy sie wieder aus dem Speicher entfernt und natürlich die proceduren LoadDoc und SaveDoc.

Das Problem:
Was mir an der ganzes Sache überhaupt nicht gefällt, ist das Senden einer Message von der DLL ins Hauptprogramm um das Dokument zu speichern. Das ist irgendwie :wall:

Dafür muß es doch eine bessere Lösung geben. Könnt ihr mir da helfen?

Voraussetzungen sind aber:
Die DLL baut keine Verbindungen mit der DB auf und
Ich kann/darf keinen Speichermanager verwenden.

Ich stelle mir eher sowas vor, dass die Message direkt an die Klasse in der Hauptanwendung geht,
oder das die DLL die TmyDoc.SaveDoc-Funktion ruft.

Ziel des ganzen soll es werden, das mein Hauptprogramm gleichzeigt mehrere Dokumente öffnen kann, in dem es für jedes Dokumente eine Instanz von TMyDoc erstellt. Ich denke die Idee ist so falsch nicht, oder.

Wie weiß nicht wie man das realisieren kann und hoffe ich könnt mir einen Weg zeigen.
Ich paar Stichworte täten zur Not schon reichen :zwinker:

Grüße
gmc


P.S. Sorry für den Titel, aber es ist schwer für das Problem eine treffsichere Schlagzeile zu finden.

Robert Marquardt 22. Mär 2007 11:46

Re: KEINE Nachricht an Programm schicken ...
 
Wo ist das Problem die Daten direkt im Speicher zu uebergeben?
Eine DLL wird in den Adressraum des Prozesses geladen und daher kann man Speicheradressen problemlos uebergeben.
Es wird also an die DLL in einem Funktionsaufruf ein Puffer mit dem Text und Pufferlaenge uebergeben und die DLL vergnuegt sich mit dem Puffer.
Beim PostMessage kann man nun diesen Zeiger auf den Puffer problemlos als LPARAM verwenden.

Die Frage ist ob das Hauptprogramm und der Editor parallel laufen. Wenn ja dann ist PostMessage der richtige Weg.

gmc616 22. Mär 2007 13:48

Re: KEINE Nachricht an Programm schicken ...
 
Sowas in der Art habe ich schon mal probiert.

Was ich nicht hinbekommen habe ist, wenn sich die Puffergröße ändert bzw. größer wird, bekomme ich eine Schutzverletzung beim Schreiben auf Adresse xyz. Klingt für mich auch irgendwie logisch.
Das würde evtl. ein Speichermanager handlen, aber den kann ich nicht verwenden, da ich in meinem Hauptprogramm noch weitere (Fremd-)Dll's verwende die einen Speichermanager nicht vertragen. Warum auch immer.

... Und in der Editor-DLL nutze ich zum bearbeiten des Dokumentes eine ActiveX-Komponente die nur die Methode LoadFromFile kennt.
Wäre einfacher der Kompo den Filenamen zugeben und Ruhe is.

Hmm ...
Ich bin grad am googlen und dabei über den Begiff CallBack-Funktion gestoßen.
Kapiert habe ich noch nicht ob und wie mir das helfen.

Was ich auch schon probiert habe ist einen Methodenzeiger von TMyDoc.SaveDoc in die DLL zu übergeben und von da aus zu rufen.
Aber auch hier bekomme ich eine Schutzverletzung, wenn ... ( :gruebel: Ach man , was ging da doch gleich schief?)

Was ich doch eigentlich nur möchte ist, dass ich beim Klick auf dem Speichern-Button in der Dll, die richtig TMyDoc-Instanz im Hauptprogramm die SaveDoc-Procedure ruft.

Das muß doch irgendwie gehen ... :coder2:

:hi:

alzaimar 22. Mär 2007 13:54

Re: KEINE Nachricht an Programm schicken ...
 
Äh....

Wieso über PostMessage? Wieso nicht einfach als einfache Prozedur mit RückgabeParameter?


Delphi-Quellcode:
...
  LoadLibrary...;
  MyEditor := GetProcAddress ...;
  MyEditor (Buffer^, BufferLen, ModalResult);
  If ModalResult = mrOk Then
     SaveBuffer;
...
Oder hab ich was übersehen?

Ah, sehe gerade, das sich der buffer ändert... nun denn, dann eben über die Datei. Aber OB der Anwender auf OK oder CANCEL gedrückt hat, kann man doch nun wirklich über einen Rückgabeparameter lösen. So mach ich das jedenfalls.

brechi 22. Mär 2007 13:58

Re: KEINE Nachricht an Programm schicken ...
 
Delphi-Quellcode:
// hauptprogramm

// wird von der dll aufgerufen
procedure CallBack(a,b,c...) stdcall;
begin
  // mach was
end;

procedure InitCallBack;
var SetCallBack: procedure(P: Pointer); stdcall;
begin
  SetCallBack := GetProcAddress(LoadLibrary('dllname.dll'), SetCallBack);
  SetCallBack(@CallBack);
end;

// dll

var CallBackFunction: procedure(a,b,c...); stdcall;

function SetCallBack(P: Pointer); stdcall;
begin
  CallBackFunction := p;
end;

// wenn nun vom hautpprogramm der callback aufgerufne werden soll:
  if @CallBackFunction <> nil then
    CallBckFuncion(a,b,c...);


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:03 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