AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Firemonkey DLL Problem

Ein Thema von Kenrai · begonnen am 18. Jun 2015 · letzter Beitrag vom 18. Jun 2015
Antwort Antwort
Kenrai

Registriert seit: 4. Jun 2014
11 Beiträge
 
#1

Firemonkey DLL Problem

  Alt 18. Jun 2015, 14:21
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:
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.
Code von der DLL:

Delphi-Quellcode:
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.
Schnittstelle in der DLL

Delphi-Quellcode:
 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.
Hoffe jemand weis da vllt. etwas

Beste Grüße,
Eugeene
Miniaturansicht angehängter Grafiken
unbenannt.png  
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.080 Beiträge
 
Delphi 12 Athens
 
#2

AW: Firemonkey DLL Problem

  Alt 18. Jun 2015, 14:35
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Kenrai

Registriert seit: 4. Jun 2014
11 Beiträge
 
#3

AW: Firemonkey DLL Problem

  Alt 18. Jun 2015, 14:55
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 http://www.danysoft.com/free/firemonkey-vcl.pdf
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

Geändert von Kenrai (18. Jun 2015 um 14:58 Uhr)
  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 02:55 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