Конференция "Corba" » Падает клиент - COM [Delphi, Windows]
 
  • Fran (04.07.06 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;
  • Ломброзо © (04.07.06 21:49) [1]
    Коллеги-модераторы, перенесите-ка немедля сие сообщение в орэшник, пожалуйста :)
  • Ketmar © (05.07.06 09:44) [2]
    не, для орешника букавак многа.
  • Fran (05.07.06 10:59) [3]
    А по существу если ответить?
  • isasa © (05.07.06 11:22) [4]
    Fran   (05.07.06 10:59) [3]
    А по существу если ответить?

    Ну передал ты массив указателей с сервера на клиент. А на клиенте эти указатели куда?
  • Fran (05.07.06 13:26) [5]
    [isasa Ну передал ты массив указателей с сервера на клиент. А на клиенте эти указатели куда?]
    А можно тут поподробнее?
    Я массив с сервера перемещаю/копирую в клиентский массив asTmp.
    Если указатель надо освободить, то какой и как это сделать?
  • Ломброзо © (05.07.06 13:57) [6]
    Как бы навскидку:

    1) Чем вы пользуетесь для генерации библиотеки типов? Меня это интересует в том смысле, что каким-то макаром для передачи строки у вас нарисовался PChar. В приниципе, с напильником можно использовать и PChar, но грамотные люди в idl используют BSTR, который Delphi мапирует на WideString
    2) Кто вас научил возвращать из функции переменную, объявленную в секции?
    3)  Move(asTMP, PData^, SizeOf(asTMP));
    Вы хакер? И кто вас научил производить преобразование в общем-то несовместимых типов данных путем низкоуровневого копирования?
  • Fran (05.07.06 14:18) [7]
    [Ломброзо]
    1. Дельфи 7, там стоял в выборе PChar, язык выбрал Passcal в опциях проекта.
    2,3 статью сдесь же (www.delphimaster.ru) прочитал:
    "Midas и COM. Советы и Приемы" Автор статьи:  Михаил Голованов

    А как надо сделать правильно?
  • Ломброзо © (05.07.06 14:27) [8]
    1. Почитать хотя бы Трельсена "Технология COM и ATL 3.0"
    2. Почитать MSDN
    3. Почитать справку по работе с COM в Delphi
    4. Посмотреть примеры
  • Fran (07.07.06 15:38) [9]
    Спасибо, все заработало.
 
Конференция "Corba" » Падает клиент - COM [Delphi, Windows]
Есть новые Нет новых   [120335   +131][b:0][p:0]