Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Как сделать плагин с интерфейсами в Qt


Автор: Spike 25.7.2014, 13:11
Всем привет.

Есть приложение с плагинами, сделано на дельфи, нужно для него сделать плагин на Qt. 

Как это сделано в дельфе:

Для коммуникаций между плагинами и ядром используются интерфейсы:
Код

...
type
  TInitPluginFunc = function(const ACore: IInterface; const Id: word): IInterface; safecall;
  TDonePluginFunc = procedure; safecall;

type

  IPlugin = interface;
  ICore = interface;

  IPlugin = interface(IUnknown)
    ['{99F35F04-99EC-4FF8-908A-0154CC303CFD}']
    function PluginDo(This: cardinal): cardinal; safecall;
  end;

  ICore = interface(IUnknown)
    ['{3BAA3534-5422-42B9-BDEA-1CE1037295B3}']
     function CoreDo(This: cardinal): cardinal; safecall;
  end;


Ядро грузит плагин (dll), получает из него функции Init и Done. Вызов Init инициализирует плагин, при этом как аргумент передается интерфейс ядра, возвращает интерфейс плагина:

Код

...
var
  APlugin: IInterface;  
  fPlugin:  IPlugin;
begin
...
  //Инициализирует плагин и получает IInterface
  APlugin:=Init(Core, Id);
  //Подключает интерфейс плагина к fPlugin: IPlugin
  Supports(APlugin, IPlugin, fPlugin);
... 
  //какие-то действия с плагином
  smth2:=fPlugin.PluginDo(smth1);
...
  //Освобождение ссылки на интерфейс
  fPlugin:=nil;
...


Реализация Init в плагине:
Код


type
  TPlugin = class(TInterfacedObject, IUnknown, IPlugin)
  private
    fCore: ICore;
  protected
    function PluginDo(This: cardinal): cardinal; safecall;
  public
    constructor Create(const ACore: IInterface; const Id: word);
    destructor Destroy; override;
  end;

function Init(const ACore: IInterface; const Id: word): IInterface; safecall;
begin
  Result := TPlugin.Create(ACore, Id);
end;

constructor TPlugin.Create(const ACore: IInterface; const Id: word);
begin
  inherited Create;

  //Подключение интерфейса ядра
  if not Supports(ACore, ICore, fCore) then
    Assert(False);
end;


Подскажите ребята, куда копать? Как сделать такой плагин на Qt?

Автор: Avazart 25.7.2014, 16:01
Тут должен быть либо COM интерфейс, или DLL c интерфейсом  в стиле "Си", 
по примеденному коду не понять ничего.

Судя по соглашению там COM интерфейс
Цитата

safecall Обеспечивает более удобный для использования в распространённых языках высокого уровня способ вызова методов интерфейсов при использовании модели COM.

http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%B3%D0%BB%D0%B0%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE_%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D0%B5#safecall

Автор: sCreator 26.7.2014, 12:08
Копай в сторону ActiveX Qt (ActiveQt)
Только Com сервер делать не надо а делай библиотеку (dll) c экспортом функций Init и Done,
Для реализаций интерфейсов используй QAxObject или QAxBase 
в объявлении класса используй 
Код
Q_CLASSINFO("InterfaceID", "{99F35F04-99EC-4FF8-908A-0154CC303CFD}")
 с твоим ид . методы Delphi оформляй как сигналы.
Сам такого еще не делал. 

Автор: antoshib 31.7.2014, 13:01
Цитата

Для реализаций интерфейсов используй QAxObject или QAxBase 

Посмотрел доки, там же пишут, что QAxObject или QAxBase  используются как обертки для досутпа к существующим COM объектам, т.е. это контейнерные классы. А ведь нужно создать сервер, т.е. использовать классы QAxAggregated, QAxBindable.. Или их можно как-то приспособить тоже? Как конкретно должно выглядеть наследование от интерфеса и реализация его методов?


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)