WINAPI Callback in C# **gelöst**
-
ich versuche gerade mal obiges beispiel nachzuprogrammieren
aber es scheitert schon an der Klassendefinition
#include "DllDotNetWrapper.h" ref class CRWrapper; class CR { public: //CR(CRWrapper ^wrapper); };
#include "DllDotNet.h" using namespace System; public ref class CRWrapper { private: CR *pR; };
er meldet bei CR *pR:
DllDotNetWrapper.h(37) : error C2143: Syntaxfehler: Es fehlt ';' vor '*'
DllDotNetWrapper.h(37) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.MfG
-
Ich nehme mal an in CRWrapper in CR unbekannt. Binde das Header File ein (Vorwärtsdekl. reicht nicht, weil Du ja nachher ein new machst).
Simon
-
DllDotNet.h ist der Header wo die CR Klasse drin ist.
OK nachdem ich #include"DllDotNetWrapper.h" auskommentiert habe ging es
gcroot<CRWrapper^> RWrapper;
jetzt hat er Probleme mit der anweisung, da er gcroot nicht kennt.
MfG
-
Ok include vergessen
-
ich habe das Beispiel jetzt für mich angepasst.
habe aber noch eine Frage zu deinem c++ Code
Bringt der Commpiler bei dir beim aufruf des Callbacks keine Fehlermeldung?
void WindowsEnumerator::OnCallback(const TCHAR* windowText) const { _wrapper->OnCallback(gcnew String(windowText)); }
bei mir sagt er:
1>.\DllDotNet.cpp(30) : error C3767: "DllDotNet::CRWrapper::OnHandler::raise": Auf mögliche Funktion(en) kann nicht zugegriffen werden.
MfG
-
Nein. Ich rate mal: Du hast OnWindow zu OnCallback umbenannt...
Simon
-
Ok ich habe mich falsch ausgedrückt.
Ich habe das beispiel nachgebaut.
Meine Funktion ist:
void DllDotNet::CRead::Handler(TByte uwNumberOfDevices, TDWord *pListOfDevices,void *pTag) { RWrapper->OnCallbackHandler(uwNumberOfDevices,pListOfDevices,pTag); }
deshalb steht da ein anderer Name.
hier noch die Wrapper Klasse
public delegate void tKSdelDllHandler(int uwNumberOfDevices, void *pListOfDevices,void *pTag); public ref class CReadWrapper { private: CRead *pRead; public: event tKSdelDllHandler ^OnHandler; CReadWrapper() { pRead = new CRead(this); } ~CReadWrapper() { delete pRead; } void OnCallbackHandler(int uwNumberOfDevices, void *pListOfDevices,void *pTag) { OnHandler(uwNumberOfDevices,pListOfDevices,pTag); } };
und die c++ Klasse:
class CRead { private: gcroot<CReaderWrapper^> ReadWrapper; static void HandlerCallback(TByte uwNumberOfDevices, TDWord *pListOfDevices,void *pTag); public: CRead(CReadWrapper ^wrapper); void Handler(TByte uwNumberOfDevices, TDWord *pListOfDevices,void *pTag); };
und da bringt er die Fehlermeldung:
1>.\DllDotNet.cpp(30) : error C3767: "DllDotNet::CReadWrapper::OnHandler::raise": Auf mögliche Funktion(en) kann nicht zugegriffen werden.MfG
Edit: fehlende Funkion hinzugefügt
-
in der MSDN steht irgendwas von friend funktionen, die ich aber doch gar nihct benutze
komisch
-
Guck nochmals im Bsp. Du rufst in der CRead Klasse direkt den OnHandler event auf, im Bsp. wird der OnHandler aber in der CReadWrapper Klasse aufgerufen.
Simon
-
ja das wars