Klassen Funktions Pointer
-
Hallo,
habe da folgendes Problem.
//-------------------------- Header ----------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ComCtrls.hpp> #include "DataTypes.h" #include "PCAN_USB.H" //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // Von der IDE verwaltete Komponenten void __fastcall FormShow(TObject *Sender); void __fastcall FormClose(TObject *Sender, TCloseAction &Action); private: // Anwender-Deklarationen //------------------- Can Dongle -------------------------------------------- PCAN_Close CanClose; //Funktions Pointer instanzieren (PCAN_USB.H) static void CALLBACK callBack(UINT nTimerID, UINT wMsg, DWORD dwUser, DWORD dw1, DWORD dw2); public: // Anwender-Deklarationen __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif //----------------- Code ---------------------------------------------------- //--------------------------------------------------------------------------- // Multimedia Timer //--------------------------------------------------------------------------- void CALLBACK TForm1::callBack(UINT nTimerID, UINT wMsg, DWORD dwUser, DWORD dw1, DWORD dw2) { CanClose(); }
Zugriff auf CanClose nicht möglich, OK verstehe ich.
//-------------------------- Header ----------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ComCtrls.hpp> #include "DataTypes.h" #include "PCAN_USB.H" //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // Von der IDE verwaltete Komponenten void __fastcall FormShow(TObject *Sender); void __fastcall FormClose(TObject *Sender, TCloseAction &Action); private: // Anwender-Deklarationen //------------------- Can Dongle -------------------------------------------- static PCAN_Close CanClose; //Funktions Pointer instanzieren (PCAN_USB.H) static void CALLBACK callBack(UINT nTimerID, UINT wMsg, DWORD dwUser, DWORD dw1, DWORD dw2); public: // Anwender-Deklarationen __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif //----------------- Code ---------------------------------------------------- //--------------------------------------------------------------------------- // Multimedia Timer //--------------------------------------------------------------------------- void CALLBACK TForm1::callBack(UINT nTimerID, UINT wMsg, DWORD dwUser, DWORD dw1, DWORD dw2) { CanClose(); }
Hier kommt unresolved externel CanClose vom linker , warum müsste doch funktionieren?
Gruß und Danke
Johann
-
Statische Klassenvariablen müssen auch definiert werden, nicht nur deklariert, d.h. in der Form.cpp:
static PCAN_Close TForm1::CanClose;
Daher der Linker-Fehler...
-
Und um auf deine Frage nach Erstellen eines Funktionszeigers einzugehen:
1. Prototyp auf die Originalfunktion erstellen
2. Zeiger erstellen
3. Zeiger zuweisendann Funktionsaufruf.
Beispiel, ohne deine Callback zu betrachten
// *.h // eigener Prototyp analog Originalfunktion // z.B. // DWORD __stdcall CAN_Close(void); // aus pcan_usb.h typedef DWORD __stdcall (*CanClose) (void); // Funktionszeiger CanClose _CanClose; //--------------------------------------------------------------- // *.cpp __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { // Zeiger zuweisen _CanClose = CAN_Close; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { DWORD err = _CanClose(); } //---------------------------------------------------------------------------
mfg
kpeter
-
....... PCAN_Close CanClose; //Funktions Pointer instanzieren (PCAN_USB.H) static void CALLBACK callBack(UINT nTimerID, UINT wMsg, DWORD dwUser, DWORD dw1, DWORD dw2); public: // Anwender-Deklarationen __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif PCAN_Close TForm1::CanClose; CAN_RECEIVE TForm1::CanReceice;
So geht es :).
Probleme gibt es nur wenn ich das ganze in eine Komponente packe und ein Event
nutzen will, der Funktions Pointer CanReceive ist in der Klasse ebenfalls static
um ihn in der Callback funktion nutzen zu können.
Compiliert und gelinkt wird das ganze ohne Fehler.
Nutze allerdings die Komponente und der Funktions Rumpf wird erzeugt gibt
es eine Exeption beim Zugriff auf den Funktionspointer.Gruß
Johann