C++ :NET Wrapper für COM Objekt.



  • Bin gerade dabei mir für ein Com Objekt einen Wrapper zu schreiben (TAPI). Nun geht es darum das Ich einen Funktionszeiger einer unmanged funktion welche bei einen event ausgelöst wird übergeben habe. Nun soll aus dieser Funktion eine Manged Funktion aufgerufen werden! Ist dies möglich? wenn ja, wie?

    2tens soll dan nicht einfach nur eine manged funktion aufgerufen werden, sondern die eines objektes. Dazu habe Ich versucht ein Manged objekt als (.net referenz ^ (wenn das so heist)) als teil einer unmanged klasse anzugeben, dies scheint jedoch nicht möglich, oder geht das???



  • Soviel ich weiss, wäre es doch einfacher die CCW / RCW Wrapper erzeugen zu lassen (werden z.B. vom Visual Studio erzeugt, wenn dort die entsprechende COM Dll als Referenz hinzugefügt wird).

    Allerdings funktioniert die Idee mit einem eigenen Wrapper bestimmt, ich würde mal googeln nach "Interop COM .NET" oder so...

    Simon



  • nein, da das bei tapi nicht funktioniert!

    mein problem ist zur zeit nur noch, das eine umanged klasse einen event einer manged instanz aufrufen muss! mit einer statischen funktion der manged klasse haut es schon hin!



  • Du musst einen "Umnaganed" Wrapper haben und dann dort via gcroot ein Verweis auf die Managed Klasse hinterlegen. Dann kannst Du von dieser "unmanaged" Klasse die managed Klasse aufrufen.

    Such mal nach "gcroot" und "callback".



  • hab jetzt in der unmanaged klasse folgendes stehen:

    gcroot<TAPI3^> managedTAPI;

    und nun versuche ich in der manged klasse das objekt (also die manged klasse selbst) der unmanged zuzuweisen:

    myUnmanagedTapi->managedTAPI = this;

    funzt aber nicht, fehler:

    Error 1 error C2679: binary '=' : no operator found which takes a right-hand operand of type 'Tapi3Wrapper::TAPI3 ^const ' (or there is no acceptable conversion) d:\Visual Studio Codename Orcas\Projects\Project1\neuTapi3Wrapper\neuTapi3Wrapper\Tapi3Wrapper.cpp 18 neuTapi3Wrapper

    noch ne idee???



  • I.d.R. macht man das so:

    #include "msclr\auto_gcroot.h" 
    
    public ref class MyManagedClass 
    { 
      public: 
        void OnEvent() 
        { 
          // callback 
          Console::WriteLine("OnEvent");
        } 
    }; 
    
    class MyUnmanagedClass 
    { 
      public: 
        MyUnmanagedClass() {}
    
      void SetManagedCallbackObject(MyManagedClass ^pMC) 
      { 
        m_pMC = pMC; 
      } 
    
      void FireEvent() 
      { 
        MyManagedClass ^pMC = m_pMC.get(); 
        if (pMC != nullptr) 
        { 
          pMC->OnEvent(); 
        } 
      }
      protected:
        msclr::auto_gcroot<MyManagedClass^> m_pMC;
    };
    
    void main()
    {
      MyUnmanagedClass uc;
      MyManagedClass^ mc = gcnew MyManagedClass();
      uc.SetManagedCallbackObject(mc);
      uc.FireEvent();
    }
    

Anmelden zum Antworten