回答
的IClassFactory的提供了一種用於被實例化直接由呼叫者對象,例如使用CreateObject
或CoCreateInstance
,或GetObject
。
通過從創建的對象間接獲取其他對象可以獲得其他對象。
例如,VB或VBScript中的Scripting.FileSystemObject
是直接創建的。您可以使用這些方法獲取無法直接創建的對象File
或Folder
。相反,這些由FileSystemObject創建並從FileSystemObject方法返回。
它是有用的,而不類工廠創建COM類?
是的,爲什麼不呢?它仍然可以是全功能的COM類,只是你不能通過CoCreateInstance
API啓動它。出於某種原因,您可能希望以其他方式使其可用,例如作爲另一個接口/類的方法的返回[out]參數,或者通過GetActiveObject
API。
類工廠讓你暴露你的類直接實例化。
我不知道。爲什麼不是或爲什麼是。這是一個問題。這並沒有告訴你我抱怨某件事。我正在深入,想要學習事實。謝謝你的答案。 –
如果您從地面構建所有東西,並且您不需要班級工廠,那麼您可能需要跳過它。標準框架和庫通常會爲您提供默認的類工廠實現,並且它在您的課堂上便宜且易於使用,您可能需要一個特定的罕見原因來拒絕爲您提供的默認標準類工廠。 –
好吧,據我瞭解,自定義保理有一些罕見的好處。 –
我不完全確定這裏的措辭是非常正確的。您幾乎總是執行IClassFactory一次對於全部您的主機將實例化的對象的COM類。特別是,你的IClassFactory的實現是從DllGetClassObject返回的。
特別是,當有人呼叫CoCreateInstance(CLSID_foo, pUnkOuter, CLSCTX_INPROC, IID_IFoo, (void **) &pFoo)
,下面的事情發生(假設你沒有做遠程):
- COM查找
CLSID_foo
在註冊表中。 (特別是HKEY_CLASSES_ROOT \ CLSID \\ InprocServer32)。 - COM加載該DLL並使用IID_IClassFactory調用DllGetClassObject。
- 您的DLL返回一個函數指針,指向IClassFactory的實現。
- COM調用您的實施IClassFactory::CreateInstance與
pUnkOuter
,IID_IFoo
和pFoo
。
還有很多其他的情況,你會有COM對象不能直接創建,就像@Ben提到的那樣。甚至還有其他標準工廠接口,如IServiceProvider,它們的存在使得類可以公開一組動態接口。
- 1. 不能夠實例化angular2
- 2. Java - 設置能夠引用不同類的實例
- 3. 類不能實例化
- 4. 實例化一個COM和ATL類型
- 5. 強制.NET類型實例化爲COM
- 6. ATL COM類的單個實例
- 7. 不能實例化類例外TestNG
- 8. 布點,不能夠實現
- 9. 能夠從不同的類
- 10. 不能在C#中實例化COM組件 - 錯誤80070002
- 11. 不能實例
- 12. 創建一個COM類能夠爲每個使用VB.NET循環
- 13. Python實例到COM對象
- 14. COM實例(從PHP調用)
- 15. 多實例COM對象
- 16. COM接口實例C#
- 17. 不能夠實例化多個對象QML
- 18. java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap不能轉換到com。示例
- 19. 無法訪問www.domain1.com,但能夠訪問sub1.domain1.com
- 20. 實例化類方法而不實例化PHP中的類不再可能?
- 21. 有沒有辦法使用TypeAdapter能夠序列化父類和子類實例
- 22. 以下類不能被實例化,android.support.design.widget.FloatingActionButton
- 23. 不能實例化一個泛型類
- 24. 不能使類的實例在Django
- 25. Gradle - 不能實例化常春藤類
- 26. 不能實例化一個java類
- 27. 錯誤:類不能被實例化
- 28. 類實例不能在Objective-C
- 29. 以下類不能被實例化:com.google.ads.AdView()
- 30. 以下類不能被實例化:android.support.constraint.ConstraintLayout
所以,有一些COM對象的層次結構。就像OOP方面的「繼承」一樣。好例子! –
@UnhandledException,並不像繼承。您創建的對象可以充當其他對象的工廠,或者可以從函數返回它們。 IClassFactory的目的是作爲一個***標準***工廠來爲您創建的對象***直接***。這是一個方便 - 本質上就是「如果你想讓CreateObject/CoCreateInstance工作,你所做的事情」。 – Ben