Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.022 c
1-1129084104
Timon2
2005-10-12 06:28
2005.11.06
ComboBox и специальные символы


1-1129160464
stef
2005-10-13 03:41
2005.11.06
Не получается создать список объектов


1-1129142886
Денис
2005-10-12 22:48
2005.11.06
Как работать граф.файл pcx формата?


8-1118568282
NikNet
2005-06-12 13:24
2005.11.06
Как в MMTOOLS можно сделать подержку WMA формат?


14-1128965939
опрос
2005-10-10 21:38
2005.11.06
какая средняя зарплата у программистов в Киеве?




   Наверх