Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi dll: procedure zur laufzeit einbinden (https://www.delphipraxis.net/66090-dll-procedure-zur-laufzeit-einbinden.html)

Dr.No 24. Mär 2006 14:21


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:
 
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.
also des tat schonmal bei mir nich,
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:
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;
wo bei die dll soaus siht:

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!

Luckie 24. Mär 2006 14:26

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.

Dr.No 25. Mär 2006 10:17

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!

Luckie 25. Mär 2006 10:27

Re: dll: procedure zur laufzeit einbinden
 
Zitat:

Zitat von Dr.No
aha, tolle antwort!
die hilft mir sehr :shock:

Gut dann verabschiede ich mich mal aus dem Thread, wenn meine Hilfestellungen nicht erwünscht sind.

Bernhard Geyer 25. Mär 2006 10:46

Re: dll: procedure zur laufzeit einbinden
 
Zitat:

Zitat von Dr.No
aha, tolle antwort!
die hilft mir sehr :shock:

Lucky hat vermutlich das Problem zu 100% getroffen wenn Du VCL-Objekte als Referenz in der DLL-Schnittstelle verwendest aber keine gemeinsamen Laufzeitpackages.
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.

Dr.No 25. Mär 2006 12:11

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

Bernhard Geyer 26. Mär 2006 10:35

Re: dll: procedure zur laufzeit einbinden
 
Du kannst auch mit der Hilfe von Packages ein Plugin-System (Hier im Forum suchenPackage Plugin). Und dann hast Du keine Probleme damit "lebende" Objekte von der Exe in die DLL's zu bringen.

thkerkmann 26. Mär 2006 12:19

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 SwissDelphiCenter: Form aus einer DLL laden

da gibt es eine prima Anleitung.

Gruss

Thomas

SirThornberry 26. Mär 2006 13:46

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:
GetProcAddress(Handle1, 'initform')
[...]
function Initform(owns:tcomponent;a:TwinControl):boolean; stdcall;
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"

Bernhard Geyer 26. Mär 2006 19:08

Re: dll: procedure zur laufzeit einbinden
 
Zitat:

Zitat von thkerkmann
selbtverständlich kann man auch forms in eine dll verpacken.
Wird bei sehr großen kommerziellen Projekten gerne mal gemacht.

schau mal hier nach SwissDelphiCenter: Form aus einer DLL laden

da gibt es eine prima Anleitung.

Da die Schweizer gerade bei mir nicht gehen kann ich nur spekulieren:
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 06:44 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