cplussharp

Dieser Benutzer hat keine biographischen Informationen freigegeben

Startseite: https://cplussharp.wordpress.com

gemanagte Referenzen in einer nicht gemanagten Klasse speichern

Wenn man C++ CLI und normales C++ in einem Projekt zusammen einsetzt, tauchen früher oder später scheinbar unlösbare Probleme auf. Bei einem Videoplayer den wir zur Zeit programmieren, war es nun soweit.

Um den Programmcode etwas zu entschlacken und den darunter liegenden Algorithmus zur Erstellung eines DirectShow Aufnahmegraphen wieder sichtbar zu machen, wurde es endlich Zeit eine Referenz auf ein gemanagtes Objekt in einer nativen Klasse zu speichern.

Im WPF-Frontend (C#) stellt der Nutzer ein, von welcher Kamera er aufnehmen will und in welches Format das geschehen soll. Diese Konfiguration wird an das Backend (C++) übergeben, in dem schließlich der Aufnahmegraph aufgebaut wird. Dabei kann es sehr viele unterschiedliche Kombination der Konfigurationsparameter geben. Die Art der Kamera (DV, USB, …), die Audioquelle, TimeShift (darüber werde ich bei Gelegenheit auch noch einen Blog-Eintrag schreiben => das war meine Diplomarbeit!) und noch einige mehr spielen hierbei eine Rolle.

Der Aufbau des Aufnahmegraphen erfolgte in einer großen Klasse mit etlichen Funktionen, und immer wieder wurde als Parameter dieser Funktionen ein Parameter vom Typ ICaptureConfiguration^ übergeben. Also habe ich das ganze aufgeflochten und in mehrere Klassen verteilt. Eine abstrakte Basisklasse mit statischen Hilfsfunktionen und einem Interface mit den wichtigsten Methoden, welche dann durch die Detail-Klassen abgedeckt sein müssen. Und um nicht ständig die Konfiguration als Parameter übergeben zu müssen, wird dieser Kontraktur als Member gespeichert.

Doch oh Schreck, was ist das: “Der Typ ICaptureConfiguration^ kann nicht als Membervariable einer nicht C++ CLI Klasse verwendet werden!” Ist ja eigentlich auch logisch, wie soll sonst der Speichermanager der CLR mitbekommen, wann die Referenz nicht mehr gebraucht wird und er das Objekt wieder freigeben kann. Oder noch schlimmer, wenn der Speichermanager des Objekt in seinem Speicher an eine andere Adresse schiebt um Platz zu schaffen, wäre die Referenz plötzlich ungültig! Es gibt nun nur zwei Möglichkeiten: entweder alles auf C++ CLI umstellen, was mindesten 100 Tage oder mehr dauern würde oder aber doch einen Weg finden, die Referenz zu speichern.

Dank google, der MSDN und anderen Seiten ist es mir zum Glück schließlich doch gelungen die Referenz zu speichern. Genau dafür gibt es nämlich das Template gcroot<T>. Es sorgt dafür, dass die zugewiesene Referenz immer erreichbar ist. Da man solch eine Referenz immer mit delete wieder freigeben müsste, ist es besser man nutzt auto_gcroot<T>. Das wird nämlich wie alle Wrapper dieser Art automatisch freigegeben. Im Code sieht das ganze dann in etwa so aus:

#include <msclr\auto_gcroot.h>
#using <mscorlib.dll>

using namespace System;
...

class CCaptureMgrBase
{
    CCaptureMgrBase(ICaptureConfiguration^ captureConfig)
    {
        m_captureConfig = captureConfig;
    }
    ...
    msclr::auto_gcroot<ICaptureConfiguration^> m_captureConfig; 
}

Mit –> kann man nun ganz normal auf die Referenz zugreifen und Funktionen aufrufen.

Eine kleine Anmerkung habe ich allerdings noch. Man kann m_captureConfig nicht mehr einfach so an eine Funktion übergeben, welche ein ICaptureConfiguration^ als Parameter erwarte! Dafür muss man nun m_captureConfig.get() aufrufen.

class CCaptureMgrBase
{
    ...
    void Render()
    {
        // geht nicht:
        CCaptureMgrBase::Helper(m_captureConfig);

        // so ist es richtig
        CCaptureMgrBase::Helper(m_captureConfig.get());
    }

    static void Helper(ICaptureConfiguration^ captureConfig) { ... }
}

,

Hinterlasse einen Kommentar

(Nerd-)Dinner for One MVC Framework

Bei der Suche nach einem guten Framework für die Erstellung von zwei Onlineportalen auf Asp.Net Basis bin ich auf das Asp.Net MVC Framework gestoßen. Ich hatte zwar vorher schon mal davon gelesen und gehört, es aber immer wieder abgetan als “Noch eines dieser sinnlosen Frameworks”.

Model-View-Controller Frameworks sollten jedem Web-Entwickler ein Begriff sein. Angefangen von Ruby on Rails, über die verschiedenen PHP Frameworks wie das Zend Framework, bis schließlich zu den Java Bibliotheken von Struts und Spring, gab es lange Zeit keine vernünftige MVC Unterstützung für die .Net Welt. Dank Scott Guthrie und dem MonoRail Projektes gibt es das nun, und zwar mit dem, seit 2009 unter einer Open Source Lizenz stehenden, Asp.Net MVC Framework.

Ich muss sagen ich bin wirklich begeistert von dem Asp.Net MVC Framework. Ich kann jedem nur den Einführungs-Webcast von dem immer zu Witzen aufgelegten Scott Hanselman empfehlen. Als Referenz für ein eigenes Projekt oder einfach als Einstig in die verschiedene Aspekte des Asp.Net MVC Frameworks dient das Open Source Projekt NerdDinner.com. Passend dazu ist seit kurzem auch des Einführungskapitel des Buches “Professional ASP.NET MVC 2.0” unter Creative Commons freigegeben wurden.

Mehr zu dem Framework und meinen Erfahrungen damit in einem der nächsten Blog-Einträge. Somit erst mal guten rutsch ins neue Jahr.

Hinterlasse einen Kommentar

“Hallo (Blog-)Welt”

Wie es sich bei dem Einstieg in eine neue (Programmier-)Welt gehört, muss diese auch ordentlich begrüßt werden. Da darf das obligatorische “Hallo Welt” natürlich nicht fehlen. In diesem Fall die Welt des Bloggens.

Angestachelt durch das Video „Social Networking for Developers and Making Your Blog Suck Less“ von Scott Hanselman und natürlich durch seinen Blog, habe ich mich dazu  entschlossen, es doch nun auch einmal mit bloggen zu versuchen. Und was liegt da natürlich näher als ein Blog über das was ich tag-täglich mache: Programmieren!

Wie man aus dem Titel des Blogs schon entnehmen kann wird es vorallem um C++ und C# gehen, da das die zwei Sprachen sind mit denen ich am meisten zu tun habe. Und passend dazu natürlich um das .Net Framework (ab Version 2, alles davor war nur Beta). Der Titel soll den Blog aber nicht zu weit einschränken. Ich hab auch sehr viel mit XML und XSLT sowie HTML, JavaScript und CSS zu tun. Und seit kurzem, dank Android, auch wieder mit Java.

Man sieht also schon, es wird eine Bunte Mischung werden. Bei der ich aber hoffentlich den Roten Faden immer im Auge habe, hier mein Wissen, meine Erfahrung und meine Gedanken zusammen zufassen.

Hinterlasse einen Kommentar