Форум: "Corba";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];
ВнизВыделение и освобождение памяти для out-параметров COM-серверов Найти похожие ветки
← →
Григорьев Антон © (2005-01-27 08:16) [0]Как правильно выполнять сабж? Допустим, есть такой метод у интерфейса ISomeInterface:
void SomeFunc([out]long* ArrLen, [out, sizeis(,*ArrLen)] BYTE* Arr);
При вызове этой процедуры сервер должен создать массив заранее неизвестной длины и записать указатель на него в переменную, переданную клиентом. Освободить память, выделенную массиву, должен потом клиент. Какие методы выделения/освобождения памяти надо использовать (желательно, универсальные, подходящие для внутренних, локальных и удалённых серверов).
Клиент на Delphi будет выглядеть примерно так:ISomeInterface=interface
procedure SomeFunc(var ArrLen:LongInt;var Arr:PByteArray);
end;
var
Len:LongInt;
Arr:PByteArray;
SomeFunc(Len,Arr); // Получили указатель на созданный сервером массив
...
// Как теперь корректно освободить память, выделенную для массива?
В тех клиентах и серверах, исходники которых я видел, использовались функции CoTaskMemAlloc/CoTaskMemFree (что, как я понял из MSDN, эквивалентно использованию IMalloc). Но почему именно эти функции? Я нигде не нашёл указания, что использовать нужно именно их. И можно ли использовать что-то ещё? Если да, то какие преимущества и недостатки у разных методов выделения/освобождения памяти в данном случае?
← →
Набережных С. (2005-01-27 11:04) [1]Ну как ты понимаешь, область памяти-то никуда передаваться не может. Стаб при маршалинге пишет данные в предоставленную менеджером заглушек область памяти, а прокси на клиенте выделяет память и копирует в нее данные из полученного блока. Соответственно, на стороне сервера объект должен выделить память, которую освободит заглушка. На клиенте память выделит прокси, а освободить ее должен клиент. Стандарт для этих действий - CoTaskMemXXX, ее используют стандартные прокси/стаб и это документировано в описании стандартного маршалинга. Поищи по ключам IRpcStubBuffer, IRpcProxyBuffer, IRpcChannelBuffer. Но это достаточно общее описание, есть еще нюансы, связанные с атрибутами параметров.
← →
Григорьев Антон © (2005-01-27 20:58) [2]
> Набережных С. (27.01.05 11:04) [1]
> Стандарт для этих действий - CoTaskMemXXX, ее используют
> стандартные прокси/стаб и это документировано в описании
> стандартного маршалинга.
Да, нашёл, спасибо за наводку.
Страницы: 1 вся ветка
Форум: "Corba";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.056 c