![]() |
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
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Windows API / MS.NET Framework API" verschoben.
|
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:
Dann lädst du die DLL und importierst die Funktionen mit GetProcAddress.
type
TGetPluginVersion = function: Integer; stdcall; TGetPluginAuthor = function: PChar; stdcall; TCreateChild = procedure (ModuleConfiguration: TModuleConfiguration); {...} TModulePlugin = class {...} public GetPluginVersion: TGetPluginVersion; GetPluginAuthor: TGetPluginAuthor; CreateChild: TCreateChild; {...} end;
Delphi-Quellcode:
Sollte helfen, oder? :zwinker:
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'); {...} |
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:
Jetzt habe ich meine Kompo.
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'); {...}
Delphi-Quellcode:
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:
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; Gruß oki |
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] |
Re: DLL dynamisch laden/ Verwendung in Kompo zur Designzeit
Zitat:
Dank und Gruß oki |
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. |
Re: DLL dynamisch laden/ Verwendung in Kompo zur Designzeit
Hi,
ich hab grad mal folgendes gemacht:
Delphi-Quellcode:
bin zwar noch am testen, aber scheint zu funzen. Wenn ich mir sicher bin, dann setze ich den Thread auf erledigt.
Initialization
begin DLLHandle := LoadLib; end; Schon mal Zwischendank und Zwischengruß :lol: oki |
Re: DLL dynamisch laden/ Verwendung in Kompo zur Designzeit
Joop,
so klappts anstandslos. Hab's getestet. Dank und Gruß oki |
Re: DLL dynamisch laden/ Verwendung in Kompo zur Designzeit
Wunderbar :thumb:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 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