На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> В чём разница между Interface, Dispinterface и OleVariant? , в примере ole_client_server2
    В одном известном примере ole_client_server2 продемонстрирована возможность подключения к серверу через:
    - Interface (FIntf := CoAutoTest.Create);
    - Dispinterface (FDispintf := CreateComObject(Class_AutoTest) as IAutoTestDisp);
    - OleVariant (FVar := CreateOleObject('Srv.AutoTest'));
    Причём особой разницы я не заметил, в примере всё работает.
    Разница появилась, когда я добавил в библиотеку ещё один интерфейс, и в базовом интерфейсе добавил ещё одно свойство:
    user posted image
    ExpandedWrap disabled
        TAutoTest = class(TAutoObject, IAutoTest)
        protected
          function Get_EditText: WideString; safecall;
          function Get_ShapeColor: OLE_COLOR; safecall;
          procedure Set_EditText(const Value: WideString); safecall;
          procedure Set_ShapeColor(Value: OLE_COLOR); safecall;
          function Get_ShapeType: TxShapeType; safecall;
          procedure Set_ShapeType(Value: TxShapeType); safecall;
          procedure ShowInfo; safecall;
          function Get_ButtonInfo: IButtonInfo; safecall;
        end;
       
        TButtonInfo = class(TAutoObject, IButtonInfo)
        private
          FCaption: string;
        protected
          function Get_Caption: WideString; safecall;
          procedure Set_Caption(const Value: WideString); safecall;
        public
          constructor Create;
        end;
       
      { TAutoTest }
       
      function TAutoTest.Get_ButtonInfo: IButtonInfo;
      begin
        Result := TButtonInfo.Create;
      end;
       
      { TButtonInfo }
       
      constructor TButtonInfo.Create;
      begin
        FCaption := ParamStr(0)+' Заголовок';
      end;

    Теперь в клиенте наблюдается такая картина:
    ExpandedWrap disabled
      procedure TControlForm.Button1Click(Sender: TObject);
      begin
        case CallViaRG.ItemIndex of
          0: Edit.Text := FIntf.ButtonInfo.Caption;
          1: Edit.Text := FDispintf.ButtonInfo.Caption; // в этом случае не работает
          2: Edit.Text := FVar.ButtonInfo.Caption; // в этом случае не работает
        end;
      end;

    Объясните мне, в чём разница между этими тремя способами, или что я делаю не правильно? Мне необходимо, чтобы в моём случае работало подклчение через OleVariant.
    Прикреплённый файлПрикреплённый файлole_client_server2.rar (371.4 Кбайт, скачиваний: 148)
      У тебя, скорее всего, IButtonInfo - потомок IUnknown? При позднем связывании не работает (ну не учитывая некоторые особые случаи)
        Нет, IButtonInfo Parent Interface: IDispatch

        Добавлено
        Попробовал для интереса IButtonInfo сделать потомком от IUnknown - теперь действительно не работает ни один из способов.
          Ну так. С налета не получилось, пришлось покопаться:
          1. Почему такое отвращение к вызову inherited Create? Думаешь, совсем-совсем не надо?
          2. Для несоздаваемых интерфейсов лучше пользовать TAutoIntfObject.
          Посему изменения:
          ExpandedWrap disabled
              TButtonInfo = class(TAutoIntfObject, IButtonInfo)
            ...
             
            constructor TButtonInfo.Create;
            begin
              inherited Create(COMServer.TypeLib, IButtonInfo);
              FCaption := ParamStr(0)+' Çàãîëîâîê';
            end;

          3. Caption - по всей видимости, слово зарезервированное и пересекается. Сменить на btnCaption например. Лезть вглубь и смотреть, что не так - лень :)
          4. DispInterface - если начал, то продолжай запрашивать именно disp, не путай компилятор :)
          ExpandedWrap disabled
            procedure TControlForm.Button1Click(Sender: TObject);
            begin
              case CallViaRG.ItemIndex of
                0: Edit.Text := FIntf.ButtonInfo.btnCaption;
                1: Edit.Text := (FDispintf.ButtonInfo as IButtonInfoDisp).btnCaption;
                2: Edit.Text := FVar.ButtonInfo.btnCaption;
              end;
            end;

          Второй выход - Передавать IDispatch вместо IButtonInfo, тогда запроса dispinterface не надо, зато в случае интерфейса запрашивать...

          Добавлено
          Да, и забыл сказать: если хочешь внести инициализацию при создании, то для потомков TComObject (как, например, TAutoObject ;)) надо перекрвать процедуру initialize. Просто потому что конструкторов несколько, для разных случаев.
            Спасибо, заработало! +
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0275 ]   [ 16 queries used ]   [ Generated: 2.05.24, 09:31 GMT ]