在使用IClassFactory :: LockServer()时是否存在固有的竞争条件?

时间:2014-08-28 20:19:29

标签: com race-condition

我的理解是IClassFactory :: LockServer()的意思是拥有给定COM服务器的实时IClassFactory实例并不会阻止服务器在某些情况下被卸载。

鉴于此,有什么能阻止服务器在CoGetClassObject()返回的时间和调用LockServer()的时间之间被卸载吗?这对我来说似乎是一种竞争条件,但我无法通过粗略的谷歌搜索找到任何相关信息。

1 个答案:

答案 0 :(得分:2)

CoGetClassObject返回IClassFactory接口指针。

使用进程内服务器,持有此指针已使服务器无法卸载。 Lock方法解决了在发布所有未完成的接口(包括有问题的IClassFactory指针!)之后以及下一个实例创建请求出现之前加载/卸载/重新加载库的问题。

进程外服务器自己创建和发布他们的类工厂,他们的类工厂不会影响服务器的锁定状态。也就是说,获取,引用,释放类工厂接口指针通常不应影响服务器的锁定状态(与Lock方法不同)。这表明在创建实际实例之前保持IClassFactory接口指针可能会使服务器处于无法加载状态,因此在CreateInstance调用时服务器已经消失。但是,这是COM API帮助保持服务器活动的地方。

如果是out-of-proc服务器,IClassFactory接口指针上的客户端接口指针引用会导致类工厂封送程序提供的自动IClassFactory::LockServer调用。以不同的方式但仍然如此:持有有效IClassFactory接口指针的客户端阻止服务器卸载。