爲什麼IClassFactory :: LockServer在我看來IClassFactory :: AddRef/IClassFactory :: Release可以實現相同的目標時存在?IClassFactory :: LockServer的要點是什麼?
7
A
回答
5
這在Don Box的書Essential COM中有詳細的解釋。
AddRef/Release
對IClassFactory類對象的接口通常是在進程外COM服務器中的空方法。這是因爲服務器在調用CoRegisterClassObject
時維護對類對象的內部引用,因此AddRef/Release
的「正常」進程內服務器實現將導致類對象的引用計數始終超過1,並且服務器不知道什麼時候打電話給CoRevokeClassObject
。
在調用CoGetClassObject
後,COM運行時調用IClassFactory::LockServer
將外部引用歸類到類對象。通過這種方式,服務器進程的生命週期可以根據外部參考的存在或其他情況進行適當的控制。
3
我不確定,但我認爲這個想法是,您可以調用CoGetClassObject來獲取類工廠,通過它的IClassFactory接口鎖定它,然後釋放該接口。之後,當您爲同一個類再次調用CoGetClassFactory時,由於它已被鎖定在內存中,系統將僅返回相同的工廠對象而不是創建一個新對象。這可以在您創建該類的許多對象時提高性能。
是的,你可以通過抓住IClassFactory接口指針來實現同樣的目的。但通過在應用程序啓動時鎖定工廠對象並在關閉時解鎖它,您不必在某處(全局變量或任何地方)保存接口指針。
我懷疑他們引入IClassFactory的原因: :LockServer是鎖定服務器在語義上與AddRef'ing相同。 AddRef/Release用於正常的對象生命週期管理並具有明確定義的語義。鎖定服務器是一項性能調整。
相關問題
- 1. 在使用IClassFactory :: LockServer()時是否存在固有的競態條件?
- 2. ArrayLists的要點是什麼?
- 3. 什麼是lambda的要點?
- 4. dbms_lob.createtemporary()的要點是什麼?
- 5. is_null()的要點是什麼?
- 6. object.presence的要點是什麼?
- 7. fetchAll的要點是什麼?
- 8. #define的要點是什麼?
- 9. 存儲過程的要點是什麼?
- 10. (?:x)字符的要點是什麼?
- 11. 嵌套工廠的要點是什麼?
- 12. (NSError **)錯誤的要點是什麼?
- 13. SDL中window_magic的要點是什麼?
- 14. RxJS - 操作員的要點是什麼?
- 15. DateTime類的要點是什麼?
- 16. 什麼是使用模板的要點?
- 17. 編輯會議的要點是什麼?
- 18. Tuple的主要優點是什麼?
- 19. Java中finally塊的要點是什麼?
- 20. Web服務的要點是什麼?
- 21. 大輸入的要點是什麼?
- 22. 休眠的要點是什麼?
- 23. WPF中StatusBarItem類的要點是什麼?
- 24. 反向索引的要點是什麼?
- 25. 聲明樣式的要點是什麼?
- 26. 兼容X-UA的要點是什麼?
- 27. 「perl」命令的要點是什麼?
- 28. 使用(Request $ request)的要點是什麼?
- 29. ULARGE_INTEGER聯盟的要點是什麼?
- 30. 嚴格聲明的要點是什麼?
好主意在那本書中看看......爲什麼我沒有想到這一點! – 2011-02-15 21:34:40