![]() |
ActionList funktioniert nicht in DLL
Hallo.
Ich habe ein Phänomen was ich mir nicht ganz erklären kann. Ich habe eine Form (XE4) mit einer ActionList und die Actions ToolButtons zugewiesen. Das funktioniert wenn ich das Fenster normal in einem Projekt einbinde. Füge das ich das Fenster in eine DLL ein, lade die DLL in einem Programm und starte das Fenster werden die Actions nicht mehr ausgelöst. Muss ich beim create der Form in der DLL irgendwas berücksichtigen? Code:
Code:
Edit:var isFormCreated:boolean; procedure createForm(absenderAktiv:boolean);stdcall; begin FEMail := TFemail.create(application); isFormCreated := TRUE; FEMail.Icon.LoadFromResourceName(HInstance,'logo'); end; procedure showForm;stdcall; begin if not isFormCreated then createForm(false); if isFormCreated then begin FEMail.showmodal; end; end; Scheinbar bin ich nicht allein. Ok der ist von 2003 und leider keine Antwort. ![]() Edit2 : Ok ein paar andere Threads schreiben das scheinbar die application.idle Methode dafür zuständig ist und d.h das mein aufrufendes Programm dann für die Action zuständig ist? |
AW: ActionList funktioniert nicht in DLL
Du nutzt wahrscheinlich keine dynamisch geladenen BPLs, somit hat die DLL eine eiegene VCL-Kopie und kriegt wohl ncihts mit...
|
AW: ActionList funktioniert nicht in DLL
Ich nutze keine BPL, sondern DLL und diese wird aber dynamisch geladen.
|
AW: ActionList funktioniert nicht in DLL
Ja, ich weiss, das meine ich aber nicht.
Wenn Du in Delphi DLLs baust, baut der Compiler standardmäßig alles rein, RTL, VCL etc. Somit hast du alles da, was die DLL braucht um dein Zeug zu machen, man weiss ja nicht, von wem man geladen wird. Das gleiche passiert bei einer exe in Delphi. Muss man ja keine Bibliotheken mitliefern, wie zum Bsp. BPLs. Die sind dann statisch reingelinkt. Wenn Du allerdings eine Delphi anwendung mit DLLs bauen willst, die Oberfläche haben, dann solltest Du das alles dynamisch linken so dass Du dann zwar RTLXXX.bpl etc mitliefern musst, aber exe und DLL sich diese teilen, kleiner werden und vor allem gleiche Klassen-Beschreibungen, globale Objekte etc haben. Einfaches Beispiel : Nimm mal das Application Objekt von der Exe und der DLL mit statischen runtime Bibliotheken und wirst sehen, dass es unterschiedliche sind. Bei dynamisch gelinkten sind diese gleich. Im Ersten Fall hast Du auch das problem, dass TAction <> TAction ist, weil das für das programm 2 verschiedenen Klassen sind, eine Kopie in der exe, die andere in der DLL. Bei dynamisch gelinkten ist es in der BPL und somit gleich. |
AW: ActionList funktioniert nicht in DLL
Habe gerade kein Delphi zur Hand sollte aber funktionieren wenn das Application.Handle der Exe an die Dll übergeben wird.
Bau eine InitFunktion für die Dll die Das Handle bekommt. So in etwa:
Delphi-Quellcode:
Wichtig direkt nach dem Laden der Dll aufrufen.
Procedure InitDll(const aHandle : THandle) ; stdcall;
begin Applicaton.Handle := aHandle; end; Eventuell auch ein Gegenstücke wenn die Dll wieder entladen wird. Wir benutzen hier so ein Konstrukt um auch Dll's die mit verschiedenen Versionen kompiliert sind zu benutzen. Gruss Fritz |
AW: ActionList funktioniert nicht in DLL
Zitat:
Sobald das Formular in deiner Dll fertig geladen und angezeigt ist hat es ein gültiges Fensterhandle. Das teilst Du dem Hauptprogramm mit. Dann kannst Du dir via PostMessage Nachrichten schicken. Genauso gibst Du der Dll Instanz nach dem erstellen das Handle deines Hauptfensters an und dann geht es in beide Richtungen. Vorteil ist, das diese Lösung auch funktioniert wenn das Fenster direkt im Hauptprogramm eingebunden wird. |
AW: ActionList funktioniert nicht in DLL
Probiere es mal so, dass du den OnIdle-Aufruf deiner Delphi-Applikation zu deiner DLL durchreichst, damit dort CheckSynchronize aufgerufen wird:
Delphi-Quellcode:
type
TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private procedure MyIdle(Sender: TObject; var Done: Boolean); public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin Application.OnIdle := MyIdle; end; procedure TForm1.MyIdle(Sender: TObject; var Done: Boolean); begin ExampleDllFunctionNameForCheckSynchronize; end; // - - - - - - - - - // in deiner DLL: procedure ExampleDllFunctionNameForCheckSynchronize; stdcall; begin CheckSynchronize; end; exports ExampleDllFunctionNameForCheckSynchronize; |
AW: ActionList funktioniert nicht in DLL
Zitat:
|
AW: ActionList funktioniert nicht in DLL
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:24 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