Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.06;
Скачать: CL | DM;

Вниз

Выделение и освобождение памяти для 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 вся ветка

Текущий архив: 2005.11.06;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.05 c
14-1128978307
LordOfRock
2005-10-11 01:05
2005.11.06
Вот я тут ещё один сайтик сварганил...


1-1129547467
Хрюндель
2005-10-17 15:11
2005.11.06
Как передать в функцию как аргумент - тоже фукцию?


1-1129665369
Volf_555
2005-10-18 23:56
2005.11.06
Как вывести в TMemo содержимое определённой папки


11-1110634509
Watcher
2005-03-12 16:35
2005.11.06
Transparent


8-1119343306
Josefina
2005-06-21 12:41
2005.11.06
Проблемы со свуком