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

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



Память: 0.47 MB
Время: -0.99 c
15-1226736374
Cyrax
2008-11-15 11:06
2009.01.25
Что такое "лит. А" ? Какая-то новая категория ?


15-1228038652
Slider007
2008-11-30 12:50
2009.01.25
С днем рождения ! 30 ноября 2008 воскресенье


1-1206543130
voe
2008-03-26 17:52
2009.01.25
Описание Ссылки в Webbrowser


15-1228307064
desc
2008-12-03 15:24
2009.01.25
Кто реализовывал автоматическое считывание данных


15-1227972447
demon
2008-11-29 18:27
2009.01.25
В чем разница между переменными типа bool и boolean?




   Наверх