Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi FMX und VCL verbinden (https://www.delphipraxis.net/202009-fmx-und-vcl-verbinden.html)

Minz3 23. Sep 2019 10:24

AW: FMX und VCL verbinden
 
Noch eine Frage zum Verständnis:

Die Art und Weise, wie das ganze funktioniert ist doch folgende:

Die Main Unit beinhaltet die VCL Form und die Grundfunktionen, die FMX Unit beinhaltet die FMX Form und FireMonkey Funktionen. Die FMX Unit gibt die Prozeduren und Funktionen über den Befehl
Delphi-Quellcode:
procedure TestProc; export;
an die DLL frei.

In der DLL befinden sich die Informationen, auf welche Unit zugegriffen wird (für die Quellfunktionen) und welche Funktionen/Prozeduren exportiert werden.

In der Main Unit werden dann die Funktionen mit Hilfe der DLL geladen und aufgerufen. Entweder per Initialisierung oder als Funktionsdeklaration.
Delphi-Quellcode:
initialization
  if DllHandle = 0 then begin
    DllHandle := LoadLibrary('ProjectDLL.dll');
    if DllHandle > 0 then begin
      //@TestFunc := GetProcAddress(DllHandle, 'TestFunc');
      DllHandle := LoadLibrary('ProjectDLL.dll');
    End else begin
      MessageDlg('ProjectDLL.dll steht nicht zur Verfügung', mtInformation, [mbOK], 0);
    end;
end;

finalization
if DLLHandle <> 0 then
  FreeLibrary(DLLHandle);
Delphi-Quellcode:
procedure TestProc; external 'ProjectDLL.dll' name 'TestProc';
An welcher Stelle kommt dann die "ProjectDLLInterface" Unit von Rolf zum Einsatz?

Habe ich das so richtig verstanden oder hab ich was falsch wiedergegeben?

Minz3 23. Sep 2019 13:20

AW: FMX und VCL verbinden
 
Kleines Update:
Ich teste ja fleißig und probiere verschiedene Methoden.

Mir ist aufgefallen, dass bei den beiden Zugriffsmöglichkeiten auf die DLL bei verschiedenen Adressen die Zugriffsverletzung eintritt.

Bei der ersten Variante über
Delphi-Quellcode:
initialization
  if DllHandle = 0 then begin
    DllHandle := LoadLibrary('ProjectDLL.dll');
    if DllHandle > 0 then begin
      TestProc := GetProcAddress(DllHandle, 'TestProc');
      DllHandle := LoadLibrary('ProjectDLL.dll');
    End else begin
      MessageDlg('ProjectDLL.dll steht nicht zur Verfügung', mtInformation, [mbOK], 0);
    end;
end;

finalization
if DLLHandle <> 0 then
  FreeLibrary(DLLHandle)
kommt der Fehler:
"Zugriffsverletzung bei Adresse 047E30E3 in Modul 'ProjectDLL.dll'. Lesen von Adresse 000000B0"

Während bei der Methode:
Delphi-Quellcode:
procedure TestProc; external 'ProjectDLL.dll' name 'TestProc';
die Meldung:
"Zugriffsverletzung bei Adresse 02A630E3 in Modul 'ProjectDLL.dll'. Lesen von Adresse 000000B0"
kommt.

DeddyH 23. Sep 2019 13:22

AW: FMX und VCL verbinden
 
Du solltest das Formular in der DLL vielleicht besser erst einmal erzeugen, bevor Du es anzeigst.

Minz3 23. Sep 2019 13:46

AW: FMX und VCL verbinden
 
Zitat:

Zitat von DeddyH (Beitrag 1447540)
Du solltest das Formular in der DLL vielleicht besser erst einmal erzeugen, bevor Du es anzeigst.

Hoffe das hab ich richtig umgesetzt (bin ja noch Neuling im Umgang mit DLL Files)

Unit1FMX.pas (befindet sich im DLL Projekt)
Delphi-Quellcode:
procedure TestProc;
begin
  FMXForm1 := TFMXForm1.Create(Application);
  FMXForm1.ShowModal;
end;
Ich vermute aber, dass ich da einen Fehler gemacht habe. :pale:

DeddyH 23. Sep 2019 13:49

AW: FMX und VCL verbinden
 
Versuch es mal so (die globale Variable kannst Du eigentlich löschen):
Delphi-Quellcode:
procedure TestProc;
var
  frm: TFMXForm1;
begin
  frm := TFMXForm1.Create(nil);
  try
    frm.ShowModal;
  finally
    frm.Free;
  end;
end;

Minz3 23. Sep 2019 14:05

AW: FMX und VCL verbinden
 
Nope das hat leider auch nicht geholfen, sieht aber auf jeden Fall richtiger aus.

Ich habe die Vermutung, dass der Fehler weiter vorne liegen muss, also habe ich den Zugriff auf die DLL vielleicht nicht richtig umgesetzt.

DeddyH 23. Sep 2019 14:15

AW: FMX und VCL verbinden
 
Zitat:

Delphi-Quellcode:
initialization
  if DllHandle = 0 then begin
    DllHandle := LoadLibrary('ProjectDLL.dll');
    if DllHandle > 0 then begin
      TestProc := GetProcAddress(DllHandle, 'TestProc');
      // Wozu denn das?
      DllHandle := LoadLibrary('ProjectDLL.dll');
    End else begin
      MessageDlg('ProjectDLL.dll steht nicht zur Verfügung', mtInformation, [mbOK], 0);
    end;
end;

Wieso lädst Du die DLL noch einmal, wenn sie bereits erfolgreich geladen wurde?

Minz3 23. Sep 2019 14:21

AW: FMX und VCL verbinden
 
Da hab ich gepennt. Danke für den Hinweis! Der Schritt ist natürlich überflüssig.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:23 Uhr.
Seite 2 von 2     12   

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