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