AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi DLL dynamisch laden/ Verwendung in Kompo zur Designzeit

DLL dynamisch laden/ Verwendung in Kompo zur Designzeit

Ein Thema von oki · begonnen am 14. Sep 2007 · letzter Beitrag vom 14. Sep 2007
Antwort Antwort
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#1

DLL dynamisch laden/ Verwendung in Kompo zur Designzeit

  Alt 14. Sep 2007, 08:25
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
  Mit Zitat antworten Zitat
14. Sep 2007, 08:34
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Windows API / MS.NET Framework API" verschoben.
Nuclear-Ping
(Gast)

n/a Beiträge
 
#3

Re: DLL dynamisch laden/ Verwendung in Kompo zur Designzeit

  Alt 14. Sep 2007, 09:02
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?
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#4

Re: DLL dynamisch laden/ Verwendung in Kompo zur Designzeit

  Alt 14. Sep 2007, 09:24
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

Gruß oki
42
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#5

Re: DLL dynamisch laden/ Verwendung in Kompo zur Designzeit

  Alt 14. Sep 2007, 09:29
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.

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

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#6

Re: DLL dynamisch laden/ Verwendung in Kompo zur Designzeit

  Alt 14. Sep 2007, 09:32
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
42
  Mit Zitat antworten Zitat
Nightshade

Registriert seit: 7. Jan 2003
Ort: Menden
192 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: DLL dynamisch laden/ Verwendung in Kompo zur Designzeit

  Alt 14. Sep 2007, 10:21
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.
Christian
Killing for peace is like fucking for virginity

Nightshade
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#8

Re: DLL dynamisch laden/ Verwendung in Kompo zur Designzeit

  Alt 14. Sep 2007, 10:29
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ß

oki
42
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#9

Re: DLL dynamisch laden/ Verwendung in Kompo zur Designzeit

  Alt 14. Sep 2007, 18:32
Joop,

so klappts anstandslos. Hab's getestet.

Dank und Gruß oki
42
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#10

Re: DLL dynamisch laden/ Verwendung in Kompo zur Designzeit

  Alt 14. Sep 2007, 18:50
Wunderbar
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:45 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