Добрый день
Необходимо на Qt написать простенький COM-объект, реализующий некий самопальный интерфейс, например такой:
interface IDAnswer
{
virtual HRESULT WINAPI GetAnswer( QString & answer ) = 0;
virtual HRESULT WINAPI GetParameter( const QString & parameter, int & value ) = 0;
virtual HRESULT WINAPI SetAnswer( const QString & answer ) = 0;
virtual HRESULT WINAPI SetParameter( const QString & parameter, const int & value ) = 0;
};
QT_BEGIN_NAMESPACE
Q_DECLARE_INTERFACE(IDAnswer, "{34B1F8A1-2D70-4C43-A8BB-C64155BC258A}")
QT_END_NAMESPACE
***
Использование Q_DECLARE_INTERFACE теоретически/практически бесполезно...
***
Проблема заключается в том, как поместить описание данного интерфейса в *.tlb файл, чтобы он (интерфейс) был известен за пределами.
В примерах, которые идут с Qt данная проблема решается через Q_PROPERTY(...), Q_INVOKABLE - происходит экспорт свойств/методов. Однако у меня есть другой класс, который работает с этим интерфейсом:
class Question : public QObject
{
Q_OBJECT
Q_CLASSINFO("ClassID", "{104EF157-473E-436D-86E4-1F7786E90C3F}")
Q_CLASSINFO("InterfaceID", "{B2047D99-4853-4029-8985-53D62DC8B4AE}")
Q_CLASSINFO("RegisterObject", "yes")
private:
QString _question;
QVector<Answer> _answers;
public:
Question( QObject *parent );
Question( const Question & object );
~Question( );
Question& operator=( const Question & object );
Q_INVOKABLE void GetQuestion( QString & question );
Q_INVOKABLE void GetAnswer( const quint32 & number, IDAnswer * answer );
Q_INVOKABLE void SetQuestion( const QString & qustion );
Q_INVOKABLE void SetAnswer( const quint32 & number, IDAnswer * answer );
};
Соответственно в автоматически генерируемом *.idl файле появляются следующие строки:
[
uuid(B2047D99-4853-4029-8985-53D62DC8B4AE),
helpstring("Question Interface")
]
dispinterface IQuestion
{
properties:
methods:
[id(1)] void GetQuestion([in,out] BSTR *p_question);
/****** Slot parameter uses unsupported datatype
[id(2)] void GetAnswer([in] quint32 p_number, );
******/
[id(3)] void SetQuestion([in] BSTR p_qustion);
/****** Slot parameter uses unsupported datatype
[id(4)] void SetAnswer([in] quint32 p_number, );
******/
};
Как быть в этой ситуации? Можно ли объяснить QAxFactory, что портировать надо еще и интерфейсы, а не только классы?