Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Von MDI Child einer DLL auf Funktion in Main zugreifen (https://www.delphipraxis.net/64566-von-mdi-child-einer-dll-auf-funktion-main-zugreifen.html)

alemone 5. Mär 2006 11:26


Von MDI Child einer DLL auf Funktion in Main zugreifen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi!

Ich versuche, bei einer (dyn.) DLL Einbindung von der MDI der DLL auf eine Funktion in der Main zuzugreifen (Funktion startet FreeLibrary Prozess), erhalte allerdings immer eine Access Violation Meldung. :gruebel:

Main, Dll und Midi haben eine Type Erklaerung fuer die aufzurufende Funktion in der Main. Ein Pointer zu dieser Funktion wird beim Aufruf der Dll uebergeben, welche wiederum diesen Pointer an die MDI weitergibt (public Erklaerung einer Type Varibel).
Die Midi wird angezeigt, aber bei der FormCloseQuery, in der die Funktion der Main aufgerufen wird, entsteht dann der Fehler.

Wohl uebersehe ich etwas oder mache etwas gravierend falsch, sehe aber den Fehler nicht. Fuer denjenigen, der die Geduld hat, haenge ich das Projekt (D6) an.

Danke!

alemone 14. Mär 2006 10:56

Re: Von MDI Child einer DLL auf Funktion in Main zugreifen
 
:(

Hat niemand Zeit oder Lust, sich des Problems anzunehmen?

xaromz 14. Mär 2006 14:47

Re: Von MDI Child einer DLL auf Funktion in Main zugreifen
 
Hallo,

Dein Problem ist folgendes:
Du greifst von der DLL aus auf Deine Hauptanwendung zu. Die Hauptanwendung soll die DLL rausschmeissen und dann zur DLL zurückkehren. Das kann natürlich nicht funktionieren.

Hier die Lösung:

Du baust Dir eine eigene Message-Konstante:
Delphi-Quellcode:
const
  WM_CLOSEFORM = WM_USER + 1;
Jetzt baust Du Dir eine Methode, die die Message verarbeitet:
Delphi-Quellcode:
private
  procedure CloseForm(var Msg: TMessage); message WM_CLOSEFORM;
.
.
.
procedure TForm1.CloseForm(var Msg: TMessage);
begin
  FreeLibrary(Msg.WParam);
end;
In Deiner DLL musst Du jetzt nur noch die Message abschicken (mit der richtigen Nummer als Argument):
Delphi-Quellcode:
procedure TmdForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
   N: Integer;
begin
  N := 1;
  PostMessage(Application.MainForm.Handle, WM_CLOSEFORM, N, 0);
end;
Dadurch wird sichergestellt, dass Deine Hauptanwendung die Message erst verarbeitet, wenn die DLL fertig ist.

Gruß
xaromz

alemone 14. Mär 2006 15:12

Re: Von MDI Child einer DLL auf Funktion in Main zugreifen
 
Das ist es, xaromz!

Danke Dir!! Bin etwas bloed, haette auch in diese Richtung denken sollen, habe mich aber auf den Funktionsaufruf festgebissen. Warum: die Anwendung wird fast vollkommen aus DLLs zusammengestellt, da auf der einen Seite gross (in der Zukunft) und auf der anderen nur nach und nach fertig. Die Idee war, spaeter auch einige "Cleanup/Backup/etc." Routinen in der Main für die MDIs/DLLs zur Verfuegung zu stellen (daher der Funktionsaufruf).
Und zur Eile: ohne das "Lego"-Konzept habe ich keine einzige Zeile schreiben koennen. Die erte MDI muss/soll in einer Woche laufen und das Konzept der Main muss bis dahin stehen.

Danke nochmals!! :thumb:

alemone 14. Mär 2006 16:43

Re: Von MDI Child einer DLL auf Funktion in Main zugreifen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Habe die Message Procedure eingebunden, funktioniert ohne Access Violation, aber jetzt verschwindet meine Main Form (Exe bleibt aktiv in Memory).

Das Projekt (D6) ist im Anhang (mit Message Procedure).

Danke!


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