Einzelnen Beitrag anzeigen

Dawn87

Registriert seit: 15. Feb 2007
Ort: Lüdenscheid
189 Beiträge
 
Delphi XE5 Professional
 
#1

Arbeiten mit Callback-Funktion aus C-DLL: Erster Parameter ist ungültig

  Alt 26. Jan 2011, 10:17
Hallo,

kurz zu meiner Situation:

Ich habe eine Delphi-Anwendung die Funktionen einer C-DLL benutzt. Die dort enthaltenen Funktionen werden über die "external"-Direktive eingebunden. Eine der Funktionen aus der DLL erwartet einen Pointer auf eine Callback-Funktion. Dieser Callback-Funktion werden 2 Parameter übergeben BytesTransfered und BytesTotal.

Die übergabe des 2. Parameters ByteTotal klappt, während der Parameter BytesTransfered "ungültige" Daten enthält - also nicht mehr die, die ursprünglich von der C-DLL übergeben wurden.

Die betroffene Funktion ist in der C-DLL wie folgt deklariert:

Code:
typedef unsigned long int   u32;

static void(*TransPend_pf)(u32,u32);

u32 Connect_u32(const char* ip_addr_ps8, const char* port_ps8,
                         void(*trans_pend_pf)(u32,u32))
{
 TransPend_pf = trans_pend_pf; // Zwischenspeichern

 // ....
}
Der Aufruf erfolgt dann später auf folgende Weise:

Code:
if(TransPend_pf != NULL)
{
  TransPend_pf(bytes_transferred_u32, bytes_total_u32);

  // TransPend_pf(0xAFFE, 0xBEEF); <-- klappt ebenfalls nicht. 1. Parameter ist in Delphi nicht mehr 0xAFFE.
}
Die Deklaration der Funktionen im Delphi-Code sieht so aus:

Delphi-Quellcode:
TConnectCallback = procedure(ByteTransfered: Cardinal; ByteTotal: Cardinal) of object; cdecl;

function Connect_u32(ip_addr: PChar; port: PChar; CBFunc: TConnectCallback): Cardinal; cdecl; external csDLLName;
Kann sich jemand erklären weshalb der Parameter ByteTransfered nicht richtig übergeben wird? Probeweies habe ich die Callback-Funktion in der C-DLL selber implementiert -> Dort hat dann die Parameterübergabe richtig funktion. Auch wenn ich die Anzahl der Parameter z.B. auf 3 oder 4 erweitere, werden alle richtig übergeben - außer der Erste!

Ich habe keine Idee mehr was ich falsch machen könnte und hoffe hier kann mir jemand weiterhelfen!

Grüße
Dawn
  Mit Zitat antworten Zitat