Com IClassFactory::LockServer的意义是什么?

Com IClassFactory::LockServer的意义是什么?,com,Com,为什么IClassFactory::LockServer在我看来IClassFactory::AddRef/IClassFactory::Release可以实现相同的目标时存在?我不确定,但我认为想法是可以调用CoGetClassObject来获取类工厂,通过其IClassFactory接口锁定它,然后释放接口。稍后,当您为同一个类再次调用CoGetClassFactory时,由于它被锁定在内存中,系统将只返回同一个factory对象,而不是创建一个新对象。当您创建该类的大量对象时,这可以提高性

为什么IClassFactory::LockServer在我看来IClassFactory::AddRef/IClassFactory::Release可以实现相同的目标时存在?

我不确定,但我认为想法是可以调用CoGetClassObject来获取类工厂,通过其IClassFactory接口锁定它,然后释放接口。稍后,当您为同一个类再次调用CoGetClassFactory时,由于它被锁定在内存中,系统将只返回同一个factory对象,而不是创建一个新对象。当您创建该类的大量对象时,这可以提高性能

是的,您可以通过按住IClassFactory接口指针来实现同样的功能。但是,通过在应用程序启动时锁定factory对象,并在关闭时解锁它,您不必在某个地方(在全局变量或其他任何地方)持有接口指针


我怀疑他们引入IClassFactory::LockServer的原因是,锁定服务器在语义上与添加它不同。AddRef/Release用于正常的对象生命周期管理,并具有明确定义的语义。锁定服务器是一种性能调整。

这在Don Box的书中有详细解释

类对象的IClassFactory接口上的
AddRef/Release
通常是进程外COM服务器中的空方法。这是因为当服务器调用
CoRegisterClassObject
时,对类对象的内部引用由服务器维护,因此
AddRef/Release
的“正常”进程内服务器实现将导致类对象上的引用计数始终超过1,服务器不知道何时调用
CoRevokeClassObject


COM运行时调用
IClassFactory::LockServer
时,会在调用
CoGetClassObject
之后封送对类对象的外部引用。通过这种方式,可以根据外部引用的存在与否来适当控制服务器进程的生命周期。

最好在那本书中查找它。。。我怎么没想到呢!