Hallo,
ich versuche innerhalb einer dll eine callback function zu implementieren, die mir eine zugewiesene Funktion in meiner Hauptanwendung triggert. Natürlich will ich diesen "Event" an beliebigen Stellen innerhalb der dll triggern. Wenn möglich will ich auch keine lib einbinden, sondern mit GetProcAddress arbeiten.
Das hier ist der eingedampfte code aus der dll:
Und hier nun mein code aus der Hauptanwendung:
Compilieren tut das ganze ohne weiteres, aber mit derm Callback stimmt was nicht... leider verstehe ich nicht was.
1.) Sobald die Zeile values(&CallB) ausgeführt wird, wird CallB gerufen. Wollte ich eigentlich nicht, sondern ja nur den Callback pointer meiner Funktion CallB zuweisen
2.) Wenn ich funcA(100,100) rufe, triggered das NICHT CallB(). Also muss was am Aufruf in der dll faul sein.
ich versuche innerhalb einer dll eine callback function zu implementieren, die mir eine zugewiesene Funktion in meiner Hauptanwendung triggert. Natürlich will ich diesen "Event" an beliebigen Stellen innerhalb der dll triggern. Wenn möglich will ich auch keine lib einbinden, sondern mit GetProcAddress arbeiten.
Das hier ist der eingedampfte code aus der dll:
Code:
//a normal function I call from the main application: extern "C" __declspec(dllexport) void funcA(const unsigned long long a, const unsigned long long b); //following function should be the callback, triggering an assigned function in the main application extern "C" { typedef void(__stdcall* callback_t)(unsigned int halfbeast); __declspec(dllexport) void public_func_taking_callback(callback_t evHnd) { evHnd(333);//value just for testing } } void funcA( const unsigned long long a, const unsigned long long b) { //some code here... do things with a and b if(a>10) //trigger the event in the main application callback_t(public_func_taking_callback); }
Code:
typedef void (__stdcall *eventCallback)(unsigned int miau); typedef void (__stdcall *setCallback)(eventCallback evHnd); void __stdcall CallB(unsigned int); //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { signed int retval; unsigned int i; char txt[7]; unsigned long long a,index; UnicodeString USt; HINSTANCE dllHandle=NULL; //Obtain a handle to the DLL dllHandle = LoadLibrary(L"test.dll"); if (!dllHandle){ ShowMessage("Could not load test.dll"); Form1->Close(); } else{ //Lib was loaded, try to get data void (__stdcall* funcA)(const unsigned long long a, const unsigned long long b); funcA=(void(__stdcall*)(const unsigned long long a, const unsigned long long b))GetProcAddress(dllHandle,"funcA"); // DLL function pointer setCallback values=(setCallback)GetProcAddress(dllHandle, "public_func_taking_callback"); if(values != NULL){ values(&CallB); } if(!funcA){ Memo1->Text="No handle to function found."; } else{ funcA(1,1); funcA(100,100); } FreeLibrary(dllHandle); } } //--------------------------------------------------------------------------- void __stdcall CallB(unsigned int halfbeast){ ShowMessage("triggered"); } //---------------------------------------------------------------------------
1.) Sobald die Zeile values(&CallB) ausgeführt wird, wird CallB gerufen. Wollte ich eigentlich nicht, sondern ja nur den Callback pointer meiner Funktion CallB zuweisen
2.) Wenn ich funcA(100,100) rufe, triggered das NICHT CallB(). Also muss was am Aufruf in der dll faul sein.
Comment