当前位置:  开发笔记 > 编程语言 > 正文

CoTaskMemAlloc的用法?

如何解决《CoTaskMemAlloc的用法?》经验,为你挑选了3个好方法。

什么时候适合使用CoTaskMemAlloc?有人能举个例子吗?



1> Maurice Flan..:

将char*从本机C++库返回到.NET时,使用CoTaskMemAlloc作为字符串.

C#

[DllImport("test.dll", CharSet=CharSet.Ansi)]
extern static string Foo();

C

char* Foo()
{
    std::string response("response");
    int len = response.length() + 1;
    char* buff = (char*) CoTaskMemAlloc(len);
    strcpy_s(buff, len, response.c_str());
    return buff;
}

由于.NET使用CoTaskMemFree,您必须像这样分配字符串,不能使用malloc/new在堆栈或堆上分配它.



2> Jason S..:

天哪,我不得不考虑一下这个 - 我用ATL完成了相当数量的小规模COM编程,很少用它.

有一种情况可以想到:Windows Shell扩展.如果您正在处理一组文件系统对象,则可能必须处理PIDL(指向ID列表的指针).这些是奇怪的小文件系统对象抽象,需要使用COM感知分配器显式分配/解除分配CoTaskMemAlloc.还有一个替代方法,IMalloc接口指针SHGetMalloc(不建议使用)或CoGetMalloc- 它只是一个要使用的抽象层,因此您的代码不依赖于特定的内存分配器,可以使用任何适当的代码.

使用CoTaskMemAlloc或者IMalloc更确切地说malloc(),内存分配/释放需要是"COM-aware",以便在运行时一致地执行其分配和释放,即使分配和释放完全不相关也是如此.代码(例如,Windows分配内存,将其传输到您的C++代码,后来解除分配,或者您的C++代码分配,将其转移到其他人的VB代码,后来取消分配).既malloc()不能也不能new与系统的运行时堆进行互操作,因此您无法使用它们来分配内存以传输到其他COM对象,或者从其他COM对象接收内存并取消分配.



3> reuben..:

这篇MSDN文章比较了Win32公开的各种分配器,包括CoTaskMemAlloc.它主要用于COM编程 - 最具体的是当COM服务器的实现需要分配内存以返回给客户端时.如果您没有编写COM服务器,那么您可能不需要使用它.

(但是,如果调用使用CoTaskMemAlloc分配内存的代码并将其返回给您,则需要使用CoTaskMemFree释放返回的分配.)

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有