Callback-Funktion



  • hi,

    ich habe mir ne dll (dynamisch) gebastelt in der ich ein vcl-formular hinterlegt habe und von einer anwendung, die die dll verwendet, aus aufrufe.

    in der dll habe ich ausserdem diverse andere units mit diversen klassen drin (diese sind alle vcl-unabhaengig). eine davon ruft eine callback-funktion auf die man mittels einer set-methode vorher definieren kann.

    wenn ich die callback-funktion im formular definiere:

    void CallbackFun(u_long BytesRead, u_long BytesToRead)
    {
      ProgressBar->Position = (int) ((double) BytesRead * 100.0 / (double) BytesToRead);
    }
    

    und vor den relevanten funktionsaufrufen setze:

    Klasse->SetCallbackFunction(CallbackFun);
    

    dann bekomme ich verschiedene Schmutzverletzungen, wenn die Callback-Funktion aufgerufen wird.

    Das ganze funktioniert aber, wenn ich keine DLL verwende, sondern das formular ganz normal in einer vcl-anwendung. dort erhalte ich keinerlei fehlermeldungen oder zugriffsverletzungen (codeguard).

    class PTP_Core
    {
      private:
    
        void (*CallbackFun) (u_long BytesRead, u_long BytesToRead);
    
      public:
    
        void SetCallbackFunction(void (*Callback) (u_long BytesRead, u_long BytesToRead));
    };
    
    void PTP_Core::SetCallbackFunction(void (*Callback) (u_long BytesRead, u_long BytesToRead))
    {
      CallbackFun = Callback;
    }
    

    ich nehme mal an, dass liegt daran, dass die callback-funktion nicht zur formular-klasse gehoert, wenn ich diese jedoch dort hinzufüge, meckert der compiler von wegen, das die zuweisung so nicht funktioniert.

    jemand ne idee?



  • Bei mir klappt das so:
    Ich hab das mal in ne Form zum Testen gemacht.
    ***************************************************************************

    //---------------------------------------------------------------------------
    #ifndef CallBackFormH
    #define CallBackFormH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    
    typedef int TGetPos(Boolean Test);
    typedef int (*PGetPos)(Boolean Test);
    
    //Das kommt nur rein, wenn das ne DLL werden soll!
    //Ist nur zum Syntax- test hier drin
    extern "C" __declspec(dllexport) int __stdcall GetPos(Boolean Test);
    
    //CallBack- Funktion mit Typ von typedef!!!
    TGetPos Get
    { return Test ? 7 : 13;
    }
    //CallBack- Funktion!!!
    int Getter(Boolean Test)
    { return Test ? 3 : 5;
    }
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
      //Test- Variablen!
      TGetPos F;
      PGetPos PF;
    __published:	// Von der IDE verwaltete Komponenten
            void __fastcall FormClick(TObject *Sender);
    /*
    In CPP- Datei:
            void __fastcall TForm1::FormClick(TObject *Sender);
            { Test(Get);
              Test(Getter);
            }
    */
    private:	// Anwenderdeklarationen
    //        __fastcall Test(PGetPos GP)
    //        oder:
            __fastcall Test(PGetPos GP)
            { int Res;
              if (GP!=NULL)
                Res=GP(true);
              if (GP!=NULL)
                Res=GP(false);
            }
    public:		// Anwenderdeklarationen
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

Anmelden zum Antworten