![]() |
dll: procedure zur laufzeit einbinden
Also entweder bin ich doof oder, des stimmt einfach net:
Ich hab da schon in den tut nachgeschaut mit dan dlls, da steht ja drinn wie ich dlls zur laufzeit einbinde, aber bei mir tut des net! bei den siht des so aus:
Delphi-Quellcode:
also des tat schonmal bei mir nich,unit Unit1; interface uses windows; type TSummenFunktion = function(zahl1, zahl2: integer): integer; stdcall; function addieren(zahl1, zahl2: integer): integer; implementation function addieren(zahl1, zahl2: integer): integer; var SummenFunktion: TSummenFunktion; Handle: THandle; begin Handle:=LoadLibrary(PChar(ExtractFilePath(ParamStr(0))+'rechnen.dll')); if Handle <> 0 then begin @SummenFunktion := GetProcAddress(Handle, 'addiere'); if @SummenFunktion <> nil then begin result:=SummenFunktion(zahl1, zahl2); end; FreeLibrary(Handle); end; end; end. und wie soll des bei proceduren ausschauen? wenn ich des am anfang lad tut bei mir die dll aber so halt net, und es isch dringend erforderlich das des dynamisch geladen wird! also bei mir siht das so aus:
Delphi-Quellcode:
wo bei die dll soaus siht:
type
Tinitform = function(owns:tcomponent;a:TwinControl):boolean; stdcall; function addieren(owns:tcomponent;a:TwinControl):boolean; ... implementation ... function addieren(owns:tcomponent;a:TwinControl):boolean; var initform: Tinitform; Handle1: THandle; begin Handle1:=LoadLibrary(PChar('./dlls\formcreate.dll')); if Handle1 <> 0 then begin @initform := GetProcAddress(Handle1, 'initform'); if @initform <> nil then begin showmessage('c'); result:=initform(owns,a); end; FreeLibrary(Handle1); end; end;
Delphi-Quellcode:
... var myform1:tform1; function Initform(owns:tcomponent;a:TwinControl):boolean; stdcall; begin form1:=tform1.Create(application); form1.Visible:=true; result:=true; end; exports initform; begin end. also ich bin da echt zu blöd des selbst hin zu bekommen, wie gesgt wenn ihs am anfang ein binde tuts! |
Re: dll: procedure zur laufzeit einbinden
Erstmal solltest du dich entscheiden, ob du den Slash oder den Backslash als Trenner verwendest. Und dann ist es generell keine gute Idee mit VCL Objekten in DLLs zu arbeiten.
|
Re: dll: procedure zur laufzeit einbinden
aha, tolle antwort!
die hilft mir sehr :shock: 1. es tut ja mit vcl!! 2. es liegt an der einbindung! weil wenn ichs am anfang lad tuts ohne probleme drotz vcl! 3. es is egal ob ich '/ oder \' benutz! hab ich schon getestet, und man kann auch beides im gleichen benutzen! Hat noch jamand ne andere antwort, dann wäre ih euch sehr zu dank verpflichtet! |
Re: dll: procedure zur laufzeit einbinden
Zitat:
|
Re: dll: procedure zur laufzeit einbinden
Zitat:
Im Forum sind genügen Diskussionen darüber und da kannst Du dich mal selbst schlau machen wenn Du Lösungsvorschläge nicht annimmst weil sie dir nicht passen. |
Re: dll: procedure zur laufzeit einbinden
also, so war das ja jetzt nicht gemeint!
ABer warum tut es wenn ich es am anfang lade, aber wenn ich es dynamisch lade nicht? gibts evtl noch ne andere möglichkeit des später zu ldaen, so dass man sich raussuchen kann welche dll man ladnen will? DIe sache ist nähmlich für ein plug in system! und da kann ich ja nicht schon vorher wissen wellche dlls ich gerade laden will, dann müsste ich ja in die exe schon vorher alle dlls eibinden, und dann ist es ja kein erweiterbares plug in system! und um dieses plug in zu steuern brauch ich aber eine form! die kann ich ja auch nicht in die exe machen, da ja jedes plug in eine andere steuerungs form brauch! vileicht versteht ihr mich ja jetzt warum mir die antwort nicht vil nutzt! also nochmal! sorry luckie |
Re: dll: procedure zur laufzeit einbinden
Du kannst auch mit der Hilfe von Packages ein Plugin-System (
![]() |
Re: dll: procedure zur laufzeit einbinden
Hi,
selbtverständlich kann man auch forms in eine dll verpacken. Wird bei sehr großen kommerziellen Projekten gerne mal gemacht. schau mal hier nach ![]() da gibt es eine prima Anleitung. Gruss Thomas |
Re: dll: procedure zur laufzeit einbinden
du schreibst immer nur "geht nicht". Was für ein Fehler erscheint denn? (hoffe ich hab das nicht einfach nur übersehen)
Ich vermute den Fehler hier:
Delphi-Quellcode:
einmal schreibst du "initform" und das andere mal "Initform". Groß-/Klein-Schreibung wird bei GetProcAddress unterschieden!!! Das heißt du musst bei GetProcAddress die DLL genau mit dem gleichen Namen wie er in der DLL declariert ist aufrufen. Und "initform" <> "Initform"
GetProcAddress(Handle1, 'initform')
[...] function Initform(owns:tcomponent;a:TwinControl):boolean; stdcall; |
Re: dll: procedure zur laufzeit einbinden
Zitat:
Geht es hier nur um den Aufruf eines unabhänigen Formulares aus einer DLL. Das ist absolut problemlos möglich. Auch das kein Extra-Icon in der Taskleiste erscheint is kein Problem. Aber hier geht es um das Problem das TObject aus der DLL <> TObject aus der Exe ist und damit alle is/as Vergleiche/Zuweisungen scheitern. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 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