Russian Qt Forum

Qt => ActiveX => Тема начата: MusicBur от Февраль 15, 2020, 22:54



Название: ActiveQt: реализация интерфейса
Отправлено: MusicBur от Февраль 15, 2020, 22:54
Здравствуйте.

Создаю COM сервер с помощью ActiveQt. Использую уже готовый шаблон из VisualStudio с классом, унаследованным от QAxBindable:

ActiveQtServer1.h
Код:
class ActiveQtServer1 : public QWidget, public QAxBindable
{
Q_OBJECT
public:
ActiveQtServer1(QWidget* parent = Q_NULLPTR);

private:
Ui::ActiveQtServer1Class ui;
};

ActiveQtServer1.cpp
Код:
ActiveQtServer1::ActiveQtServer1(QWidget* parent)
: QWidget(parent)
{
ui.setupUi(this);
}

QAxAggregated* ActiveQtServer1::createAggregate()
{
return new AxImpl();
}

long ActiveQtServer1::test() const
{
return 1;
}

QAXFACTORY_DEFAULT(ActiveQtServer1,
"{b44c80a9-52ee-4641-a4bf-b4aedffdbe92}",
"{00c929e6-7c4f-4f89-b624-f59da2741b9a}",
"{e5a3af26-07d4-4140-a499-fd3d6830e008}",
"{f8e662c5-11db-463d-8f7d-53b3eb95a979}",
"{e7cf5162-7f1f-4fe6-a743-0c29a372c721}"
)

Нужно, чтобы класс ActiveQtServer1 реализовывал уже существующий в системе интерфейс (от другой программы). Пусть он называется IMyServer. В документации нашел класс QAxAggregated. Наследовал его:

Код:
#define IID_IMyServer "{23F2A7A2-9C3D-11D1-B5D0-0000E84F2904}"

interface IMyServer : public IUnknown
{
Q_CLASSINFO("InterfaceID", IID_IMyServer);
Q_PROPERTY(long test READ test)

public:
long test();
};

class AxImpl : public QAxAggregated, public IMyServer
{
public:
AxImpl() {};

long queryInterface(const QUuid& iid, void** iface);
long test();

QAXAGG_IUNKNOWN
};

long AxImpl::queryInterface(const QUuid& iid, void** iface)
{
*iface = 0;
if (iid == IID_IMyServer)
*iface = (IMyServer*)this;
else
return E_NOINTERFACE;

AddRef();
return S_OK;
}

long AxImpl::test()
{
return S_OK;
}

И добавил в класс ActiveQtServer1 метод createAggregate:
Код:
QAxAggregated* ActiveQtServer1::createAggregate()
{
return new AxImpl();
}

Проект собрался, все ОК. Но интерфейс IMyServer не был реализован. В файле .idl его нет:
Код:
[
aggregatable,
helpstring("ActiveQtServer1 Class"),
uuid(B44C80A9-52EE-4641-A4BF-B4AEDFFDBE92),
control
]
coclass ActiveQtServer1
{
[default] dispinterface IActiveQtServer1;
[default, source] dispinterface IActiveQtServer1Events;
};

Подскажите, пожалуйста, как реализовать интерфейс IMyServer в классе ActiveQtServer1 средствами Qt?
Спасибо.