2011-02-15 65 views

回答

5

這在Don Box的書Essential COM中有詳細的解釋。

AddRef/Release對IClassFactory類對象的接口通常是在進程外COM服務器中的空方法。這是因爲服務器在調用CoRegisterClassObject時維護對類對象的內部引用,因此AddRef/Release的「正常」進程內服務器實現將導致類對象的引用計數始終超過1,並且服務器不知道什麼時候打電話給CoRevokeClassObject

在調用CoGetClassObject後,COM運行時調用IClassFactory::LockServer將外部引用歸類到類對象。通過這種方式,服務器進程的生命週期可以根據外部參考的存在或其他情況進行適當的控制。

+0

好主意在那本書中看看......爲什麼我沒有想到這一點! – 2011-02-15 21:34:40

3

我不確定,但我認爲這個想法是,您可以調用CoGetClassObject來獲取類工廠,通過它的IClassFactory接口鎖定它,然後釋放該接口。之後,當您爲同一個類再次調用CoGetClassFactory時,由於它已被鎖定在內存中,系統將僅返回相同的工廠對象而不是創建一個新對象。這可以在您創建該類的許多對象時提高性能。

是的,你可以通過抓住IClassFactory接口指針來實現同樣的目的。但通過在應用程序啓動時鎖定工廠對象並在關閉時解鎖它,您不必在某處(全局變量或任何地方)保存接口指針。

我懷疑他們引入IClassFactory的原因: :LockServer是鎖定服務器在語義上與AddRef'ing相同。 AddRef/Release用於正常的對象生命週期管理並具有明確定義的語義。鎖定服務器是一項性能調整。