为什么IClassFactory :: LockServer在我看来IClassFactory :: AddRef / IClassFactory :: Release可以达到同样的目标时存在?
答案 0 :(得分:5)
Don Box的书Essential COM中详细解释了这一点。
类对象的IClassFactory接口上的 AddRef/Release
通常是进程外COM服务器中的空方法。这是因为服务器在调用CoRegisterClassObject
时会维护对类对象的内部引用,因此AddRef/Release
的“正常”进程内服务器实现将导致类的引用计数对象总是超过一个,服务器不知道何时调用CoRevokeClassObject
。
COM运行时在调用IClassFactory::LockServer
之后调度对类对象的外部引用时调用CoGetClassObject
。通过这种方式,可以根据外部引用的存在或其他方式适当地控制服务器进程生存期。
答案 1 :(得分:3)
我不确定,但我认为你可以调用CoGetClassObject获取类工厂,通过其IClassFactory接口锁定它,然后释放接口。稍后当您再次为同一个类调用CoGetClassFactory时,由于它已被锁定在内存中,因此系统将返回相同的工厂对象而不是创建新对象。这可以在您创建该类的大量对象时提高性能。
是的,您可以通过保持IClassFactory接口指针来实现相同的功能。但是,通过在应用程序启动时锁定工厂对象,并在关闭时解锁它,您不必在某处保存接口指针(在全局变量或其他任何位置。)
我怀疑他们引入IClassFactory :: LockServer的原因是锁定服务器在语义上与AddRef没有相同。 AddRef / Release用于正常的对象生命周期管理,并具有明确定义的语义。锁定服务器是一项性能调整。