CallBack funktion fuer einen Dummy



  • Hallo, 🙂
    ich habe mir bereits die Beiträge in FAQ angesehen und bin immer noch unsicher wo ich die CallBack-Funktion definieren muss. In der CPP-Datei steht dort häufiger. Ich habe das so verstanden:

    #include <vcl.h>
    #pragma hdrstop
    
    //----------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //----------------------------------------------------------------------
    // CallBack Funktion
    int __stdcall userCallBack(void*, void*);
    
    int __stdcall userCallBack(void* pArgs, void* pContext)
    {
       // Eine neue Zeit ausgeben
       Form1->ZeitBerechnen();
    
       return true;
    }
    
    //----------------------------------------------------------------------
    // System
    //----------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
    {
    }
    
    Die Funktion gebe ich dann weiter an eine Instanz einer weiteren Klasse:
    
       // Instanz erzeugen
       IOPort_Timer   = new TStatus_und_Eingabe_IOPort(this);
    
       // Die CallBack-Funktion einrichten
       IOPort_Timer->createCallBack(
                Form1->Handle,
                userCallBack);
    

    In dieser Instanz wird die CallBack-Funktion an den Timer weitergegeben, doch leider funktioniert das nicht.

    Was mache ich falsch? 😕

    Danke für die Hilfe
    Evi48

    <edit>Bitte Code-Tags benutzen! Danke.</edit>

    [ Dieser Beitrag wurde am 04.06.2003 um 13:26 Uhr von junix editiert. ]



  • Original erstellt von <Evi48>:
    Was mache ich falsch? 😕

    Du sagst nicht Was nicht funktioniert. Ausserdem hast du die Code-Tags nicht verwendet und TStatus_und_Eingabe_IOPort ist nicht grad ne Standard BCB-Klasse (kannst also von keinem erwarten, dass er weiss, was sie tut)

    -junix



  • Außerdem bekommst du so NIE was exportiert.
    In BCB musst du exportieren/importieren mit C machen.

    Also:

    #define EXPORT(DEF) extern "C" DEF __export CALLBACK
    
    Eine Funktion zum Exportieren:
    
    EXPORT(void) Test() { }
    

    Falls du nocht probleme bekommst benutz ne *.def datei.



  • Hallo Junix,
    ja es handelt sich nicht um die CALLBACK Definition des Builders sondern um ein zugekauftes Tool (Kithara KTMR) mit dem es möglich ist genaue Timer zu erstellen.

    Wenn die CallBach-Funktion (userCallBack) aufgerufen wird bekomme ich aus dem Tool die Fehlermeldung "Fehler beim Aufruf eines CallBacks". In den mitgelieferten Beispielen ist der Builder 5 leider nicht enthalten und die Beispiele sind nicht objektorientiert.

    Formuliere ich maine Frage mal so: "Darf ich eine CallBach-Funktion an der Stelle generieren und deren Adresse dann weitergeben an eine andere Instanz und die CallBack-Funktion von dort aufrufen?" 😕

    Danke
    Evi48



  • Mir war man müsste vor einem Funktionsnamen für das Übergeben des Funktionszeigers ein '&' schreiben?

    -junix



  • Hallo,
    danke für Unterstützung nur leider funktionieren die beiden angebotenen Lösungen auch nicht.

    Evi48



  • Hallo 🙂
    zunächst vielen Dank für Eure Hilfe. Das Problem ist gelöst.

    // Um eine Methode aus einer Klasse als CallBack-Funktion zu definieren
    // muss eine Hilfesfunktion generiert werden.
    static int __stdcall _isrHelper(Void* pArgs, Void* pContext );

    // CallBack-Funktion
    Error userCallBack(TStatus_und_Eingabe_IOPort* pContext);

    Die Funktionen haben nachstehende Funktionalität:

    int __stdcall TStatus_und_Eingabe_IOPort::_isrHelper(
    Void* pArgs, Void* pContext )
    {
    TStatus_und_Eingabe_IOPort* pInterruptHandler = (TStatus_und_Eingabe_IOPort*)pArgs;
    TStatus_und_Eingabe_IOPort* pInterruptContext = (TStatus_und_Eingabe_IOPort*)pContext;

    return pInterruptHandler->userCallBack( pInterruptContext );
    }

    // CallBack-Funktion
    Error TStatus_und_Eingabe_IOPort::userCallBack(
    TStatus_und_Eingabe_IOPort* pContext )
    {
    if (OnKIT_Timer) // Ist das Ereignis belegt
    OnKIT_Timer(this); // Wer erzeugt das Ereignis

    return 0;
    }

    Der CallBack-Handler wie folgt generiert:

    error = KS_createCallBack(
    &hCallBack, // Objekthandle
    // Zeiger auf CallBack-Funktion
    &TStatus_und_Eingabe_IOPort::_isrHelper,
    this, // Zeiger auf Referenzdaten
    0, // Flags
    26 ); // Prio, für Kernel-Ebene nicht notwendig

    🙄 Evi48


Anmelden zum Antworten