Russian Qt Forum

Qt => ActiveX => Тема начата: silart от Март 17, 2009, 12:23



Название: Не работает QAxBase::asVariant() [решено]
Отправлено: silart от Март 17, 2009, 12:23
Добрый день всем!

Возникла странная проблема. Почему-то при вызове QAxBase::asVariant() у объекта QAxWidget возвращает пустой вариант. Причем у QAxObject все работает замечательно. Покапался я немного в коде Qt и обнаружил, что в функции
Код:
QVariant QAxBase::asVariant() const
которая находится в файле qaxbase.cpp присутствует закомментированная строка.
Код:
QVariant QAxBase::asVariant() const
{
    if (!d->ptr && !d->initialized) {
        ((QAxBase*)this)->initialize(&d->ptr);
        d->initialized = true;
    }

    QVariant qvar;
    QByteArray cn(className());
    if (cn == "QAxObject" || cn == "QAxBase") {
        if (d->dispatch())
            qVariantSetValue(qvar, d->dispatch());
        else if (d->ptr)
            qVariantSetValue(qvar, d->ptr);
    } else {
        cn = cn.mid(cn.lastIndexOf(':') + 1);
        QObject *object = qObject();
        if (QMetaType::type(cn))
            qvar = QVariant(qRegisterMetaType<QObject*>(cn + "*"), &object);
//            qVariantSetValue(qvar, qObject(), cn + "*");
    }

    return qvar;
}

Очень странно... Версия Qt 4.4.3. Просто хочу узнать в чем дело (в Qt или в компоненте) и что я делаю не так. На VB компонента работает хорошо.





Название: Re: Не работает QAxBase::asVariant()
Отправлено: silart от Март 18, 2009, 11:56
Ну очень странный глюк!
Пришлось искать обходные пути.
Вот как я решил проблему:

Код:
// QAxWidget* ui.pPreview;
IDispatch *pI = NULL;
QUuid id(IID_IDispatch);
ui.pPreview->queryInterface(id, (void**)&pI);
QVariant preview = QVariant(qRegisterMetaType<IDispatch*>("IDispatch*"), &pI);
pI->Release();

Пришлось вручную толкать указатель на COM объект в QVariant.
Совершенно непонятно почему разработчики не дают сделать это штатными методами.
Не ясно, ошибка это, или сделано специально.


Название: Re: Не работает QAxBase::asVariant()
Отправлено: silart от Март 29, 2009, 17:31
Протестировал приведенный код на Qt 4.5.0. Удивительно! Там все работает правильно!
Значит такое странное поведение в предыдущих версиях было ошибкой и они ее исправили, что не может не радовать!  :)