![]() |
Firemonkey DLL Problem
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Zusammen!
Seit einiger Zeit quält mich ein Bug in meiner Anwendung.... Folgende Situation: Es existiert eine VCL Anwendung die nun mit einer Firemonkey dll erweitert wird. Funktioniert alles eigentlich Einwandfrei, bis auf das Schließen der Firemonkey-Form. Das Fenster hängt sich dann auf bzw. wird noch Angezeigt, hab einen Screenshot davon angefügt. Wenn man dann dazu noch die Hauptapplikation schließt, stürzt der Prozess ab bzw. hängt sich auf und die Prozessorlast schießt hoch. Hab extra ein Projekt erstellt und den Code nicht sauber formatiert, war rein zum testen deswegen nicht wundern. (Anstatt der VCL Anwendung ist es eine FMX aber effekt der Gleiche) Code von der Schnittstelle in der Host-Application
Delphi-Quellcode:
Code von der DLL:
unit Unit6;
interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, Windows, TimeCodeLib; Function Ts_CreateGrid (Filename : String; language : Integer): Integer; Function Ts_CloseWindow : Integer; //############################################################################## implementation type TDLL_CreateGrid = Function(const Filename : String; language : Integer): Integer; cdecl; TDLL_CloseWindow = Function : Integer; cdecl; var LibHandle: THandle; // Handle to the currently loaded dll myDLL_CreateGrid : TDLL_CreateGrid; myDLL_CloseWindow : TDLL_CloseWindow; const dllName = 'Test.dll'; type EDLLError = class(Exception); (******************************************************************************* *******************************************************************************) Function Ts_CloseWindow: Integer; Begin if Assigned(myDLL_CloseWindow) then begin Result := myDLL_CloseWindow; End Else Begin Result := 0; End; End; (******************************************************************************* *******************************************************************************) Function Ts_CreateGrid (Filename : String; language : Integer): Integer; Begin if Assigned(myDLL_CreateGrid) then begin Result := myDLL_CreateGrid(Filename, language); End Else Begin Result := 0; End; End; (******************************************************************************* *******************************************************************************) Procedure ActivateDLL; Begin myDLL_CreateGrid := NIL; myDLL_CloseWindow := NIL; Try LibHandle := LoadLibrary(dllName); If (LibHandle < 32) Then Begin raise EDLLError.Create('Unable to load '+dllName); End; If LibHandle >= 32 Then Begin myDLL_CreateGrid := GetProcAddress(LibHandle, 'CreateGrid'); myDLL_CloseWindow := GetProcAddress(LibHandle, 'CloseMainWindow'); End; Except // End; End; //------------------------------------------------------------------------------ initialization ActivateDLL; finalization Try FreeLibrary(LibHandle); Except End; end.
Delphi-Quellcode:
Schnittstelle in der DLL
unit UnitFMXdll;
interface uses ShareMem, Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, TimeCodeLib, Unit5; procedure CreateGrid(); cdecl; procedure CloseMainWindow; cdecl; implementation var MainForm : TForm5; {******************************************************************************* CreateGrid *******************************************************************************} procedure CreateGrid; begin try if MainForm <> nil then begin MainForm.Free; MainForm := nil; end; if MainForm = nil then begin MainForm := TForm5.Create(nil); MainForm.Show; end; except //fehler code 2! end; end; procedure CloseMainWindow; begin try if MainForm <> nil then begin // MainForm.Release; // MainForm.Close; MainForm.Release; MainForm := nil; end; except //fehler code 6! end; end; initialization MainForm := nil; finalization if MainForm <> nil then begin MainForm.Free; // MainForm := nil; end; end.
Delphi-Quellcode:
Hoffe jemand weis da vllt. etwas
library Project2;
{ Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results. This applies to all strings passed to and from your DLL--even those that are nested in records and classes. ShareMem is the interface unit to the BORLNDMM.DLL shared memory manager, which must be deployed along with your DLL. To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters. } uses ShareMem, System.SysUtils, System.Classes, UnitFMXdll in 'UnitFMXdll.pas', Unit5 in 'Unit5.pas' {Form5}; {$R *.res} exports CreateGrid name 'CreateGrid', CloseMainWindow name 'CloseNameWindow'; begin end. Beste Grüße, Eugeene |
AW: Firemonkey DLL Problem
VCL und auch FMX in einer DLL funktioniert einfach nicht richtig.
Vorallem kommt hier noch dazu, daß die RTTI bei DLLs auch noch getrennt sind, wenn EXE und DLL nicht gegen die VCL/FMX-Packages gelinkt wurden. Und du hast jetzt eine FMX-Form, welche aber von der VCL-Message-Behandlung verarbeitet wird und wo alles Zusätzliche des FMX natürlich nicht vorhanden ist. |
AW: Firemonkey DLL Problem
VCL in einer DLL funktionierte bisher einwandfrei.
Es funktioniert eigentlich alles bis auf das schließen der Form, wobei die Form nicht richtig aufgeräumt wird bzw. einfach noch unten angezeigt wird, sich aber nicht öffnen lässt. Gibt aber auch ein Whitepaper dazu ![]() Irgendwie muss das doch gehen oder? Danke für die Hilfe -Eugeene #EDIT wurde auch öfters erwähnt das GDI+ in der Main von VCL eingebunden werden muss, oder dass es daran liegt, genaueres weis ich aber nicht |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:42 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