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


Anmelden zum Antworten