- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
为一些遗留项目读入 COM。到目前为止,我的理解是 COM 只是一个二进制规范,所有实现组件(客户端和服务器)都必须遵守这个规范。只要我们使用仅接收和返回简单值类型的方法处理 COM 接口(interface),一切对我来说都非常有意义。
然而,也有可能从/向 COM 对象发送指针到整个对象/变体(包含例如 SAFEARRAY
),我想知道内存在哪里这些参数对象的分配。我读到它是 Windows 拥有的内存,我们不应该篡改它,除非通过 COM 方法。然后我偶然发现了 IMalloc
COM 接口(interface)及其 Alloc
方法,它似乎以 COM 感知的方式分配了一堆内存,完美地解决了这个问题。
为了不干扰由例如维护的堆结构C++(假设我们正在用 C++ 编写 COM 服务器),IMalloc
到底在哪里分配内存?
最佳答案
Windows 曾经为 COM 分配创建专用堆,CoTaskMemAlloc() 直接从中分配。然而,它在 Win8 中被删除,它现在从默认进程堆分配,GetProcessHeap() 返回它。 VS2012 的 Microsoft CRT 也发生了变化,以前有自己的堆,但现在也使用默认进程堆。
进行这些更改的确切原因对我来说是模糊的,我从来没有看到一个很好的解释。但与 WinRT(又名 UWP、Windows Store、Modern UI)的关系不大可能。引擎盖下主要由 COM 驱动,但语言投影提供了非常紧密的语言运行时集成。或者只是为了绕过这些不同堆过去经常造成的麻烦。尤其是 CRT 堆是 DLL hell 的噩梦,当程序在新的 VS 版本上重建但仍然使用旧的 DLL 时,它们会惨败。
关于c++ - 组件对象模型 (COM):IMalloc::Alloc 在哪里分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50983794/
我正在尝试在 Delphi XE 中重构 Delphi 5 项目,为此我需要修复名为 BrowseDr 的单元中的一些错误。我收到的错误是 [DCC Error] BrowseDr.pas(1033)
为一些遗留项目读入 COM。到目前为止,我的理解是 COM 只是一个二进制规范,所有实现组件(客户端和服务器)都必须遵守这个规范。只要我们使用仅接收和返回简单值类型的方法处理 COM 接口(inter
我是一名优秀的程序员,十分优秀!