W
wie mache ich ein einzelnes COM-objekt, das ich innerhalb meiner applikation verwende, mit regsvr32 bekannt? dazu müsste ich es doch in eine dll kapseln, die NUR dieses objekt mit dazugehörigen RegisterServer/UnregisterServer-funktionen enthält, oder nicht? muss ich denn wirklich JEDES objekt, das IUnknown implementiert im system registrieren -- auch wenn ich es nur innerhalb des selben prozesses für debugging-zwecke verwende um ein paar meldungen auf die console raus zu schreiben? sorry, wenn ich das nochmals anzweifle, aber das klingt für mich so absurd, dass es mir schwer fällt, das zu akzeptieren
Du musst natürlich nur die Komponente registrieren und nicht jede Klasse die IUnknown implementiert. Das ganze natürlich in einer DLL mit DllRegisterServer/DllUnRegisterServer.
vielleicht war's ja ein missverständnis: also ich brauche das objekt NUR intern und kann es im notfall auch selbst erzeugen, wenn das irgendwie ohne größere umstände möglich ist (nochmals stichwort factory... den teil der kommentare hab ich nicht ganz verstanden -- in combase.h von den DirectShow BaseClasses gibts ja dieses CFactoryTemplate).
Wenn du es nur intern verwenden willst und nichts nach aussem exponierst, kannst natürlich ganz normal deine Objekte erzeugen. (hat ja dann auch nix mehr mit COM zu tun)
hm, das versteh ich nicht. wo kommen denn die NonDelegating*-Methoden ins spiel? ich finde nicht heraus, wo die aufgerufen werden
Das NonDelegatingQueryInterface ist an der Klasse die auch mit CreateInstance erzeugt wird (wieder QueryInterface Delegation). Das ist der Teil den du auch im CFactoryTemplate angibst. Aufgerufen wird das ganze vom der erstellenden Instanz. (Also jenem der CoCreateInstance aufruft)
z.b.
CFactoryTemplate g_Templates[] =
{
{
g_FilterName,
&CLSID_SomeClass,
CSomeClass::CreateInstance, <--- HIER!
NULL,
&AMSFilterSomeClass
},
{
g_PropertyPageName,
&CLSID_SomeClass_PropertyPage,
CDebugSettings::CreateInstance,
NULL,
NULL
}
};
Sofern alles consistent ist trägt das Macro AMovieDllRegisterServer2 deine Komponente in die Registry ein.