unmanaged Callback methode mit variabler Parameteranzahl wrappen



  • Hallo zusammen,

    ich versuche eine unmanaged dll zu wrappen und bin auf ein problem gestoßen, wo ich nicht weiter komme.
    Ich versuch das ganze mal zu beschreiben.

    Die unmanaged Dll bietet eine Factory methode, die mir einen zeiger auf ein Object mit einem bestimmten interface liefert.
    An diesem object kann man eine methode aufrufen SetLog die als argument ein zeiger auf ein interfaceobject erwartet, über dieses object werden dann verschiedene informationen nach aussen gegeben.

    Ich habe mir ein Gebilde gemacht, was soweit auch ganz gut funktioniert nur leider taugt es nicht für Funktionen mit variblen argumenten.
    Ich bekomme auch beim kompilieren eine warnung, dass die funktion als native kompiliert wurde...(Logger::ProgressText)

    Baubar ist die ganze sache, nur lande ich nie in der ManagedClass::ProgressText methode...(andere interface methoden werden aufgerufen)

    das gebilde was ich habe sieht vereinfacht so aus... ich habe alle anderen Funktionen des Interface weg gelassen da diese nicht relevant sind und auch funktionieren, nur jene mit variablen parametern eben nicht...

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //  Unmanaged Interface
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    
    class IUnmanagedInterface
    {
    	public:
    		virtual void ProgressText(const char* pszFormat, ...) = 0;
    };
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //  typedefs 
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    typedef void (*pFktProgressText) (const char* pszFormat);
    public delegate void ProgressTextCallback(String^ sLogMessage);
    private delegate void ProgressTextCallbackUnmanaged(const char* sLogMessage);
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // implementation of the unmanaged interface 
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    class Logger : public IUnmanagedInterface
    {
    private:
        pFktProgressText m_pFktProgressText; // callback
    
    public:
        Logger();
        virtual ~Logger(){};
    
        pFktProgressText SetProgressTextCallback (pFktProgressText pFktNew)
        {
            pFktProgressText old  = m_pFktProgressText;
            m_pFktProgressText = pFktNew;
            return old;
        }
    
        virtual void ProgressText(const char* pszFormat, ...)
        {
            /*
                bastele den string zusammen
            */        
            if ( m_pFktProgressText != NULL)
            {
                m_pFktProgressText(/* hier ist der zusammen gebastelte string*/);
            }
        }
    };
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //  Managed class that uses the unmanaged interface for giving the information to managed code
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    public ref class ManagedClass
    {
    private:
        Logger* m_pLogger;
        ProgressTextCallbackUnmanaged^ m_TextUnmanaged;
        ObjUnmanaged* m_pUnmanaged;
    
    public:
        ManagedClass()
        {
            m_pUnmanaged = //some code for initialisation
    
            m_pLogger = new Logger();
            m_TextUnmanaged = gcnew ProgressTextCallbackUnmanaged(this,&ManagedClass::ProgressText);
            Logger->SetProgressTextCallback((pFktProgressText)(void*)Marshal::GetFunctionPointerForDelegate(m_TextUnmanaged));
    
            m_pUnmanaged->SetLog(Logger);        
        }
        event ProgressTextCallback^ OnText;
    
        void ProgressText (const char* sLogMessage)
        {
            String^ clistr = gcnew String(szMessage);
            OnText(clistr);
        }    
    }
    

    Kann mir da jemand weiter helfen oder auch evtl generell einen Tipp geben wie man das evtl anders,besser,einfacher machen kann?

    Gruß
    Sascha


Anmelden zum Antworten