2012-04-06 6 views
1

Ich untersuche DirectShow-Beispiele von Windows SDK. Viele der Klassen verfügen über einen nicht standardmäßigen Konstruktor. Wie heißen diese Konstruktoren? Wer liefert Argumente?Warum COM-Klassen Konstruktor benötigen? Wie verwende ich COM-Klasse ohne Registrierung?

Kann ich diese Klassen in C++ - Programmen ohne Registrierung verwenden? Wenn ja, könnte ich den Klassenkonstruktor direkt verwenden.

Wenn ich eine COM-Klasse ohne Registrierung verwenden, was im folgenden Code-Fragment passiert:

Foo * foo = new Foo(.....); // note, not using CoCreateInstance 
Bar * bar = foo->QueryInterface(...); 
bar->Release(); 
delete foo; // CRASH? 

Vielen Dank!

+0

Sie wissen nicht, wie 'Release' im allgemeinen Fall implementiert wird (es könnte sogar ein No-Op sein, oder einen anderen Speicherzuordner verwenden). Hier wird es wahrscheinlich "löschen". Sie sollten 'CoCreateInstance' +' Release' verwenden, dies ist die einzig sichere Sache. –

Antwort

2

Es hat nichts mit COM zu tun, ist es nur der Rahmen auf diese Weise und Konstruktorargumente gebaut in Directshow Basisklassen alles zusammen sind notwendig zu bekommen - die Klasse, die Vorfahren, die instanziierenden Fabrik.

Die Verwendung der COM-Klasse ohne Registrierung ist möglicherweise möglich oder nicht möglich. Ich vermute, dass Sie daran interessiert sein könnten, den DirectShow-Filter ohne Registrierung zu verwenden, und es gibt einen guten Artikel zum Thema: Using Filters Without Registration.

2

Eine C++ - Klasse, die als real freigegeben wird COM-CoClass kann im Allgemeinen keinen Konstruktor haben, der Argumente übernimmt. Es gibt keinen Mechanismus für den COM-Client-Code, um Argumente an die CoCreateInstance() - Funktion zu übergeben. Eine COM-Schnittstelle verfügt normalerweise über eine Initialize() - Methode, um die erforderliche Initialisierung bereitzustellen. Technisch gesehen, das auch manipuliert werden kann, ist CoCreateInstance nur eine praktische Funktion, die die Klassenfactory (IClassFactory) versteckt. Eine benutzerdefinierte Klassenfactory mit einer benutzerdefinierten CreateInstance() -Methode ist möglich, aber selten erledigt.

Microsoft verwendet das interface-basierte Programmiermodell, das auch in COM-Code in Nicht-COM-Code verwendet wird. DirectX ist ein gutes Beispiel. Denken Sie an Direct3DCreate9Ex() als die Klassenfabrik.

Verwandte Themen