Распределитель для [уникальных] указателей - PullRequest
1 голос
/ 18 июля 2011

Я немного озадачен отсутствием документации по этой проблеме, поэтому я могу быть совершенно не в курсе:

Когда я выделяю память, чтобы вернуть объект через уникальный указатель, значение которого у меня естьизменено, какой распределитель я должен использовать?

В документации сказано, что я могу предоставить 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;
}

1 Ответ

0 голосов
/ 18 июля 2011

С здесь :

Out-параметры должны быть назначены вызываемым;они освобождаются вызывающей стороной с помощью стандартного распределителя памяти задач COM.

, где Распределитель памяти задач COM представляет собой набор методов IMallocнабор функций CoTaskMemAlloc() / CoTaskMemRealloc() / CoTaskMemFree(), обеспечивающих те же функции.

Упомянутые вами функции midl_user-*() используются для управления памятью RPC.Они нужны вам, если вы имеете дело с интерфейсами RPC, а не с интерфейсами COM.

...