2017-01-02 79 views
1

我正在尝试使用COM对象,并且无法投射返回的函数值。我正在使用Qt 5.7.0,并使用dumpcpp工具为COM对象获取了.h和.cpp文件。COM对象和返回的QVariant投射问题

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 returnet类型是(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

你应该在IUnkown上使用QueryInterface来询问你想要的接口。你不应该在COM中假设IUnkown可以直接转换为你想要的类型。 – Jonathan

+0

感谢您的回答, 我不确定使用queryinterface。你是否像这样引用了这个思想? QVariant var = AttrList.GetItem(some_attribute); AttrList.queryInterface(some_UUID,(void **)var); 如何获取UUID到类IAttrList ?.再次感谢。 – mlago

+0

不幸的是我没有或没有使用Qt ...所以我无法回答图书馆的具体情况。 UUID是一个数字,如果您已经完成了typelib导入,那么通常会有一个常数。 queryInterface应该在您作为返回值收到的IUnkown对象上完成。这要求将一个指针解析为接口类。否则,当接口不支持时,它会返回一个错误。为什么你应该这样做是因为不能保证任何接口都可以直接转换到另一个接口。该接口的提供者可以是该类的孩子。 – Jonathan

回答

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和第一个代码帮助我解决它。