Klassenfunktionspointer als Callback an UnRAR-DLL übergeben



  • Hallo,

    ich habe folgende Funktionsdeklarationen:

    typedef int (CALLBACK *UNRARCALLBACK)(UINT msg, LONG UserData, LONG P1, LONG P2);
    void   PASCAL RARSetCallback(HANDLE hArcData, UNRARCALLBACK Callback, LONG UserData);
    

    Nun möchte ich der Callback-Funktion den Funktionspointer einer nicht statischen Klassenfunktion zuweisen, aber so, wie im folgenden Versuch geht es nicht:

    //---------------------------------------------------------------------------
    int CALLBACK URAR::UnRAREvent(UINT msg, LONG UserData, LONG P1, LONG P2)
    {
    	//
    }
    
    //---------------------------------------------------------------------------
    void __fastcall URAR::SetCallbackFunction(HANDLE hArcData, LONG UserData)
    {
    	RARSetCallback(hArcData, UnRAREvent, UserData);
    }
    

    Dies wird natürlich mit folgender Fehlermeldung vom Compiler verweigert:

    [C++ Fehler] RAR.cpp(79): E2034 Konvertierung von 'int (__stdcall * (_closure )(unsigned int,long,long,long))(unsigned int,long,long,long)' nach 'int (__stdcall *)(unsigned int,long,long,long)' nicht möglich
    [C++ Fehler] RAR.cpp(79): E2342 Keine Übereinstimmung des Typs beim Parameter 'CallBack' ('int (__stdcall *)(unsigned int,long,long,long)' erwartet, 'void' erhalten)
    

    Mit einer normalen Funktion (ohne Klasse) ist das kein Problem, aber ich möchte in der Callback-Funktion auf Variablen und Funktionen der Klasse zugreifen. Wie kann ich die Funktion übergeben?

    Nighthero



  • Hallo

    genau das geht nicht.
    Du kannst Standard-C++ Funktionpointern nicht Membermethoden zuweisen.
    Dazu gibt es in BCB das Schlüsselwort __closure, was dann allerdings nicht kompatibel zu alten Callback-Funktionen ist.
    Du mußt dich also entscheiden : einfache Callbackfunktion oder Membermethode.

    bis bald
    akari


Anmelden zum Antworten