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 Ereignisreturn 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 notwendigEvi48