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

Вниз

Падает клиент - COM   Найти похожие ветки 

 
Fran   (2006-07-04 21:14) [0]

У 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;


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

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


 
Ketmar ©   (2006-07-05 09:44) [2]

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


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

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


 
isasa ©   (2006-07-05 11:22) [4]

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

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


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

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


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

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

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


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

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

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


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

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


 
Fran   (2006-07-07 15:38) [9]

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



Страницы: 1 вся ветка

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

Наверх




Память: 0.49 MB
Время: 0.015 c
15-1228401946
utkin295
2008-12-04 17:45
2009.01.25
Создание интерпретатора


1-1207561428
Yuri Btr
2008-04-07 13:43
2009.01.25
Отключить автопрокрутку в окне редактора Delphi


6-1197396798
istok
2007-12-11 21:13
2009.01.25
стабильный и мощный FTP - реально?


15-1228220190
Анна
2008-12-02 15:16
2009.01.25
Ответьте кто из Черкасской области


3-1213708099
mv
2008-06-17 17:08
2009.01.25
FIB