我是否需要封送 CreateStreamOnHGlobal 返回的 IStream 以供跨线程使用?

2024-04-04

我有一个 COM 流对象(IStream http://msdn.microsoft.com/en-us/library/aa380034%28v=vs.85%29.aspx),创建于CreateStreamOnHGlobal http://msdn.microsoft.com/en-us/library/windows/desktop/aa378980%28v=vs.85%29.aspx.

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

EDITED,读/写/查找与我的代码中的锁正确同步。


COM 款待IStream作为一种特殊类型的接口,可以安全地跨线程使用。这是必要的,以便其他接口可以在一个线程中跨线程边界进行编组。IStream using CoMarshalInterThreadInterfaceInStream http://msdn.microsoft.com/en-us/library/windows/desktop/ms693316.aspx.

更多信息可以在 Dobb 博士 2003 年的一篇文章中找到:编组 COM 接口 http://www.drdobbs.com/marshaling-com-interfaces/184416838.

Update:

最初发布的答案并不完全正确。 OLE 提供的实现IStream接口,由返回CreateStreamOnHGlobal http://msdn.microsoft.com/en-us/library/windows/desktop/aa378980.aspx并通过间接创建CoMarshalInterThreadInterfaceInStream http://msdn.microsoft.com/en-us/library/windows/desktop/ms693316.aspx可以在同一进程中跨线程安全地访问。

文档分散且难以获取。CoMarshalInterThreadInterfaceInStream陈述如下:

当接收线程中运行的客户端尝试解组指针时,保证 ppStm 参数中返回的流能够正确运行。

类似的信息可用于CreateStreamOnHGlobal from SHCreateMemStream http://msdn.microsoft.com/en-us/library/windows/desktop/bb773831.aspx:

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

这些保证通常并不适用于所有人IStream实施。如果您想安全起见,您始终可以使用跨线程边界编组接口CoMarshalInterThreadInterfaceInStream,即使不是绝对必要的。这是以这种方式编组接口指针永远不会有害,因为 COM 足够聪明,如果不需要编组,不会编组(或重新编组)指针 http://msdn.microsoft.com/en-us/magazine/cc302324.aspx。请记住,这是编组一次 - 解组一次。如果您想从多个线程中解组接口,您可以将接口放入全局接口表 http://msdn.microsoft.com/en-us/library/windows/desktop/ms693781.aspx.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我是否需要封送 CreateStreamOnHGlobal 返回的 IStream 以供跨线程使用? 的相关文章

  • Jupyter Notebook 中的多处理与线程

    我试图测试这个例子here https ipywidgets readthedocs io en stable examples Widget 20Asynchronous html将其从线程更改为多处理 在 jupyter Noteboo
  • 使用 System.Security.Cryptography 将 Win32 Crypto API 调用转换为 C#

    我接到一项任务 要删除我们产品的一个 dll 并将其替换为纯 C 的 dll 旧的 DLL 是 NET 2 0 托管 C C CLI 它包装了对 Win32 本机加密 API 的调用 新的 DLL 应公开具有相同名称和方法的新对象 但应使用
  • 从安全角度来看,在 Windows 中使用管道是否被认为是危险的?

    从安全角度来看 在 Windows 中使用管道是否被认为是危险的 管道在 Windows 中并不是一个特殊的安全风险 如果您担心安全性 请确保将管道上的安全描述符设置为适当的 DACL 如果您的使用要求管道开放供任何人连接 那么您必须将传入
  • 有没有办法在 Windows 上全局安装 Composer?

    我读过全局安装文档 http getcomposer org doc 00 intro md globally对于 Composer 但仅适用于 nix 系统 curl s https getcomposer org installer p
  • 我可以在 R 中并行读取 1 个大 CSV 文件吗? [复制]

    这个问题在这里已经有答案了 我有一个很大的 csv 文件 需要很长时间才能阅读 我可以使用 parallel 或相关的包在 R 中并行读取此内容吗 我尝试过使用 mclapply 但它不起作用 根据OP的评论 fread来自data tab
  • Powershell 设置盖子关闭操作

    我想自动设置 Windows 7 在我的工作笔记本电脑上合上盖子时所执行的操作 因为每次登录时都会通过 GPO 重置该操作 我知道我可以在批处理脚本中使用 powercfg 命令来实现此目的 powercfg setacvalueindex
  • 判断线程是否已经启动

    如何判断Python线程是否已经启动 有一个方法is alive 但这是真的before and while一个线程正在运行 你可以看看ident领域的Thread实例 这Python 2 7 线程文档 http docs python o
  • 如何使用 Apache Arrow 在 Windows 上使用 C++ 编写 Parquet 格式的文件?

    我正在尝试使用 C 在 Windows 上编写 Parquet 文件 我按照我找到的说明进行操作here https github com apache arrow blob master docs source developers cp
  • Windows 任务计划程序报告不正确/不一致的结果代码

    背景 我正在尝试在计划任务失败时收到电子邮件通知 我的任务可以通过退出代码 错误级别 指示失败 我想使用它并遵循中描述的过滤方法这个答案 https stackoverflow com a 4289360 29805触发电子邮件 Probl
  • 使用 C# 的异步 WebRequest

    您好 我有一个函数 它将 url Get 参数传递到网络服务器上的 php 文件 并等待文件的响应 通常需要 10 20 秒 我想将其放入一个循环中 因为我必须一次将这些 Get 请求发送到大约 5 个不同的 php 文件 但是当我尝试将其
  • 如何驯服 Windows 标头(有用的定义)?

    在其中一个答案中this https stackoverflow com questions 1394132 macro and member function conflict问题jalf https stackoverflow com
  • 避免回绕的 timeGetTime 的最佳替代品是什么?

    time获取时间 http msdn microsoft com en us library dd757629 VS 85 aspx查询系统时间似乎相当不错 然而 它的返回值仅为 32 位 因此大约每 49 天环绕一次 在调用代码中检测翻转
  • 如何从网页启动 Windows 应用程序?

    我们有一个公司内部网 并且权力机构认为拥有一组代表大多数代表使用的应用程序 Outlook Excel 少数其他应用程序 的图标 链接会很好 这个想法是 如果安装了应用程序 单击链接 图标将在客户端计算机上启动该应用程序 有人曾经有过这样的
  • 命令行显示文件的属性?

    我想编写一个显示默认 Windows 属性表的应用程序 我找不到太多关于以正常编程方式执行此操作的信息 所以我想也许可以使用命令行调用 有谁知道 Windows 命令行调用文件的属性 详细信息窗口吗 没有任何运气去寻找它 这个窗口在这里 看
  • Sigar API for JAVA(需要指南)

    我已经下载了 Sigar API http support hyperic com display SIGAR Home http support hyperic com display SIGAR Home 并希望在项目中使用它来获取有关
  • 内存不一致与线程交错有何不同?

    我正在编写一个多线程程序 正在研究是否应该使用volatile对于我的布尔标志 关于并发性的文档 oracle Trail 没有解释任何关于memory consistency errors以外 当不同的线程有内存一致性错误时 就会发生内存
  • 内核与系统中的 Windows 进程

    我有一些与内核和用户模式下的 Windows 进程相关的问题 如果我有一个 hello world 应用程序和一个公开新系统调用 foo 的 hello world 驱动程序 我很好奇一旦处于内核模式 我能做什么和不能做什么 对于初学者来说
  • 在特定线程上运行工作

    我想要一个特定的线程 任务队列并在该单独的线程中处理任务 应用程序将根据用户的使用情况创建任务并将其排队到任务队列中 然后单独的线程处理任务 即使队列为空 保持线程活动并使用它来处理排队任务也至关重要 我尝试过几种实现TaskSchedul
  • 阴影空间示例

    EDIT 我接受了下面的答案 并添加了我自己的代码的最终修订版 希望它向人们展示影子空间分配的实际示例 而不是更多的文字 编辑 2 我还设法在 YouTube 视频 所有内容 的注释中找到了一个调用约定 PDF 的链接 其中有一些关于 Li
  • 使用任务的经典永无止境的线程循环?

    给出了一个非常常见的线程场景 宣言 private Thread thread private bool isRunning false Start thread new Thread gt NeverEndingProc thread S

随机推荐