Главная страница
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.041 c
2-1129453062
antoxa2005
2005-10-16 12:57
2005.11.06
Для соритировки ADOTable я использую его св-во IndexFieldNames, а


6-1120576487
yuran
2005-07-05 19:14
2005.11.06
Как передать сообщение через интернет:


2-1129215799
Fast2
2005-10-13 19:03
2005.11.06
Почему при выполнении пишет Transaction is active ?


14-1129355243
Машка
2005-10-15 09:47
2005.11.06
Как стать мастерицей Delphi?


14-1129121709
Сергей Орлик
2005-10-12 16:55
2005.11.06
Delphi 2006 or C++Builder 2006 or C#Builder 2006 = BDS 2006