我的理解是,IClassFactory :: LockServer()的意義在於,對於給定的COM服務器,擁有一個活的IClassFactory實例並不能阻止服務器在某些情況下被卸載。在使用IClassFactory :: LockServer()時是否存在固有的競態條件?
鑑於此,有什麼可以防止服務器在CoGetClassObject()返回的時間和您調用LockServer()的時間之間卸載?這對我來說似乎是一種競爭條件,但我從粗略的谷歌搜索中找不到任何關於它的任何信息。
我的理解是,IClassFactory :: LockServer()的意義在於,對於給定的COM服務器,擁有一個活的IClassFactory實例並不能阻止服務器在某些情況下被卸載。在使用IClassFactory :: LockServer()時是否存在固有的競態條件?
鑑於此,有什麼可以防止服務器在CoGetClassObject()返回的時間和您調用LockServer()的時間之間卸載?這對我來說似乎是一種競爭條件,但我從粗略的谷歌搜索中找不到任何關於它的任何信息。
CoGetClassObject
返回您IClassFactory
接口指針。
使用進程內服務器,您持有這個指針已經使服務器不能卸載。 Lock
方法解決了在釋放所有未完成的接口(包括IClassFactory
指針問題!)和下一個實例創建請求出現之前加載/卸載/重新加載庫的問題。
進程外服務器自己創建和發佈它們的類工廠,它們的類工廠不影響服務器的鎖定狀態。也就是說,您獲取,引用,釋放類工廠接口指針通常不會影響服務器的鎖定狀態(與Lock
方法不同)。這表明,在創建實際實例之前持有IClassFactory
接口指針可能會使服務器保持未加載狀態,因此在調用CreateInstance
時服務器已經消失。然而,這是COM API幫助保持服務器活躍的地方。
如果是失步服務器,您的客戶端接口指針引用IClassFactory
接口指針將導致類工廠封送拆收器提供的自動IClassFactory::LockServer
調用。用一種不同的方式,但它仍然是正確的:一個持有有效的接口指針的客戶端阻止服務器卸載。
我明白了。看起來他們可能只是要求你保持一個IClassFactory實例的存在,本來會更簡單。不知道我在哪裏讀到IClassFactory實例「不計數」。 – Bwmat 2014-08-28 20:41:19
客戶端通常不直接處理'IClassFactory',而是使用像'CoCreateInstance'這樣的API,它們在內部使用類工廠指針並在使用後釋放。 'Lock'方法提供更長的鎖定。 – 2014-08-28 20:46:10
啊,但是如果你正在使用'CoCreateInstance'之類的東西,那麼你不會像調用'LockServer'那樣。 – Bwmat 2014-08-28 20:51:05