2013-10-03 48 views
-1

MSDN:COM類不能夠實例

「您可以爲每個(COM)類對象的,你提供被實例化的IClassFactory的接口。」

創建沒有Class Factory的COM類很有用嗎?

回答

4

的IClassFactory的提供了一種用於被實例化直接由呼叫者對象,例如使用CreateObjectCoCreateInstance,或GetObject

通過從創建的對象間接獲取其他對象可以獲得其他對象。

例如,VB或VBScript中的Scripting.FileSystemObject是直接創建的。您可以使用這些方法獲取無法直接創建的對象FileFolder。相反,這些由FileSystemObject創建並從FileSystemObject方法返回。

+0

所以,有一些COM對象的層次結構。就像OOP方面的「繼承」一樣。好例子! –

+1

@UnhandledException,並不像繼承。您創建的對象可以充當其他對象的工廠,或者可以從函數返回它們。 IClassFactory的目的是作爲一個***標準***工廠來爲您創建的對象***直接***。這是一個方便 - 本質上就是「如果你想讓CreateObject/CoCreateInstance工作,你所做的事情」。 – Ben

1

它是有用的,而不類工廠創建COM類?

是的,爲什麼不呢?它仍然可以是全功能的COM類,只是你不能通過CoCreateInstance API啓動它。出於某種原因,您可能希望以其他方式使其可用,例如作爲另一個接口/類的方法的返回[out]參數,或者通過GetActiveObject API。

類工廠讓你暴露你的類直接實例化。

+0

我不知道。爲什麼不是或爲什麼是。這是一個問題。這並沒有告訴你我抱怨某件事。我正在深入,想要學習事實。謝謝你的答案。 –

+0

如果您從地面構建所有東西,並且您不需要班級工廠,那麼您可能需要跳過它。標準框架和庫通常會爲您提供默認的類工廠實現,並且它在您的課堂上便宜且易於使用,您可能需要一個特定的罕見原因來拒絕爲您提供的默認標準類工廠。 –

+0

好吧,據我瞭解,自定義保理有一些罕見的好處。 –

0

我不完全確定這裏的措辭是非常正確的。您幾乎總是執行IClassFactory一次對於全部您的主機將實例化的對象的COM類。特別是,你的IClassFactory的實現是從DllGetClassObject返回的。

特別是,當有人呼叫CoCreateInstance(CLSID_foo, pUnkOuter, CLSCTX_INPROC, IID_IFoo, (void **) &pFoo),下面的事情發生(假設你沒有做遠程):

  1. COM查找CLSID_foo在註冊表中。 (特別是HKEY_CLASSES_ROOT \ CLSID \\ InprocServer32)。
  2. COM加載該DLL並使用IID_IClassFactory調用DllGetClassObject
  3. 您的DLL返回一個函數指針,指向IClassFactory的實現。
  4. COM調用您的實施IClassFactory::CreateInstancepUnkOuter,IID_IFoopFoo

還有很多其他的情況,你會有COM對象不能直接創建,就像@Ben提到的那樣。甚至還有其他標準工廠接口,如IServiceProvider,它們的存在使得類可以公開一組動態接口。