我有一个COM流对象(IStream),它是用CreateStreamOnHGlobal创建的。
我想在同一个进程中跨不同的线程使用它。我是否需要封送流对象本身(使用CoMarshalInterface等)?还是线程已经安全了?
编辑的、读/写/查找与我的代码中的锁正确同步。
发布于 2013-11-10 22:23:07
COM将IStream视为一种特殊类型的接口,可以安全地跨线程使用。这是必要的,这样就可以使用IStream使用CoMarshalInterThreadInterfaceInStream跨线程边界封送其他接口。
更多的信息可以在2003年博士的一篇文章中找到:封送COM接口。
更新:
最初发布的答案并不完全正确。IStream接口的OLE提供的实现(由CreateStreamOnHGlobal返回并通过CoMarshalInterThreadInterfaceInStream间接创建)可以在同一进程中通过线程安全地访问。
文档是分散的,很难获得。CoMarshalInterThreadInterfaceInStream声明如下:
当在接收线程中运行的客户端试图解组指针时,ppStm参数中返回的流可以保证行为正确。
CreateStreamOnHGlobal可以从SHCreateMemStream获得类似的信息。
CreateStreamOnHGlobal创建的流是线程安全的。
对于所有IStream实现来说,这些保证通常都是不成立的。如果您想安全地使用它,您可以始终使用CoMarshalInterThreadInterfaceInStream跨线程边界封送接口,即使不是严格必要的。是以这种方式封送接口指针是没有害处的,因为如果没有必要进行封送,COM就不会对指针进行封送(或重新发送)。。请记住,这是元帅一次-解封一次。如果您想从多个线程解封接口,可以将接口放置到全局接口表中。
https://stackoverflow.com/questions/19895635
复制相似问题