![]() |
probelm mit DLL beim kapseln in einer Klasse
Hallo zusammen
habe eine wrapper DLL bekommen und für diese dann in Delphi eine Unit mit den Funktions Deklarationen geschrieben. Funktioniert auch alles prima. Jetzt wollte ich die ganzen Funktionsaurufe in einer Klasse kapseln und habe nicht schlecht gestaunt, dass ich da dann die Funktionen nicht aufrufen kann (EAccessViolation). Also so funktioniert alles!
Delphi-Quellcode:
und siehe da SO bekomm ich immer den Fehler
unit uTest;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; const myDll = 'O3D2xxCamera.dll'; function IfmConnect(hCP : integer; pIp : pChar; XMLPort : integer; FW_Version : pChar; sensorType : pChar):integer; stdCall; function IfmDisConnect( force : integer):integer; stdCall; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} function IfmConnect; external myDll name '_O3D2XXConnect@20'; function IfmDisConnect; external myDll name '_O3D2XXDisconnect@4'; procedure TForm1.FormCreate(Sender: TObject); var ipAddress : string; fwVersion : string; sensorType: string; begin ipAddress := '172.20.7.160'; setLength(fwVersion, 4); setLength(sensorType, 8); IfmConnect(handle, pChar(ipAddress),8080, pChar(fwVersion), pChar(sensorType)); end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin IfmDisConnect(0); end; end.
Delphi-Quellcode:
Die zwei codeschnippsel sind doch eigentlich gar nicht so unterschiedlich.
unit uTest;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; const myDll = 'O3D2xxCamera.dll'; type TmyClass = class handle : HWND; ipAddress : string; xmlPort: integer; fwVersion : string; sensorType: string; constructor create; function connect(): integer; private function IfmConnect(hCP : integer; pIp : pChar; XMLPort : integer; FW_Version : pChar; sensorType : pChar):integer; stdCall; function IfmDisConnect( force : integer):integer; stdCall; end; type TForm1 = class(TForm) procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; myClass : TmyClass; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin myClass := TmyClass.create; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin myClass.IfmDisConnect(0); end; constructor TmyClass.create; begin ipAddress := '172.20.7.160'; setLength(fwVersion, 4); setLength(sensorType, 8); self.connect; end; function TmyClass.IfmConnect; external myDll name '_O3D2XXConnect@20'; function TmyClass.IfmDisConnect; external myDll name '_O3D2XXDisconnect@4'; function TmyClass.connect: integer; begin result := self.IfmConnect(Form1.Handle, pChar(ipAddress), 8080, pChar(fwVersion), pChar(sensorType)); end; end. Was ist im 2. Code falsch? Im vorraus schon mal vielen Dank für die Mühe des anguckens! Gruß Stefan |
Re: probelm mit DLL beim kapseln in einer Klasse
Hast du mal geschaut, wo genau der Fehler auftritt?
|
Re: probelm mit DLL beim kapseln in einer Klasse
Hallo,
Delphi-Quellcode:
Geht das überhaupt ???
function TmyClass.IfmConnect; external myDll name '_O3D2XXConnect@20';
Ich würde es dynamisch machen über LoadLibrary/GetProcAddress, hat auch den Vorteil, dass das Programm noch startet, wenn die DLL nicht vorhanden ist. Heiko |
Re: probelm mit DLL beim kapseln in einer Klasse
Beim debuggen ist mir aufgefallen:
bevor die funktion
Delphi-Quellcode:
aufgerufen wird ist ipAddress definiert und fwVersion und sensorType auch (in den 2en steht natürlich nur müll!).
result := self.IfmConnect(Form1.Handle, pChar(ipAddress), 8080, pChar(fwVersion), pChar(sensorType));
Beim Aufruf der funktion kommt die AccessViolation : 1000300 in Modul 'O3D2xxCamera.dll'. |
Re: probelm mit DLL beim kapseln in einer Klasse
@heiko
warum soll das nicht gehen?
Delphi-Quellcode:
function IfmConnect; external myDll name '_O3D2XXConnect@20';
das funktioniert ja schließlich auch |
Re: probelm mit DLL beim kapseln in einer Klasse
Verlagere mal das Connect aus dem Konstruktor aus uind rufe es direkt im onCreate der Form auf.
|
Re: probelm mit DLL beim kapseln in einer Klasse
@mKinzler
genau gleiches Verhalten : EAccessViolation |
Re: probelm mit DLL beim kapseln in einer Klasse
Hallo,
Delphi-Quellcode:
Weil eine Klassen-Methode als ersten (unsichtbaren) Parameter
warum soll das nicht gehen?
einen Zeiger auf sich selbst (Self) besitzt. Rufst du Jetzt Connect auf, rutschen die Parameter praktisch 1 nach rechts und es kommt Müll raus. result := self.IfmConnect(Form1.Handle, pChar(ipAddress), 8080, pChar(fwVersion), pChar(sensorType)); wird intern zu result := self.IfmConnect(Self, Form1.Handle, pChar(ipAddress), 8080, pChar(fwVersion), pChar(sensorType)); Ich kann mich ja täuschen ;) Aber probier doch einfach zum Test mal LoadLibrary aus oder ruf in deiner Connect direkt die statisch verlinkte function IfmConnect; external myDll name '_O3D2XXConnect@20';. auf. Heiko |
Re: probelm mit DLL beim kapseln in einer Klasse
Zitat:
man bedenke das "unsichtbare" Self, welches bei Objektmetoden noch mit die Parameter aufgenommen wird. [edit] zu langsam und blödes kaum funktionierende INetverbindung |
Re: probelm mit DLL beim kapseln in einer Klasse
@Heiko
von diesem ominösen unsichtbaren Parameter hab ich noch nie was gehört! aber, das wichtigste, wenn ich, wie Du vorgeschlagen hast, IfmConnect nicht als member funktion deklariere und in der memeberfunktion connect das IfmConnect aufrufe, dann funktioniert es! Danke schon mal, wenngleich ich es schöner gefunden hätte wenn ich die funktionen direkt hätte kapseln können. Kann man das unsichtbare "self" beim aufruf berücksichtigen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:05 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