2.
Wenn in der
DLL TForm verwendet wird, enthält die
DLL eine komplett eigenständige Kopie der
VCL.
Die
VCL verwendet ebenfalls globale Variablen, insbesondere "Application".
"Application.Handle" muss vor der Verwendung der
VCL in der
DLL einmalig gesetzt werden.
Delphi-Quellcode:
{in der DLL, Handle der Anwendung übernehmen}
procedure InitVCL(AHandle: THandle);
stdcall;
begin
Application.Handle := AHandle;
end;
{in der Anwendung, Handle der Anwendung übergeben}
...
InitVCL(Application.Handle);
Ich hab mir das mal zu Gemüte geführt. Hab das meiner Meinung nach auch korrekt umgesetzt, allerdings kommt jetzt irgendwann im Erstellungsprozess die
Exception
Exception-Klasse EOSError mit Meldung
System Error. Code 1400. Ungültiges Fensterhandle.
Application war auch zu Beginn nicht verfügbar, da die
Unit Vcl.Forms nicht eingebunden war. Ich möchte jetzt sicher gehen, dass ich das korrekt verstanden hab: das soll schon in der
DLL gesetzt werden, richtig? Nicht erst "während" des Konstruktors des eigentlichen TForm-Objekts? Da wäre es meiner Meinung nach nämlich zu spät, aber ich will da lieber nochmal nachfragen. Das sieht jetzt ungefähr so aus:
Delphi-Quellcode:
// In der DLL
procedure CreateSearch(
{... ;} AHnd: THandle);
cdecl;
begin
Application.Handle := AHnd;
// hier ist das ja korrekt oder?
FDynamicSearchDlg := TFormDynamicSearchDialog.Create(
{...});
// hier als Parameter wäre zu spät, richtig?
// usw.
end;
// Im DLL-Interface (-> außerhalb der DLL, in der EXE drinnen sozusagen)
CreateSearch(
{...;}, Application.Handle);