UI Automation回调中COM对象所有权:是否需Release传入元素?
关于UI Automation回调中
IUIAutomationElement* sender的Release()问题 好问题!这是COM编程里很容易踩坑的细节,针对你问的这个场景,结论非常明确:
你完全不需要对这个sender对象调用Release()方法
原因完全遵循COM的参数传递规范:
- 标记为
[in]的指针参数,由调用方(也就是UI Automation框架)负责在传递给你的事件处理程序前调用AddRef(),确保对象在你使用期间是有效的。 - 当你的
HandleFocusChangedEvent方法执行完毕返回后,框架会自行调用Release()来回收这个对象的引用。
如果额外调用Release(),反而会打破引用计数的平衡,导致对象被提前销毁或者触发内存访问错误。
当然,如果你需要在事件处理方法之外的代码里继续使用这个元素对象,那你需要主动调用AddRef()来保留引用,等你用完这个对象后,再调用Release()来释放你自己增加的引用。
内容的提问来源于stack exchange,提问作者lwa
相关产品推荐
相关产品推荐

