【发布时间】:2016-11-19 17:09:16
【问题描述】:
当您在运行对象表中注册一个带有零标志的 COM 对象(请求弱引用)时,ROT 将引用计数增加 1。从 ROT 获取对象的行为将引用计数再增加一.一旦该对象被释放,该对象将保持活动状态,并且引用计数至少为 1。它在 ROT 中的注册也不会在检索时被神奇地撤销。
怎么这么弱?这与强注册有何不同?
强注册遵循相同的模式 - 注册和检索都将引用计数增加一。
ROT返回给公寓内客户端的接口指针不是代理; ROT 无法知道我已经释放了检索到的接口指针。
【问题讨论】:
-
来自IRunningObjectTable::Register: "对于弱注册(ROTFLAGS_REGISTRATIONKEEPSALIVE 未设置),每当对该对象的最后一个强引用被释放时,ROT 都会释放该对象。对于强注册(ROTFLAGS_REGISTRATIONKEEPSALIVE set),ROT 会阻止对象被销毁,直到对象的注册被显式撤销。”
-
我已经读过了。你能解释一下“对对象的最后一个强引用被释放”是什么意思吗?如果您只是从 ROT 中获取它然后释放,它不会释放该对象。在弱场景中,ROT 持有引用,就像在强场景中一样。
-
我理解它的方式(我不得不承认我从未做过额外的检查)是强注册请求
ROTFLAGS_REGISTRATIONKEEPSALIVE确保 ROT 无论如何都持有有效的参考。没有标志,它以类似的方式开始(根本没有其他方式,特别是文档指出初始AddRef总是发生),但 API 保留随时释放条目的权利,特别是。在特定事件上,例如释放代理。 -
弱引用是一次性使用的场景。客户端应用程序执行它需要做的任何事情来启动服务器并检索对象引用。完成后,它的最后一个 Release() 调用也会自动将其从 ROT 中删除,不再有任何引用。服务器知道它可以停止运行。 OLE 已经死了,所以不知道这到底有多实用。
-
在这种情况下'弱引用' == '外部引用' - 来自另一个 com 公寓的对象的引用计数
标签: winapi com win32com running-object-table