由于缺乏关于这个问题的文档,我有些困惑,所以我可能完全偏离这里:
当我分配内存以便通过我已修改其值的唯一指针返回一个对象时,我应该使用什么分配器?
文档说我可以提供MIDL_user_allocate()和MIDL_user_free(),并且存根将使用这些 - 但这在CLSCTX_INPROC_SERVER中没有意义,因为调用对象需要使用(并因此解析)我的分配器。
那么,我应该如何在这里分配内存,以便如果DLL被加载到SVCHOST中,存根代码可以正确地释放列表,并且如果需要,应用程序仍然可以直接使用DLL。
IDL:
HRESULT GetItems([out] DWORD *count, [out, size_is(,count)] ITEM **items);
CPP:
HRESULT STDMETHODCALLTYPE impl::GetBuffer(DWORD *count, ITEM **items)
{
*count = 0;
*items = reinterpret_cast<ITEM *>(/* ??? */);
if(!*items)
return E_OUTOFMEMORY;
*count = 5;
/* fill in items */
return S_OK;
}
答案 0 :(得分:0)
来自here:
out-parameters必须由被调用者分配;它们由调用者使用标准COM任务内存分配器释放。
其中COM task memory allocator是一组IMalloc
方法或一组提供相同功能的CoTaskMemAlloc()
/ CoTaskMemRealloc()
/ CoTaskMemFree()
函数。
您提到的midl_user-*()
函数用于RPC内存管理。如果您处理RPC接口而不是COM接口,则需要它们。