Zeiger auf Klassenmethoden
-
Hallo!
Folgendes Problem:
Ich versuche ein DLL zu schreiben, dessen Funktionen aus VC++ und VB
aufgerufen werden und die eine Funktion des aufrufenden Programmes
aufrufen kann.
Dabei tritt das Problem auf, dass ich aus der DLL eine
Methode einer Klasse im Hauptprogramm aufrufen muss.Ich hab alsBeispiel folgende Klasse geschrieben:
HEADERclass CCaller { typedef void (*CALL_FUNC)(char para); public: void call_function(void); void set_function(CALL_FUNC func); CCaller(); virtual ~CCaller(); private: CALL_FUNC m_function_to_call; };
BODY
CCaller::CCaller() { } CCaller::~CCaller() { } void CCaller::set_function(CALL_FUNC func) { this->m_function_to_call = func; } void CCaller::call_function() { this->m_function_to_call(10); }
was in C super funktioniert.
Jetzt binde ich das ganze in C++ folgendermaßen ein wobei m_caller vom
Typ CCaller ist.void CMein_problem_mfcDlg::OnOK() { // TODO: Zusätzliche Prüfung hier einfügen this->m_caller.set_function(&CMein_problem_mfcDlg::call_me); this->m_caller.set_function(call_me); this->m_caller.call_function(); CDialog::OnOK(); } void CMein_problem_mfcDlg::call_me(char param) { char temp[10]; this->MessageBox(itoa(param,temp,10)); }
Für die beiden set_function Zeilen bekomme ich Konvertierungsfehler
error C2664.Ich hab schon einige Seiten im Internet durchforstet und habe nur
Lösungsmöglichkeiten erspäht, die sich auf Zeiger innerhalb einer
Klasse, aber nicht über Klassen hinweg erstrecken.Schonmal Danke für eure Mühen.
-
hm, erstmal glaube ich nicht, dass das in C funktioniert, da C gar keine Klassen kennt. Aber, wenn ich das richtig verstanden habe, dann möchtest Du eine Methode eines Objekts und nicht eine statische Methode einer Klasse aufrufen, richtig?
Falls ja, dann könnte Dir folgender Thread evtl. weiterhelfen, insbesondere der letzte Post von mir, so scheint es zu funktionieren.
-
wenn du von ccaller erbst müsste es gehen, aber das ist eine net so
tolle lösung imho. gibt bestimmt einen besseren workaround@mantiz
templates und dll funktionieren nicht
-
Oh, alles klar. Auch irgendwie logisch.
Tja, da merkt man, dass ich auch noch nicht so in der Materie bin, aber egal, ich lass mich davon nicht entmutigen.
-
mantiz schrieb:
Tja, da merkt man, dass ich auch noch nicht so in der Materie bin, aber egal, ich lass mich davon nicht entmutigen.
auf jedenfall ne sehr gute einstellung
-
Danke erstmal...
im Moment Bin ich bei folgender Lösung mit statischer Variable, was allerdings sehr "unelegant ist"...
in der Klasse (hier "CToCall"), die einen "Event" empfangen soll muss ne statische Variable und ne statische Funktion eingefügt werdenclass CToCall { public: void ToCallInstance(); static void ToCallStatic(char in); CToCall(); virtual ~CToCall(); static CToCall *mythis; private: }; CToCall *CToCall::mythis = 0; CToCall::CToCall() { this->mythis = this; } CToCall::~CToCall() { } void CToCall::ToCallStatic(char in) { mythis->ToCallInstance(); } void CToCall::ToCallInstance() { //Do Something }
Und dann folgendes, wo mans braucht
CCaller caller; CToCall to_call; caller.set_function(&CToCall::ToCallStatic); caller.call_function();
das kann man natürlich abwandeln, indem man CToCall an die Eigentliche Klasse vererbt, die den Event braucht und ToCallInstance oder ToCallStatic überschreibt.
Für weitere Tipps bin ich natürlich dankbar!