Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DLL mit CallBack in Delphi importieren (https://www.delphipraxis.net/178067-dll-mit-callback-delphi-importieren.html)

Metschu 15. Dez 2013 14:05

DLL mit CallBack in Delphi importieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,

ich muss eine in C geschriebene DLL in Delphi benutzen.
Mit welcher Software kann man sich die DLL denn Anschauen? Wenn ich diese mit Delphi XE2 öffne wird mir nichts angezeigt.
Die Doku zu der DLL hab ich im PDF-Format bekommen.

Mein derzeitiges Problem ist, das die CallBack Funktionen aus der DLL nicht gefunden / geladen werden.
oder mache ich einen Denkfehler?
Der Name der Funktion "UcanCallbackFkt" steht genau so in der Dokumentation (Auszug im Anhang)

Kurzer Auszug aus meinem dem Quelltext:
Delphi-Quellcode:
[...]
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
[...]
  private
    { Private-Deklarationen }

  public
    { Public-Deklarationen }

  Type
   TCANUSB_SWVersion = function :dWord; StdCall;
   TCANUSB_FWVersion = function :dWord; stdCall;
   TCANUSB_CallBack = Procedure (UcanHandle_P: THandle; out bEvent_p:Byte); cdecl;
   TCANUSB_InitHardWare = function (out UcanHandle_p : THandle; bDeviceNr_P:Byte; CallCackFKT: TCANUSB_CallBack): Byte; stdCall;
  var
   CANUSB_DLL : HModule;
   CANUSB_SWVersion   : TCANUSB_SWVersion;
   CANUSB_FWVersion   : TCANUSB_FWVersion;
   CANUSB_CallBack    : TCANUSB_CallBack;
   CANUSB_InitHardWare : TCANUSB_InitHardWare;
  end;

var
  Form1: TForm1;

const
  USBCANdll = 'USBcan32.dll';
  Fehler: array[1..10] of String = (
                              {00}   'Erfolg',
                              {01}   'Fehler 1',
                              {02}   'Zu viele Module',
                              {03}   '4',
                              {04}   '5',
                              {05}   'Kein USB - CAN Modul gefunden',
                              {...}   '8','7','9','10');
implementation

{$R *.dfm}


Function tform1.Load_CANUSB_DLL:Boolean;
begin;
 result := False;
 CANUSB_Dll := LoadLibrary(PChar('USBCAN32.dll'));
 if CANUSB_DLL <> 0 then
  begin
   @CANUSB_SWVersion     := GetProcAddress(CANUSB_DLL, 'UcanGetVersion');
   @CANUSB_FWVersion     := GetProcAddress(CANUSB_DLL, 'UcanGetFwVersion');
   @CANUSB_InitHardware  := GetProcAddress(CANUSB_DLL, 'UcanInitHardware');
   @CANUSB_CallBack      := GetProcAddress(CANUSB_DLL, 'UcanCallbackFkt');
   result:=true;

   if (@CANUSB_SWVersion=NIL)
    then Showmessage('Fehler SWVersion');
   if (@CANUSB_FWVersion=NIL)
    then Showmessage('Fehler FWVersion');

   if (@CANUSB_CallBack =NIL)
    then Showmessage('Fehler CallBack');  // <- hier bekomme ich die Fehlermeldung angezeigt. Funktion also nicht ordnungsgemäß geladen?

   if (@CANUSB_InitHardWare=NIL)
    then Showmessage('Fehler InitHW');
  end
  else MessageDlg('Fehler beim laden der DLL',mtError,[mbok],0);
end;

procedure TForm1.DLLladen(Sender: TObject);
var d:dWord;
    s:Integer;
    thd:THandle;
begin
 if Load_CANUSB_dll
  then label1.Caption:='DLL Geladen'
  else label1.Caption:=' *** KEINE DLL geladen ***'
end;

[...]
end.
Danke schonmal.

Gruß

Torsten

DeddyH 15. Dez 2013 14:16

AW: DLL mit CallBack in Delphi importieren
 
Die Callback-Routine(n) sollst Du ja schreiben und an die entsprechenden Funktionen übergeben.

Metschu 15. Dez 2013 14:44

AW: DLL mit CallBack in Delphi importieren
 
Zitat:

Zitat von DeddyH (Beitrag 1239852)
Die Callback-Routine(n) sollst Du ja schreiben und an die entsprechenden Funktionen übergeben.

Laut Doku hab ich das anders interpretiert:

"Die USBCAN-Libary stellt zwei Typen von CallBack Funktionen zur Verfügung..."

Deshalb wollte ich mir die DLL mal anschauen, nur mit welchem Programm?

himitsu 15. Dez 2013 14:56

AW: DLL mit CallBack in Delphi importieren
 
http://de.wikipedia.org/wiki/R%C3%BCckruffunktion

Metschu 15. Dez 2013 19:02

AW: DLL mit CallBack in Delphi importieren
 
ok, Denkfehler gefunden... :coder2:

Danke für die Tips!

Sir Rufo 15. Dez 2013 21:35

AW: DLL mit CallBack in Delphi importieren
 
Den finde ich am Besten
Delphi-Quellcode:
CallCackFKT
- Freudsche Fehlleistung :mrgreen:

Metschu 20. Dez 2013 10:05

AW: DLL mit CallBack in Delphi importieren
 
Ich nochmal...

leider klappt das nicht so ganz.

Die CallBack Procedure wird zwar aufgerufen und durchgelaufen, aber am Ende bekomme ich immer eine "Zugriffsverletzung bei Adresse 024E4708. Lesen von Adresse 00000000."

Dies ist bei beiden erstellten CB-Proceduren bei Verlassen dieser :(

DeddyH 20. Dez 2013 10:11

AW: DLL mit CallBack in Delphi importieren
 
Zitat:

Achten Sie bitte auch darauf, dass PUBLIC vor den Callback Funktionen angegeben ist.
Dies ist unter Microsoft Visual Studio als „__stdcall“ definiert.
Werden diese Hinweise nicht beachtet, dann werden zur Laufzeit Schutzverletzungen
auftreten.
Im Ausgangspost ist die Aufrufkonvention cdecl angegeben, das müsste wohl eher stdcall lauten.

Metschu 20. Dez 2013 10:17

AW: DLL mit CallBack in Delphi importieren
 
Da hatte ich schon mehrere Versionen getestet, leider ohne Erfolg.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:04 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