![]() |
[DLL/Interfaces] Ungültige Zeigeroperation
Aloha,
wie in ![]() Das funktioniert soweit auch ganz gut, wenn ich allerdings die Function GetName():string; der DLL im Hauptprogramm aufrufe, wird zwar der Wert zurückgeliefert und auch ausgegeben (-> showmessage), allerdings erhalte ich danach eine Exception "Ungültige Zeigeroperation". Die Procedure Execute(); funktioniert allerdings problemlos... wohl weil sie nichts zurückliefert? Plugin
Delphi-Quellcode:
uPlugInDefinition.pas
library PlugIn;
uses SysUtils, Classes, Windows, uPlugInDefinition in '..\shared\uPlugInDefinition.pas'; {$R *.res} type TPlugIn = class(TInterfacedObject, IPlugIn) function getName : string; stdcall; procedure Execute; stdcall; end; { TPlugIn } procedure TPlugIn.Execute; begin MessageBox(0, 'Test!', 'Blubb', 0); end; function TPlugIn.getName : string; begin Result := 'Beispiel...'; end; { einzige exportierte Funktion } function InitPlugin: IPlugin; stdcall; {export;} begin Result := TPlugIn.Create; end; exports InitPlugin; end.
Delphi-Quellcode:
Hauptprogramm
unit uPlugInDefinition;
interface uses Windows; type IPlugIn = interface ['{8E5F6F87-BD7C-4F51-A2B2-36E437E20648}'] function getName : string; stdcall; procedure Execute; stdcall; end; implementation { TPlugIn } end.
Delphi-Quellcode:
Wieso funktioniert das getName nicht oder was kann ich tun, damit es funktioniert? :S
unit main;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, uPlugInDefinition, ExtCtrls, GR32; type TForm1 = class(TForm) //[...] private { Private-Deklarationen } public { Public-Deklarationen } plugins : TInterfaceList; procedure LoadPlugin(DLLName: string); procedure LoadPlugIns; procedure UnloadPlugIns; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin plugins := TInterfaceList.Create; LoadPlugIns; end; procedure TForm1.FormDestroy(Sender: TObject); begin UnloadPlugIns; end; procedure TForm1.Button1Click(Sender: TObject); begin if plugins.Count > 0 then begin // funktioniert IPlugIn(plugins.Items[0]).execute; // funktioniert, aber danach Exception showmessage(IPlugIn(plugins.Items[0]).getName); end; end; procedure TForm1.LoadPlugin(DLLName: string); type TProcInitPlg = function: IPlugin; stdcall; var fName: string; aProc: TProcInitPlg; hDLL: HWND; fProc: TFarProc; begin fname := dllname; hDll := LoadLibrary(@fName[1]); fProc := GetProcAddress(hDLL,'InitPlugin'); if fProc <> nil then begin @aProc := fProc; end else Exit; plugins.Add(aProc); end; procedure TForm1.LoadPlugIns; // [...] // --> LoadPlugin('test.dll'); procedure TForm1.UnloadPlugIns; var I: Integer; begin for I := 0 to plugins.Count-1 do begin try plugins.Items[i]._Release; except end; end; plugins.clear; end; end. Liebe Grüße und vielen Dank Flo |
Re: [DLL/Interfaces] Ungültige Zeigeroperation
Du benutzt Strings über die DLL-Grenze hinweg: das klappt so nicht. Entweder benutzt du FastMM4, ShareMem oder PChars statt der Strings.
|
Re: [DLL/Interfaces] Ungültige Zeigeroperation
Ich hätte schwören können, dass es auch mit pchar nicht funktioniert hat.. weil ich von dem String-Problem wusste, aber gedacht habe, dass das mit Interfaces nicht mehr besteht. Habe es dann trotzdem testweise mit pchar probiert aber wohl irgendwas anderes dabei falsch gemacht.
So funktioniert es auf jeden Fall, vielen Dank und sorry für meine Doofheit :) Eins noch: Das Freigeben bereitet erwartungsgemäß noch Probleme, da ich nicht genau weiß, inwieweit mir TInterfaceList etwas abnimmt oder ich allgemein die Teile ordnungsgemäß freigebe bei Programmende. Die LoadPlugin wirkt auf mich auch nicht so ganz koscher in der Form, ich steh da aber leider wie der Ochs vorm Berg. Grüße, liebe, flo |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:54 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