Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сделать плагин с интерфейсами в Qt, для приложения на Delphi 
:(
    Опции темы
Spike
Дата 25.7.2014, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 5.7.2005
Где: Протвино МО

Репутация: нет
Всего: 1



Всем привет.

Есть приложение с плагинами, сделано на дельфи, нужно для него сделать плагин на 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?
PM MAIL   Вверх
Avazart
Дата 25.7.2014, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 6.4.2013

Репутация: нет
Всего: нет



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

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

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

http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%...%D0%B5#safecall

Это сообщение отредактировал(а) Avazart - 25.7.2014, 16:04
PM MAIL   Вверх
sCreator
Дата 26.7.2014, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 20.8.2009
Где: Московская област ь

Репутация: нет
Всего: 5



Копай в сторону ActiveX Qt (ActiveQt)
Только Com сервер делать не надо а делай библиотеку (dll) c экспортом функций Init и Done,
Для реализаций интерфейсов используй QAxObject или QAxBase 
в объявлении класса используй 
Код
Q_CLASSINFO("InterfaceID", "{99F35F04-99EC-4FF8-908A-0154CC303CFD}")
 с твоим ид . методы Delphi оформляй как сигналы.
Сам такого еще не делал. 
PM   Вверх
antoshib
Дата 31.7.2014, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 31.7.2014

Репутация: нет
Всего: нет



Цитата

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

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



Это сообщение отредактировал(а) antoshib - 31.7.2014, 13:03
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0590 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.