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 zuweisen

    dann 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


Anmelden zum Antworten