COM 中的内存管理

2024-01-10

在COM服务器执行期间分配一块内存,然后通过输出参数将该内存块传递给客户端是很常见的。然后,客户端有义务使用 CoTaskMemFree() 等方法释放该内存。

问题是,这块内存分配在哪里?假设COM服务器和COM客户端处于不同的进程中,为了让客户端访问该内存块,SHOULD被分配在客户端进程的地址空间中。但这是真的吗?我听说 COM 有一个“任务内存分配器”。但我对此知之甚少。

只是一些疯狂的猜测:

首先,COM 服务器根据 COM 客户端的请求使用 CoTaskMemAlloc() 分配内存。

然后,COM 客户端获取该内存,使用它,并通过 CoTaskMemFree() 释放它。

因此,“任务内存分配器”必须跟踪客户端和服务器进程。否则,它不会知道谁(服务器)执行了内存分配操作以及谁(客户端)应该分配该内存。那么,分配的内存将以某种方式injected到客户端的进程地址空间。

有人能解释一下这个话题吗?


好吧,“任务内存分配器”是一个 COM 拥有的分配器,它公开了那些CoTaskMem*功能。现在假设客户端和服务器位于不同的进程中并且服务器使用CoTaskMemAlloc()分配一个“out”参数。它如何到达客户手中?

具有编组功能的 COM 子系统可以做到这一点。服务器分配内存并从其 COM 方法实现返回控制权。 COM 子系统现在必须将调用结果封送到客户端。它只是获取该内存的所有权并将其编组给客户端。客户端在其(客户端)堆上分配自己的块,数据被复制到客户端,服务器上的块被释放。客户端获得该块的所有权,并且必须稍后释放它,否则该块就会泄漏。

因此,客户端和服务器地址空间始终是分开的,不会发生直接数据访问。每个都使用自己的内存分配器,编组在中间启动,使客户端分配内存并使服务器释放内存,以便客户端获得合法分配的块的所有权,而服务器释放它自己分配的块的所有权。

所以对客户来说almost看起来服务器分配了内存并将其返回给客户端。一个值得注意的例外是逻辑地址允许不同 - 例如服务器在地址分配内存0x10001000并将该地址与块一起返回。不保证客户端获得同一逻辑地址处的块 - 该地址将取决于客户端分配器。

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

