COM对象并返回QVariant转换问题

时间:2017-01-02 09:44:02

标签: c++ qt casting com

我试图使用COM对象,但是我无法转换返回的函数值。我使用的是Qt 5.7.0,我使用dumpcpp工具获得了COM对象的.h和.cpp文件。

class SCAPILIB_EXPORT IAttrList : public QAxObject
{
public:
    IAttrList(IDispatch *subobject = 0, QAxObject *parent = 0)
    : QAxObject((IUnknown*)subobject, parent)
    {
        internalRelease();
    }

    /*
    Method AddItem

    method AddItem

    */
    inline void AddItem(Attr Attribute, const QVariant& value);

    /*
    Method FindItemIndex

    method FindItemIndex

    */
    inline int FindItemIndex(int startIndex, SCAPILib::Attr Attribute);

    /*
    Method GetCount

    method GetCount

    */
    inline int GetCount();

    /*
    Method GetIndex

    method GetIndex

    */
    inline QVariant GetIndex(int index, Attr& pAttribute);

    /*
    Method GetItem

    method GetItem

    */
    inline QVariant GetItem(Attr Attribute);

    /*
    Method OutputToString

    method OutputToString

    */
    inline QString OutputToString();

    /*
    Method RestoreFromBlob

    method RestoreFromBlob

    */
    inline void RestoreFromBlob(QVariant blob);

    /*
    Method SaveToBlob

    method SaveToBlob

    */
    inline void SaveToBlob(QVariant& pBlob);

    /*
    Method SetIndex

    method SetIndex

    */
    inline void SetIndex(int index, SCAPILib::Attr Attribute, const QVariant& value);

// meta object functions
    static const QMetaObject staticMetaObject;
    virtual const QMetaObject *metaObject() const { return &staticMetaObject; }
    virtual void *qt_metacast(const char *);
};

函数GetItem总是返回一个QVariant,通常QVariant包含一个QString,QInt或QBool,但是有一个确定属性,返回的值将是一个指向基类的指针(IAttrList *)。

inline QVariant IAttrList::GetItem(Attr Attribute)
{
    QVariant qax_result;
    void *_a[] = {(void*)&qax_result, (void*)&Attribute};
    qt_metacall(QMetaObject::InvokeMetaMethod, 12, _a);
    return qax_result;
}

我可以正常使用COM对象的功能,除非它返回指示的类指针。在这种情况下,de QVariant的返回类型是(IUnknown *),我无法将其转换为(IAttrLits *)。

我尝试过:

IAttrList * Attr = AttrList.GetItem(Some_Attribute).Value<IAttrList *>();

但编译器返回错误:静态断言失败:qobject_cast要求类型具有Q_OBJECT宏

我理解这是正常的,因为根据QT文档,从QAxObject派生的类不能包含Q_OBJECT宏。

我也尝试过:

IAttrList * attr = static_cast<IAttrList *>(AttrList.GetItem(Some_attribute).data());

IAttrList * attr = static_cast<IAttrList *>(AttrList.GetItem(Some_attribute).value<void *>();

它的编译但是AttrList指针似乎没有效果,因为我遇到了一个分段错误,试图使用它。

我不知道问题可能是什么,任何减法?谢谢你提前。

1 个答案:

答案 0 :(得分:0)

1:试试这个:

IAttrList Attr(AttrList.GetItem(Some_Attribute));

2:如果您可以从IUnknown*中提取IDispatch*AttrList.GetItem(Some_Attribute),请将其用作:

IAttrList Attr((Extracted IUnknown* or IDispatch*));

由于构造函数IAttrList类似于IAttrList(IDispatch *subobject = 0, QAxObject *parent = 0) : QAxObject((IUnknown*)subobject, parent)

我希望这会对你有所帮助,我使用Qt遇到了类似的问题,第一个代码帮我解决了。