-
У 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 (05.07.06 10:59) [3] А по существу если ответить? Ну передал ты массив указателей с сервера на клиент. А на клиенте эти указатели куда?
-
[isasa Ну передал ты массив указателей с сервера на клиент. А на клиенте эти указатели куда?] А можно тут поподробнее? Я массив с сервера перемещаю/копирую в клиентский массив asTmp. Если указатель надо освободить, то какой и как это сделать?
-
Как бы навскидку:
1) Чем вы пользуетесь для генерации библиотеки типов? Меня это интересует в том смысле, что каким-то макаром для передачи строки у вас нарисовался PChar. В приниципе, с напильником можно использовать и PChar, но грамотные люди в idl используют BSTR, который Delphi мапирует на WideString 2) Кто вас научил возвращать из функции переменную, объявленную в секции? 3) Move(asTMP, PData^, SizeOf(asTMP)); Вы хакер? И кто вас научил производить преобразование в общем-то несовместимых типов данных путем низкоуровневого копирования?
-
[Ломброзо] 1. Дельфи 7, там стоял в выборе PChar, язык выбрал Passcal в опциях проекта. 2,3 статью сдесь же (www.delphimaster.ru) прочитал: "Midas и COM. Советы и Приемы" Автор статьи: Михаил Голованов
А как надо сделать правильно?
-
1. Почитать хотя бы Трельсена "Технология COM и ATL 3.0" 2. Почитать MSDN 3. Почитать справку по работе с COM в Delphi 4. Посмотреть примеры
-
Спасибо, все заработало.
|