COM 中的内存管理 的相关文章

  • C# 中 System.String[*] 和 System.String[] 的区别

    Edit 我知道 C 相当于For Each server As String In servers is foreach var item in servers 但是由于GetOPCServers返回对象 应该将其转换为可迭代类型 我正在
  • C# 如何获取 COM 接口的实例

    我做了很多谷歌搜索 试图找到获取 COM 接口实例的标准方法 微软在他们的文章中提供了一个例子COM 互操作第 1 部分 客户端教程 https msdn microsoft com en us library aa645736 v vs
  • 当传递 VBA 类的实时实例时,C# ITypeInfo.GetContainingTypeLib 失败

    所以我尝试过打电话ITypeInfo在 VBA 类实例上 虽然它看起来很有希望 但我想看看是否可以获得对其包含项目 类似于类型库 的引用 我想ITypeInfo GetContainingTypeLib可能有用 但它会抛出一个异常 表明 V
  • Java、Jacob 和 Microsoft Outlook 事件:收到“找不到事件 iid”错误

    我正在编写一个 Java 程序 它使用雅各布图书馆 http danadler com jacob 桥接 COM 和 Java 该程序创建了一个新的MailItem http msdn microsoft com en us library
  • 如何使用 ClickOnce 安装 COM

    我已经安装了使用 TeeChart ActiveX COM 使用 ClickOnce 绘制图表的组件 如果我使用 regsvr32 teechart8 ocx 手动注册 TeeChart 我的 应用程序工作正常 但我想要并且需要使用安装应用
  • OS/X 上的 iTunes COM 接口

    iTunes COM 接口在 Mac OS X 上可用吗 从我能找到的文档来看 它似乎比我可以通过以下方式公开的 Applescript 接口要广泛得多自动机程序 免责声明 这里绝对是 OS X 新手 COM 接口仅适用于 Windows
  • 创建仅包含枚举的 COM 库时出现问题

    我正在做一个 COM 互操作项目 用 C 和 NET Interop 替代一些 VB 和 C ATL COM 项目 当我在 NET 中定义枚举并将它们设为 ComVisible 时 它 们会公开为 Typelib EnumType Enum
  • .NET 组件和 COM 组件有什么区别

    NET 组件和 COM 组件之间有什么区别 有时我们使用 NET 组件包含在我们的项目中 有时我们包含 COM 引用 背后的想法是什么 NET 组件是托管代码 内存处理已为您完成 COM http en wikipedia org wiki
  • 每个新的 COM 类都必须重新实现 IUnknown 接口吗?

    抱歉 如果这个问题对每个人来说都是显而易见的 但我对 COM 很陌生 从教程中我看到这里http www codeguru com cpp com tech activex tutorials article php c5567 http
  • System.Windows.Automation 非常慢

    System Windows Automation 非常慢 我执行 element FindAll TreeScope Children Condition TrueCondition 在速度非常快的计算机上 仅获取 30 个子元素可能需要
  • 使用 Excel Interop 关闭 Excel 应用程序而不保存消息

    我正在使用 Excel Interop COM 对象 我正在编写一种方法 其中打开和关闭 Excel 应用程序 然后打开 Excel 工作簿和工作表 完成这些工作后 我将关闭应用程序和工作簿 我的问题是 此方法可以重复调用多次 当工作表和应
  • 在 C++ 中不使用 CLSID 和注册表即可获取 COM 对象的 DLL 文件

    是否可以在不使用 CLSID 和注册表查找的情况下获取已加载 COM 对象的 DLL 文件名 我有一个IUnknown或者就我而言IBaseFilter接口指针 现在我想获取创建此 COM 对象的 DLL 文件名 我可以使用对象点地址来反向
  • 使用 CoCreateInstance 从 C++ 调用 COMVisible VB.Net dll

    自从我上一个问题以来 在某种程度上取得了进展 我已经编译了以下项目 它是基于https stackoverflow com a 10949784 846550 https stackoverflow com a 10949784 84655
  • 有没有使用 Java 访问 Windows COM 方法的方法?

    我有一个应用程序 它利用 JNA 来调用 C 硬件抽象库中的函数 支持的硬件设备之一需要初始化 Windows COM 子系统 通过 CoInitialize 或 CoInitializeEx 有谁知道有什么 Java 库可以做到这一点吗
  • VB.NET会自动生成ComClass属性和guid吗?

    我运行过一些 VB NET 代码 这些代码显式创建三个 GUID 常量并在类的 ComClass 属性中使用它们 我过去只是通过检查项目选项中的 使 COM 可见 和 注册 COM 互操作 选项来编写 COM 感知类 这个显式代码是否根本没
  • XE2 中的 COM 是否损坏?我该如何解决它?

    Update XE2 Update 2 修复了下述错误 下面的程序是从实际程序中截取的 在 XE2 中失败并出现异常 这是 2010 年的回归 我没有 XE 来测试 但我希望该程序在 XE 上运行良好 感谢 Primo 确认代码在 XE 上
  • 如何使用 Regsvr32 注册 .NET COM DLL?

    我有一个使用 COM DLL 的 VB6 应用程序 该DLL是用C 编写的 在 C 项目属性中 我检查了 Register for COM interop 选项 VB6 应用程序在我的开发机器上运行良好 C 代码完全遵循以下格式 CodeP
  • Windows Server 2008 x64 之上的 Excel 2007 自动化

    我很清楚 Microsoft 支持库文章指出不支持自动化办公产品 UI less 看起来Windows Server 2008 x64 和 Excel 2007执行给定的声明 我在 NT 服务 本地系统帐户 OnStart 方法中运行以下代
  • 使用 VS2012 中的 C++ 中的 ATL 创建 COM

    尝试在 Visual Studio 2012 中使用 ATL 创建简单的 COM 库 我愿意 New ATL Project Welcome to the ATL Project Wizard Next Application Settin
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象

