gpt4 book ai didi

c++ - 组件对象模型 (COM):IMalloc::Alloc 在哪里分配内存?

转载 作者:太空狗 更新时间:2023-10-29 23:43:27 24 4
gpt4 key购买 nike

为一些遗留项目读入 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com