Howto:gcroot<T^> - Managed Klassen in Unmanaged Klassen verwenden



  • Mit Hilfe von gcroot kann man in Unmanaged Klassen Managed Klassen verwenden. So lässt sich z.B. loki::SingleTonHolder verwenden um Fenster in einer MDI Anwendung zu verwalten.

    Gegeben sei:

    ref class managed_class
    {
    public:
    	void test()
    	{
    		MessageBox::Show("TEST");
    	}
    };
    

    Mit

    gcroot<managed_class^>
    

    lässt sich die Klasse in einer unmanaged Klasse verwenden.

    struct unmanaged_class
    {
    	gcroot<managed_class^> m_t;
    };
    

    (Gerade wenn man mit Schnittstellen zwischen .net Strings und std::string arbeiten muss, wird man sicherlich das ein oder andere
    gcrootSystem::String^ verwenden.)

    Um zu prüfen ob in m_t überhaupt schon was vorhanden ist, kann man folgendes verwenden:

    if(static_cast<managed_class^>(m_t) == nullptr)
         return;
    
      m_t->func();
    

    Und anbei noch eine kleine Beispielanwendung zum spielen und zerlegen:

    ref class managed_class
    {
    public:
    	void test()
    	{
    		MessageBox::Show("TEST");
    	}
    };
    
    template <typename T> struct unmanaged_class
    {
    	gcroot<T^> m_t;
    
    	void native_test()
    	{
    		if(static_cast<T^>(m_t) != nullptr)
    			m_t->test();
    	}
    };
    
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
    			 {
    				 unmanaged_class<managed_class> * A = new unmanaged_class<managed_class>;
    				 A->native_test();
    				 A->m_t = gcnew managed_class;
    				 A->native_test();
    			 }
    

Anmelden zum Antworten