![]() |
Dll Forms... oder ligt es nicht daran ??
erst mal meine dateien :
die Library :
Delphi-Quellcode:
so nun die KMain.pas :
library Kundendaten;
uses SysUtils, Classes, forms, kMain in 'kMain.pas' {KundendatenF}; {$E dll} {$R *.res} Procedure PluginMain(Befehl : PChar; Parameter : Pointer); stdcall; begin KundenDatenF := TKundenDatenF.Create(Application); try KundenDatenF.Show; finally KundenDatenF.Release; end; end; exports PluginMain; begin end.
Delphi-Quellcode:
das sind die Daten gewesen aus der DLL.
unit kMain;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TKundendatenF = class(TForm) Button1 : TButton; private { Private-Deklarationen } public { Public-Deklarationen } end; var KundendatenF: TKundendatenF; implementation {$R *.dfm} end. Nun mache ich in der Hauptanwendung Folgendes : ich habe mir eine unit Plugins angelegt die so aussieht :
Delphi-Quellcode:
und das Hauptfenster in der anwendung hat folgendes aussehen :
unit plugins;
interface uses SysUtils, windows, Dialogs, forms; type TPlugin = procedure(Befehl : PChar; Parameter : Pointer); stdcall; procedure PluginMain(Befehl : PChar; Parameter : Pointer); implementation procedure PluginMain(Befehl : PChar; Parameter : Pointer); var Plugin: TPlugin; Handle: THandle; begin Handle:=LoadLibrary(PChar(ExtractFilePath(ParamStr(0))+'..\lib\kundendaten.dll')); if Handle <> 0 then begin @Plugin := GetProcAddress(Handle, 'PluginMain'); if @Plugin <> nil then begin Plugin(Befehl, Parameter); end; FreeLibrary(Handle); end; end; end.
Delphi-Quellcode:
jetzt sobald ich auf den Button1 klicke um das Plugin zu starten bekome ich folgenden Fehler (Keine Fehlermeldung)
unit HostFenster;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation uses plugins; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin PluginMain('',nil); end; end. Er erstellt das Formular. und das Verschwindet sogleich wieder.. Kann also nicht daran arbeiten. Kann mir jemand sagen warum ? gruss Sascha |
Re: Dll Forms... oder ligt es nicht daran ??
Du gibst die DLL gleich nach dem Erstellen und dem Anzeigen der Form wieder frei. Dadurch wird auch das Formular beendet und existiert demzufolge auch nicht mehr.
|
Re: Dll Forms... oder ligt es nicht daran ??
Zitat:
Release sollte man nur in Event-Handlern benutzen, die in dem betroffenen Formular deklariert sind. Ansonsten .Free verwenden. |
Re: Dll Forms... oder ligt es nicht daran ??
das
Delphi-Quellcode:
Ändert nicht ans meinem Problem.
KundenDatenF.Release;
auch wenn ich das nicht da stehen habe schliesst er das gleich wieder.... :gruebel: |
Re: Dll Forms... oder ligt es nicht daran ??
Versuch ohne Owner:
Delphi-Quellcode:
TKundenForm.Create(nil);
|
Re: Dll Forms... oder ligt es nicht daran ??
Delphi-Quellcode:
Da liegt dein Problem. Deine Plugin-Routine macht nichts anderes als das Formular zu Erzeugen und anzuzeigen (im Speicherbereich der DLL). Danach springt sie zurück und du gibst die DLL frei (und damit auch das Formular). Was soll er also noch anzeigen ?
procedure PluginMain(Befehl : PChar; Parameter : Pointer);
var Plugin: TPlugin; Handle: THandle; begin Handle:=LoadLibrary(PChar(ExtractFilePath(ParamStr(0))+'..\lib\kundendaten.dll')); if Handle <> 0 then begin @Plugin := GetProcAddress(Handle, 'PluginMain'); if @Plugin <> nil then begin Plugin(Befehl, Parameter); end; FreeLibrary(Handle); end; end; Formulare in DLL's ist eh eine sehr kritische Sache (such mal hier in der DP nach den Stichwörtern Plugin und Form). |
Re: Dll Forms... oder ligt es nicht daran ??
was ich nicht verstehe warum wartet die anwendung nicht auf eine Bestätigung der dll das das Formular mit close oder release geschlossen wurde ??
Ich kann auf jeden fall nichts auf dem erstellten Formular anklicken. Auch wenn ich es als eine Funktion mache nicht. Wollte mit ShowModal arbeiten aber sobald ich das verwende bekomme ich die meldung das aus einem Sichtbaren Formular kein Modales gemacht werden kann. Auch mit
Delphi-Quellcode:
bekomme ich eine Fehlermeldung.
TKundenForm.Create(nil);
Irgend wie komisch das ganze. werde nachher mal schauen nach dll form in der Suche. Aber wenn jemand eine Andre lösung hat bin ich Ganz Auge :mrgreen: |
Re: Dll Forms... oder ligt es nicht daran ??
Du brauchst auf jeden Fall ShowModal. Sonst wird das Formular ja direkt danach freigegeben. Versuch mal vor dem ShowModal noch ein Hide.
|
Re: Dll Forms... oder ligt es nicht daran ??
Auch schon versucht. Geht auch nicht.
Keine ahnung was da nicht so funktioniert wie es soll... Bin etwas am ende meines Lateins. |
Re: Dll Forms... oder ligt es nicht daran ??
Was heißt "geht nicht"? Selber Fehler würde mich wundern, da das Fenster ja versteckt wurde.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:20 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 by Thomas Breitkreuz