代码之家  ›  专栏  ›  技术社区  ›  domin

组件对象模型(COM):IMALLC::OLLC分配内存?

  •  2
  • domin  · 技术社区  · 6 年前

    为一些遗留项目读入com。到目前为止,我的理解是com只是一个二进制规范,而且所有实现组件(客户机和服务器)都必须遵循这个规范。只要我们使用只接收和返回简单值类型的方法来处理COM接口,我觉得一切都很有意义。

    不过,也有可能 指针 对整个对象/变体(包含例如 SAFEARRAY 从/COM对象中,我想知道这些PARAM对象的内存分配在哪里。我读到它是Windows所拥有的内存,我们不应该篡改它,除非通过COM方法。 然后我偶然发现 IMalloc 与ITS的COM接口 Alloc 方法,它似乎以COM感知方式分配内存的垃圾,完全完成了混乱。

    为了不干扰由C++维护的堆结构(假设我们在C++中编写COM服务器),确切地说 伊莫洛克 分配内存?

    2 回复  |  直到 6 年前
        1
  •  6
  •   Hans Passant    6 年前

    用于创建COM分配专用堆的Windows,COTASKMeMalAccess()直接从它分配。但是,在Win8中被丢弃,它现在从默认进程堆中分配,GETPROCESSHEP()返回它。VS2012的微软CRT也被改变了,用于拥有自己的堆,但是现在也使用了默认的进程堆。

    这些改变的确切原因对我来说是模糊不清的,我从来没有看到一个好的解释。但也不太可能与winrt(又名uwp,又名windows store,又名modern ui)有关。在引擎盖下提供大量的语言运行时集成。或者只是为了避开这些不同的堆经常引起的麻烦。特别是CRT堆是一个DLL地狱噩梦,程序失败,当他们在一个新的VS版本重建,但仍然使用旧DLL。

        2
  •  3
  •   catnip    6 年前

    我对这个问题的回答是: 我不知道也不在乎 .

    你什么 不过,必须遵守规则。COM(和COM对象)可以自由地分配它们所选择的任何内存,并且您可以假设它们在何处或如何使用它们是危险的和不必要的。也许,最终,它最终通过 HeapAlloc() ,但不一定,即使是你也不知道 哪一个 堆。

    客户端的内存分配(通过) CoTaskMemAlloc() ,例如)在调用COM对象时相对较少。COM对象分配它所需的任何内存是比较常见的,以便将调用的结果包起来,然后返回一个指针(通常以另一个COM对象的形式),您可以使用它来做下一步需要做的任何事情。所讨论的方法的API文档将告诉您在完成该指针时要做什么,这就是您需要知道的全部内容。这个确切的机制因api而异,例如:

    • 对于COM对象调用 Release(); 在该对象上(这通常是隐含的,而不是在文档中显式调用)。

    • 对于“原始”指针,文档可能会告诉您调用或 CoTaskMemFree() 或者也许 IMalloc::Free() .

    • 安全阵列调用 SafeArrayUnaccessData() / SafeArrayUnlock() / SafeArrayDestroy() .

    • 有时你需要把一些东西从墙上取下来,比如 SysFreeString() .

    无论如何-永远-对于任何特定的api,阅读文档,你应该没事。