Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi DLL dynamisch laden/ Verwendung in Kompo zur Designzeit (https://www.delphipraxis.net/99570-dll-dynamisch-laden-verwendung-kompo-zur-designzeit.html)

oki 14. Sep 2007 07:25


DLL dynamisch laden/ Verwendung in Kompo zur Designzeit
 
Hi Leute,

folgende Situation:

ich will eine DLL dynamisch über LoadLibrary einbinden. Mach ich das in meiner App funzt auch alles super. Nun habe ich die Zugriffe in eine eigene Klasse verlagert. Diese dann als Komponente für den leichteren Zufriff zur Designzeit eingebunden. Der Vorteil ist, dass ich mir im OI einige Eigenschaften anzeigen lassen will. Nun ist es aber so, dass ich aktuell nicht weis, wie ich meinem Package sage, dass es die Funktionsaufrufe dynamisch laden soll. Die Anzeige der Eigenschaften erfolgt ja über diverse Aufrufe von Methoden der DLL (z.B. GetVersion).

zur Zeit ist es so, das im OI für Version 0 eingetragen ist.

Wenn einer einen kleinen Tip hat, her damit.

Ach so, ich glaube wenn ich die Methoden der DLL statisch binde, dann könnte es gehen. Möchte mir aber ohne genaues Wissen die Arbeit spaaren jetzt alles auf statische Bindung umzustellen.

Gruß oki

DP-Maintenance 14. Sep 2007 07:34

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Windows API / MS.NET Framework API" verschoben.

Nuclear-Ping 14. Sep 2007 08:02

Re: DLL dynamisch laden/ Verwendung in Kompo zur Designzeit
 
Du musst in der DLL zuerst die Funktionen unter "exports" aufführen, die du exportieren willst.

Dann erstellst du (ich glaube das heisst so ^^) Prototypen von diesen exportieren Funktionen und weisst diese entsprechenden Variablen zu. Im konkreten sieht das z.B. so aus:
Delphi-Quellcode:
type
  TGetPluginVersion    = function: Integer; stdcall;
  TGetPluginAuthor     = function: PChar; stdcall;

  TCreateChild         = procedure (ModuleConfiguration: TModuleConfiguration);
  {...}

  TModulePlugin = class
    {...}
  public
    GetPluginVersion:    TGetPluginVersion;
    GetPluginAuthor:     TGetPluginAuthor;
    CreateChild:         TCreateChild;
    {...}
  end;
Dann lädst du die DLL und importierst die Funktionen mit GetProcAddress.
Delphi-Quellcode:
  Handle := LoadLibrary (APluginFileName);
  if (Handle = 0) then
    raise Exception.Create ('TModulePlugin.Create: LoadLibrary failed to load Plugin Module' + #13#10#13#10 +
                            APluginFileName);

  CreateChild := GetProcAddress (Handle, 'CreateChild');
  if @CreateChild = nil then
    raise Exception.Create ('TModulePlugin.Create: Function "CreateChild" not found in Plugin Module');

  GetPluginVersion := GetProcAddress (Handle, 'GetPluginVersion');
  if @GetPluginVersion = nil then
    raise Exception.Create ('TModulePlugin.Create: Function "GetPluginVersion" not found in Plugin');

  {...}
Sollte helfen, oder? :zwinker:

oki 14. Sep 2007 08:24

Re: DLL dynamisch laden/ Verwendung in Kompo zur Designzeit
 
Hi NuclearPing,

erst mal Dank für deine Antwort.

leider ist das nicht mein Problem. Ich wußte auch nicht so richtg, wie das formulieren sollte.

Der Punkt ist folgender:
Ich mache genau das, was du geschrieben hast.

Delphi-Quellcode:
Handle := LoadLibrary (APluginFileName);
  if (Handle = 0) then
    raise Exception.Create ('TModulePlugin.Create: LoadLibrary failed to load Plugin Module' + #13#10#13#10 +
                            APluginFileName);

  CreateChild := GetProcAddress (Handle, 'CreateChild');
  if @CreateChild = nil then
    raise Exception.Create ('TModulePlugin.Create: Function "CreateChild" not found in Plugin Module');

  GetPluginVersion := GetProcAddress (Handle, 'GetPluginVersion');
  if @GetPluginVersion = nil then
    raise Exception.Create ('TModulePlugin.Create: Function "GetPluginVersion" not found in Plugin');

  {...}
Jetzt habe ich meine Kompo.

Delphi-Quellcode:
  TMyCompo = class(TComponent)
  private
    FAPIVersion: Integer;
    procedure SetAPIVersion(const Value: Integer);
  function GetAPIVersion : Integer;
  protected
  public
    constructor Create(AOwner : TComponent; DLLHandle: Cardinal); reintroduce;
    Destructor Destroy; override;
  published
    property APIVersion : Integer read GetAPIVersion write SetAPIVersion;
  end;


function TMyCompo.GetAPIVersion;
begin
  FAPIVersion := GetPluginVersion; // lesen der versionsnummer aus DLL (Handle hab ich mal weg gelassen, muß ich bei mir nicht angeben
end;
Da passiert bei mir zur Designzeit aber nichts im OI der Compo. Ich denke halt, dass das daran liegt, das die DLL ja noch nicht dynamisch geladen wurde. Erst zur Laufzeit :gruebel:

Gruß oki

Nuclear-Ping 14. Sep 2007 08:29

Re: DLL dynamisch laden/ Verwendung in Kompo zur Designzeit
 
Achso, ok, das hab ich entweder überlesen oder missverstanden. Dazu kann ich dir aber auch nichts sagen, da Komponentenentwicklung nicht meine Welt ist.

Jedoch sollte das dynamische Laden von Funktionen aus der DLL zum nächsten Problem werden. Dafür hast du ja schonmal 'ne Lösung. :P

[Edit]
Vielleicht im Initialization / Finalization? Aber auch kA, ob das bei Komponenten schon zur Designzeit passiert.
[/Edit]

oki 14. Sep 2007 08:32

Re: DLL dynamisch laden/ Verwendung in Kompo zur Designzeit
 
Zitat:

Zitat von Nuclear-Ping
[Edit]
Vielleicht im Initialization / Finalization? Aber auch kA, ob das bei Komponenten schon zur Designzeit passiert.
[/Edit]

Das ist ja schon mal ne Idee die man testen kann!

Dank und Gruß oki

Nightshade 14. Sep 2007 09:21

Re: DLL dynamisch laden/ Verwendung in Kompo zur Designzeit
 
Du musst die Komponente glaube ich in Disigntime-Package und Runtime-Package unterteilen, aber wie das genau geht, bin ich auch überfragt.

Vielleicht helfen die Die Stichworte aber weiter.

oki 14. Sep 2007 09:29

Re: DLL dynamisch laden/ Verwendung in Kompo zur Designzeit
 
Hi,

ich hab grad mal folgendes gemacht:
Delphi-Quellcode:
Initialization
begin
  DLLHandle := LoadLib;
end;
bin zwar noch am testen, aber scheint zu funzen. Wenn ich mir sicher bin, dann setze ich den Thread auf erledigt.

Schon mal Zwischendank und Zwischengruß :lol:

oki

oki 14. Sep 2007 17:32

Re: DLL dynamisch laden/ Verwendung in Kompo zur Designzeit
 
Joop,

so klappts anstandslos. Hab's getestet.

Dank und Gruß oki

Nuclear-Ping 14. Sep 2007 17:50

Re: DLL dynamisch laden/ Verwendung in Kompo zur Designzeit
 
Wunderbar :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:06 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