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

dom*_*min 2 c++ com winapi dynamic-memory-allocation

阅读COM以获取一些遗留项目.到目前为止,我的理解是COM只是一个二进制规范,并且所有实现组件(客户端和服务器)必须遵守此规范.只要我们使用接收和返回简单值类型的方法处理COM接口,一切对我来说都是完美的.

但是,也有可能从COM对象发送指向整个对象/变体(包含例如a SAFEARRAY)的指针,我想知道这些param对象的内存在哪里被分配.我读到它是由windows拥有的内存,我们不应该通过COM方法篡改它.然后我偶然发现了IMallocCOM接口及其Alloc方法,它似乎以COM感知的方式分配了一大堆内存,完美地完成了混乱.

为了不干扰由C++维护的堆结构(假设我们用C++编写COM服务器),究竟在哪里IMalloc分配内存?

Han*_*ant 6

Windows用于为COM分配创建专用堆,CoTaskMemAlloc()直接从中分配它.然而,它在Win8中被删除,它现在从默认进程堆分配,GetProcessHeap()返回它.VS2012上的Microsoft CRT也发生了变化,曾经拥有自己的堆,但现在也使用了默认的进程堆.

这些改变的确切原因对我来说是模糊的,我从来没有看到它的好解释.但是不一定与WinRT(又名UWP,又名Windows Store,又名现代UI)有关.引擎盖下的COM很强大,但语言投影提供了非常紧密的语言运行时集成.或者只是为了绕过这些不同堆常常造成的麻烦.特别是CRT堆是一个DLL地狱的噩梦,当程序在新的VS版本上重建但仍然使用旧的DLL时,程序失败了.

  • 你得到了我的祝福,当代码爆炸时这很重要.你不得不怀疑有多少开发人员确实知道他们需要在Win7上重新测试他们的应用程序.虽然这似乎没有经常出现问题. (2认同)