首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我是否需要封送由IStream返回的CreateStreamOnHGlobal,以便跨线程使用?

我是否需要封送由IStream返回的CreateStreamOnHGlobal,以便跨线程使用?
EN

Stack Overflow用户
提问于 2013-11-10 21:48:50
回答 1查看 1.1K关注 0票数 3

我有一个COM流对象(IStream),它是用CreateStreamOnHGlobal创建的。

我想在同一个进程中跨不同的线程使用它。我是否需要封送流对象本身(使用CoMarshalInterface等)?还是线程已经安全了?

编辑的、读/写/查找与我的代码中的锁正确同步。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-10 22:23:07

COM将IStream视为一种特殊类型的接口,可以安全地跨线程使用。这是必要的,这样就可以使用IStream使用CoMarshalInterThreadInterfaceInStream跨线程边界封送其他接口。

更多的信息可以在2003年博士的一篇文章中找到:封送COM接口

更新:

最初发布的答案并不完全正确。IStream接口的OLE提供的实现(由CreateStreamOnHGlobal返回并通过CoMarshalInterThreadInterfaceInStream间接创建)可以在同一进程中通过线程安全地访问。

文档是分散的,很难获得。CoMarshalInterThreadInterfaceInStream声明如下:

当在接收线程中运行的客户端试图解组指针时,ppStm参数中返回的流可以保证行为正确。

CreateStreamOnHGlobal可以从SHCreateMemStream获得类似的信息。

CreateStreamOnHGlobal创建的流是线程安全的。

对于所有IStream实现来说,这些保证通常都是不成立的。如果您想安全地使用它,您可以始终使用CoMarshalInterThreadInterfaceInStream跨线程边界封送接口,即使不是严格必要的。是以这种方式封送接口指针是没有害处的,因为如果没有必要进行封送,COM就不会对指针进行封送(或重新发送)。。请记住,这是元帅一次-解封一次。如果您想从多个线程解封接口,可以将接口放置到全局接口表中。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19895635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档