Вниз
Скачать: 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.036 c
1-1129484545
x.pro
2005-10-16 21:42
2005.11.06
Сглаживание графиков


3-1127721141
nikolas
2005-09-26 11:52
2005.11.06
Подстрока в Interbase


1-1129268173
denmin
2005-10-14 09:36
2005.11.06
Нужен FAQ или справочник по Rave Reports 5.0.


1-1129545468
DeStranger
2005-10-17 14:37
2005.11.06
Модальное окно теряет фокус


14-1129051858
Galiaf
2005-10-11 21:30
2005.11.06
Синий экран в Windows XP SP 2.




   Наверх