AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi probelm mit DLL beim kapseln in einer Klasse
Thema durchsuchen
Ansicht
Themen-Optionen

probelm mit DLL beim kapseln in einer Klasse

Ein Thema von alf.stefan · begonnen am 2. Jul 2009 · letzter Beitrag vom 2. Jul 2009
Antwort Antwort
Seite 1 von 2  1 2      
alf.stefan

Registriert seit: 11. Apr 2003
88 Beiträge
 
Delphi 7 Professional
 
#1

probelm mit DLL beim kapseln in einer Klasse

  Alt 2. Jul 2009, 06:45
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: probelm mit DLL beim kapseln in einer Klasse

  Alt 2. Jul 2009, 06:50
Hast du mal geschaut, wo genau der Fehler auftritt?
Markus Kinzler
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: probelm mit DLL beim kapseln in einer Klasse

  Alt 2. Jul 2009, 06:56
Hallo,

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
Heiko
  Mit Zitat antworten Zitat
alf.stefan

Registriert seit: 11. Apr 2003
88 Beiträge
 
Delphi 7 Professional
 
#4

Re: probelm mit DLL beim kapseln in einer Klasse

  Alt 2. Jul 2009, 07:02
Beim debuggen ist mir aufgefallen:

bevor die funktion
   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'.
  Mit Zitat antworten Zitat
alf.stefan

Registriert seit: 11. Apr 2003
88 Beiträge
 
Delphi 7 Professional
 
#5

Re: probelm mit DLL beim kapseln in einer Klasse

  Alt 2. Jul 2009, 07:04
@heiko

warum soll das nicht gehen?



function IfmConnect; external myDll name '_O3D2XXConnect@20';
das funktioniert ja schließlich auch
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: probelm mit DLL beim kapseln in einer Klasse

  Alt 2. Jul 2009, 07:13
Verlagere mal das Connect aus dem Konstruktor aus uind rufe es direkt im onCreate der Form auf.
Markus Kinzler
  Mit Zitat antworten Zitat
alf.stefan

Registriert seit: 11. Apr 2003
88 Beiträge
 
Delphi 7 Professional
 
#7

Re: probelm mit DLL beim kapseln in einer Klasse

  Alt 2. Jul 2009, 07:17
@mKinzler

genau gleiches Verhalten : EAccessViolation
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: probelm mit DLL beim kapseln in einer Klasse

  Alt 2. Jul 2009, 07:21
Hallo,

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
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#9

Re: probelm mit DLL beim kapseln in einer Klasse

  Alt 2. Jul 2009, 07:24
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
alf.stefan

Registriert seit: 11. Apr 2003
88 Beiträge
 
Delphi 7 Professional
 
#10

Re: probelm mit DLL beim kapseln in einer Klasse

  Alt 2. Jul 2009, 07:31
@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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 08:22 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