AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein ActionList funktioniert nicht in DLL
Thema durchsuchen
Ansicht
Themen-Optionen

ActionList funktioniert nicht in DLL

Ein Thema von stalkingwolf · begonnen am 15. Jun 2020 · letzter Beitrag vom 15. Jun 2020
Antwort Antwort
stalkingwolf

Registriert seit: 6. Mai 2011
540 Beiträge
 
#1

ActionList funktioniert nicht in DLL

  Alt 15. Jun 2020, 12:52
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:

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;
Edit:
Scheinbar bin ich nicht allein. Ok der ist von 2003 und leider keine Antwort.
http://www.delphigroups.info/2/8b/352235.html

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?

Geändert von stalkingwolf (15. Jun 2020 um 12:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
675 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: ActionList funktioniert nicht in DLL

  Alt 15. Jun 2020, 14:55
Du nutzt wahrscheinlich keine dynamisch geladenen BPLs, somit hat die DLL eine eiegene VCL-Kopie und kriegt wohl ncihts mit...
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
540 Beiträge
 
#3

AW: ActionList funktioniert nicht in DLL

  Alt 15. Jun 2020, 15:05
Ich nutze keine BPL, sondern DLL und diese wird aber dynamisch geladen.
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
675 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: ActionList funktioniert nicht in DLL

  Alt 15. Jun 2020, 16:00
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.
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: ActionList funktioniert nicht in DLL

  Alt 15. Jun 2020, 16:22
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:
Procedure InitDll(const aHandle : THandle) ; stdcall;
begin
 Applicaton.Handle := aHandle;
end;
Wichtig direkt nach dem Laden der Dll aufrufen.
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
Fritz Westermann
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
677 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: ActionList funktioniert nicht in DLL

  Alt 15. Jun 2020, 16:38
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?
Genau. Eine Dll ist ja auch eine Anwendung. Nur dass dort Application eben nicht viel macht.
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.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: ActionList funktioniert nicht in DLL

  Alt 15. Jun 2020, 16:41
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;
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
540 Beiträge
 
#8

AW: ActionList funktioniert nicht in DLL

  Alt 15. Jun 2020, 16:50
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.
Wenn ich das mache, dann hagelt es bei den Actions die Meldung "Externe Exception C000001D."
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
540 Beiträge
 
#9

AW: ActionList funktioniert nicht in DLL

  Alt 15. Jun 2020, 17:22
Probiere es mal so, dass du den OnIdle-Aufruf deiner Delphi-Applikation zu deiner DLL durchreichst, damit dort CheckSynchronize aufgerufen wird:
Das hat leider nichts gebracht.
  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 05:20 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