Russian Qt Forum
Ноябрь 01, 2024, 10:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Создание COM  (Прочитано 3929 раз)
DendrE
Гость
« : Июнь 05, 2012, 10:18 »

Добрый день

Необходимо на 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, что портировать надо еще и интерфейсы, а не только классы?
Записан
DendrE
Гость
« Ответ #1 : Июнь 06, 2012, 16:26 »

Осознал, что выше приведен бред, проблема решается использованием QAxAggregated...

Вопрос: Я хочу описать в Qt свой COM-интерфейс - как заставить QAxFactory его регистрировать в системе? Может быть это проще регистрировать как-то иначе?
Записан
DendrE
Гость
« Ответ #2 : Июнь 06, 2012, 18:34 »

Неужели никому не требовалось регистрировать интерфейсы с помощью Qt?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.105 секунд. Запросов: 21.