Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Падает клиент - COM [Delphi, Windows]


Fran ©   (2006-07-04 21:14:00) 

У COM-сервера есть функция, которая возвращает массив по ссылке:
 private
 asTmp : array[1..3] of string;

function TSpunZAGS.GetFunction(var pcMessagePrepare: PChar; var taTmp: OleVariant): Integer;
var
Pdata : PVariant;
begin
Result := 0;
pcMessagePrepare := 'Все хорошо';
asTMP[1] := 'это файл';
asTMP[2] := 'это путь к файлу';
asTMP[3] := '10';
taTmp := VarArrayCreate([0,SizeOf(asTMP)-1], varVariant);
PData := VarArrayLock(taTmp);
  try
   Move(asTMP, PData^, SizeOf(asTMP));
 finally
   VarArrayUnlock(taTmp);
 end; //try
end;

Клиент обращается к этой функции и все возвращается правильно, но при выходе из формы пишет "Invalit pointer operation" - в чем дело???
В клиенте:
 private
   pcMessagePrepare : PChar;
   asTmp : array[1..3] of string;
   taTmp : OleVariant;

procedure TfmTest_COM.btnTestClick(Sender: TObject);
var
Pdata : PVariant;
i : Integer;
begin
 pcMessagePrepare := PChar('');
   if TestInterFace.GetFunction(pcMessagePrepare,taTmp) = 0
   then begin
   edMessagePrepare.Text := pcMessagePrepare;
   memo1.Clear;
   PData := VarArrayLock(taTmp);
    try
    Move(PData^, asTmp, SizeOf(asTmp));
    finally
    VarArrayUnlock(taTmp);
    end; //try
     for i := 1 to 3 do begin
     memo1.Lines.Add(asTmp[i]);
     end;
   end;

end;


Fran   (2006-07-07 15:38:00) [1]

Спасибо, все заработало.


Ломброзо   (2006-07-05 14:27:00) [2]

1. Почитать хотя бы Трельсена "Технология COM и ATL 3.0"
2. Почитать MSDN
3. Почитать справку по работе с COM в Delphi
4. Посмотреть примеры


Fran   (2006-07-05 14:18:00) [3]

[Ломброзо]
1. Дельфи 7, там стоял в выборе PChar, язык выбрал Passcal в опциях проекта.
2,3 статью сдесь же (www.delphimaster.ru) прочитал:
"Midas и COM. Советы и Приемы" Автор статьи:  Михаил Голованов

А как надо сделать правильно?


Ломброзо   (2006-07-05 13:57:00) [4]

Как бы навскидку:

1) Чем вы пользуетесь для генерации библиотеки типов? Меня это интересует в том смысле, что каким-то макаром для передачи строки у вас нарисовался PChar. В приниципе, с напильником можно использовать и PChar, но грамотные люди в idl используют BSTR, который Delphi мапирует на WideString
2) Кто вас научил возвращать из функции переменную, объявленную в секции?
3)  Move(asTMP, PData^, SizeOf(asTMP));
Вы хакер? И кто вас научил производить преобразование в общем-то несовместимых типов данных путем низкоуровневого копирования?


Fran   (2006-07-05 13:26:00) [5]

[isasa Ну передал ты массив указателей с сервера на клиент. А на клиенте эти указатели куда?]
А можно тут поподробнее?
Я массив с сервера перемещаю/копирую в клиентский массив asTmp.
Если указатель надо освободить, то какой и как это сделать?


isasa   (2006-07-05 11:22:00) [6]

Fran   (05.07.06 10:59) [3]
А по существу если ответить?

Ну передал ты массив указателей с сервера на клиент. А на клиенте эти указатели куда?


Fran   (2006-07-05 10:59:00) [7]

А по существу если ответить?


Ketmar   (2006-07-05 09:44:00) [8]

не, для орешника букавак многа.


Ломброзо   (2006-07-04 21:49:00) [9]

Коллеги-модераторы, перенесите-ка немедля сие сообщение в орэшник, пожалуйста :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо