Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi probelm mit DLL beim kapseln in einer Klasse (https://www.delphipraxis.net/136524-probelm-mit-dll-beim-kapseln-einer-klasse.html)

alf.stefan 2. Jul 2009 06:45


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:
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.
und siehe da SO bekomm ich immer den Fehler

Delphi-Quellcode:
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.
Die zwei codeschnippsel sind doch eigentlich gar nicht so unterschiedlich.
Was ist im 2. Code falsch?

Im vorraus schon mal vielen Dank für die Mühe des anguckens!

Gruß

Stefan

mkinzler 2. Jul 2009 06:50

Re: probelm mit DLL beim kapseln in einer Klasse
 
Hast du mal geschaut, wo genau der Fehler auftritt?

hoika 2. Jul 2009 06:56

Re: probelm mit DLL beim kapseln in einer Klasse
 
Hallo,

Delphi-Quellcode:
function TmyClass.IfmConnect;          external myDll name '_O3D2XXConnect@20';
Geht das überhaupt ???

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

alf.stefan 2. Jul 2009 07:02

Re: probelm mit DLL beim kapseln in einer Klasse
 
Beim debuggen ist mir aufgefallen:

bevor die funktion
Delphi-Quellcode:
   result := self.IfmConnect(Form1.Handle, pChar(ipAddress), 8080, pChar(fwVersion), pChar(sensorType));
aufgerufen wird ist ipAddress definiert und fwVersion und sensorType auch (in den 2en steht natürlich nur müll!).
Beim Aufruf der funktion kommt die AccessViolation : 1000300 in Modul 'O3D2xxCamera.dll'.

alf.stefan 2. Jul 2009 07:04

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

mkinzler 2. Jul 2009 07:13

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.

alf.stefan 2. Jul 2009 07:17

Re: probelm mit DLL beim kapseln in einer Klasse
 
@mKinzler

genau gleiches Verhalten : EAccessViolation

hoika 2. Jul 2009 07:21

Re: probelm mit DLL beim kapseln in einer Klasse
 
Hallo,

Delphi-Quellcode:
warum soll das nicht gehen?
Weil eine Klassen-Methode als ersten (unsichtbaren) Parameter
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

himitsu 2. Jul 2009 07:24

Re: probelm mit DLL beim kapseln in einer Klasse
 
Zitat:

Zitat von alf.stefan
warum soll das nicht gehen?

weil TmyClass.IfmConnect einen andere Parameterdefinition hat, als IfmConnect

man bedenke das "unsichtbare" Self, welches bei Objektmetoden noch mit die Parameter aufgenommen wird.


[edit]
zu langsam und blödes kaum funktionierende INetverbindung

alf.stefan 2. Jul 2009 07:31

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 14:31 Uhr.
Seite 1 von 2  1 2      

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