AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi KEINE Nachricht an Programm schicken ...
Thema durchsuchen
Ansicht
Themen-Optionen

KEINE Nachricht an Programm schicken ...

Ein Thema von gmc616 · begonnen am 22. Mär 2007 · letzter Beitrag vom 22. Mär 2007
Antwort Antwort
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#1

KEINE Nachricht an Programm schicken ...

  Alt 22. Mär 2007, 12:25
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

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

Grüße
gmc


P.S. Sorry für den Titel, aber es ist schwer für das Problem eine treffsichere Schlagzeile zu finden.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#2

Re: KEINE Nachricht an Programm schicken ...

  Alt 22. Mär 2007, 12:46
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.
  Mit Zitat antworten Zitat
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: KEINE Nachricht an Programm schicken ...

  Alt 22. Mär 2007, 14:48
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 ... ( 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 ...

  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: KEINE Nachricht an Programm schicken ...

  Alt 22. Mär 2007, 14:54
Ä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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#5

Re: KEINE Nachricht an Programm schicken ...

  Alt 22. Mär 2007, 14:58
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...);
  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 06:30 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