随机推荐

  • 获取 Entity Framework 7 中修改对象的列表

    我很困惑 升级到 Entity Framework 7 并且我通常会覆盖里面的 SaveChangesDbContext能够在更改之前获取所有已修改对象的列表 最终 我有一个脚本可以跟踪数据库中的先前版本 在 Entity Framewor
  • 在 MapView 中的地图标记上方显示弹出窗口

    我不敢相信没有简单的方法可以做这样的基本事情 我想在用户单击地图标记后显示一个弹出窗口 气球 LinearLayout 类似于 Google 地图应用程序中的内容 当用户滚动地图时 它应该随地图移动 做这个的最好方式是什么 一种想法是在我的
  • Google Chrome 应用程序:Web 视图行为

    在研究一个问题时在 Chrome 扩展中
  • 在react-router中配置应用程序的基本名称

    我在反应路由器 2 x 配置方面遇到了一些困难 特别是应用程序基本名称 我有一个应用程序 在其整个生命周期中可能有不同的基本根 例如 开发中 users生产中 account迁移后投入生产 基本名称在几个地方发挥作用 Webpack 中的静
  • 如何在 Objective-C 中以编程方式发送带有某些正文文本的短信 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在 iPhone 上以编程方式发送短信 https stackoverflow com questions 10848 how to programmatically send sms on th
  • Java 8 中致命的死亡钻石

    我是一名 Java 开发人员 同时也在学习 C 我最近进入了 C 中的 死亡钻石 并研究了这个问题在 Java 中是否可能出现 在接口是否解决了 致命的死亡钻石 问题 https stackoverflow com questions 98
  • 使用 ProGuard 和 Android 应用程序时出现重复资源

    我正在尝试将 ProGuard 与我的一个应用程序 假设为 A 一起使用 该应用程序包含另一个应用程序作为库 假设为 B 这是我的 proguard 文件 optimizationpasses 5 dontusemixedcaseclass
  • Hibernate ManyToMany 自连接是否可以用于非键列?获取映射异常

    我遇到以下问题 我有一个与其他用户实体具有多对多关系的用户实体 因此 我想使用多位注释进行自连接 这种关系基于整个系统使用的现有表 因此我根本无法对数据库进行更改 所以我们有 2 个表 User Id ShortName 和 UserLin
  • Linux 磁盘缓存和 kmalloc 与 GFP_ATOMIC

    在一些知名的article https www linuxatemyram com 关于Linux磁盘缓存有这样的说法 绝对没有理由禁用它 Also 一个拥有足够内存的健康 Linux 系统 在运行一段时间后 会显示以下预期且无害的行为 可
  • 我应该如何处理 API 中的错误?

    我正在编写一个 API 它封装了一些核心基础 Web 功能 可以返回许多可能的错误条件 我正在努力决定处理 API 使用者应该处理的错误情况的最佳方法 例如网络超时 接收意外结果 格式错误的 XML 等 我提出了 3 个不同的模型 但不确定
  • 新的 Facebook SDK 应用程序不可用:您尝试使用的应用程序不再可用或访问受到限制

    新用户无法通过 Facebook 登录 并收到一条错误消息 应用程序不可用 您尝试使用的应用程序不再可用或访问受到限制 用户使用现有的 Facebook 帐户进行访问没有任何问题 当我在 Facebook 上创建虚假 测试帐户时 我遇到了这
  • 如何从文件名获取完整文件路径?

    如何获取给定文件的完整路径 例如我提供 string filename test txt 结果应该是 Full File Path C Windows ABC Test test txt Try string fileName test t
  • 应用程序范围的全局变量

    In Rails 我应该在哪里定义Rails堆栈的每一层都可以识别的变量 例如 我想要一个CUSTOMER NAME John 可以访问的变量helper rake task 控制器 and model 我应该在哪里定义这个变量Rails
  • jQuery 当前位置和滚动位置之间的差异

    我试图获取元素距顶部的当前距离与其滚动后的下一个位置之间的差异 事实上 我试图根据其距离来选择动画持续时间 我写了下面的代码 但它不能正常工作 I have 6菜单项 当我单击每个菜单项时 窗口滚动到其位置 但问题是 当我单击最后一项时 它
  • 从控制台运行 Zend Framework 2 操作不起作用

    我有一个 ZF2 应用程序从 Web 服务器正常运行 我需要从命令行运行一些操作 因为我想要执行一些计划任务 cron 作业 所以我找到了这些有用的链接 Zend框架的官方文档 http framework zend com manual
  • 将 vuex 状态与服务器同步的推荐策略

    想象一下这个简单的例子 您有一个 Vue JS 应用程序 用户可以在其中创建任务列表并对它们进行排序 这些列表应由服务器存储在数据库中 假设我们有一个ListComponent它完成了大部分用户体验 我的问题是 我应该使用哪种模式来处理前后
  • 最佳开源 LINQ 提供商 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何更改 C++ STL 向量的特定元素

    vector
  • 表达式等于

    所以 我正在尝试找出表达式树 我试图添加动态等于可查询 其中 T 是几个不同的表之一 我首先检查表中是否包含我想要过滤的字段 ParameterExpression param Expression Parameter typeof TSo
  • COM 中的内存管理

    在COM服务器执行期间分配一块内存 然后通过输出参数将该内存块传递给客户端是很常见的 然后 客户端有义务使用 CoTaskMemFree 等方法释放该内存 问题是 这块内存分配在哪里 假设COM服务器和COM客户端处于不同的进程中 为了让客