C++ COM对象并返回QVariant转换问题

C++ COM对象并返回QVariant转换问题,c++,qt,casting,com,C++,Qt,Casting,Com,我试图使用COM对象,但在转换返回的函数值时遇到问题。我使用的是Qt5.7.0,我使用dumpcpp工具获得COM对象的.h和.cpp文件 class SCAPILIB_EXPORT IAttrList : public QAxObject { public: IAttrList(IDispatch *subobject = 0, QAxObject *parent = 0) : QAxObject((IUnknown*)subobject, parent) {

我试图使用COM对象,但在转换返回的函数值时遇到问题。我使用的是Qt5.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,但是如果具有determinate属性,则返回的值将是指向基类(IAttrList*)的指针

我可以很好地使用COM对象的函数,除非它返回指定的类指针。在这种情况下,de QVariant returnet类型为(IUnknown*),我无法将其转换为(IAttrLits*)

我尝试过:

IAttrList * Attr = AttrList.GetItem(Some_Attribute).Value<IAttrList *>();
IAttrList*Attr=AttrList.GetItem(Some_属性).Value();
但编译器返回错误:静态断言失败:qobject_cast要求该类型具有Q_对象宏

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

我也尝试过:

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

IAttrList*attr=static_cast(AttrList.GetItem(Some_属性).value();
它是编译的,但AttrList指针似乎无效,因为我在尝试使用它时遇到了分段错误

我不知道可能是什么问题,有什么建议吗?非常感谢高级版。

1:试试这个:

IAttrList Attr(AttrList.GetItem(Some_Attribute));
2:如果您可以从
AttrList.GetItem(某些属性)
提取
IUnknown*
IDispatch*
,请将其用作:

IAttrList Attr((Extracted IUnknown* or IDispatch*));
因为构造函数
IAttrList
类似于
IAttrList(IDispatch*子对象=0,QAxObject*父对象=0)
:QAxObject((IUnknown*)子对象,父对象)

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

1:试试这个:

IAttrList Attr(AttrList.GetItem(Some_Attribute));
2:如果您可以从
AttrList.GetItem(某些属性)
提取
IUnknown*
IDispatch*
,请将其用作:

IAttrList Attr((Extracted IUnknown* or IDispatch*));
因为构造函数
IAttrList
类似于
IAttrList(IDispatch*子对象=0,QAxObject*父对象=0)
:QAxObject((IUnknown*)子对象,父对象)


我希望这能帮助你,我在使用Qt时遇到了类似的问题,第一个代码帮助我解决了这个问题。

你应该在IUnkown上使用QueryInterface来询问你想要的接口。你不应该在COM中假设IUnkown可以直接转换为你想要的类型。谢谢你的回答,我不确定QueryInterface的使用你提到过这样的想法吗?QVariant var=AttrList.GetItem(一些属性);AttrList.queryInterface(一些属性,(void**)var);如何获取类IAttrList的UUID?。再次感谢。不幸的是,我没有或使用Qt…因此我无法回答库的具体信息。UUID是一个数字,如果您已完成typelib导入,则通常会有一个常量。queryInterface应在作为返回值收到的IUnkown对象上执行。这要求解析到该接口的类的指针。否则,当该接口不受支持时,它将返回一个错误。之所以要这样做,是因为不能保证对于任何接口,您可以直接强制转换到另一个接口。该接口的提供程序可以是该类的子类。我使用工具dumpcp获得的类p并定义了任何UUID。我用SetControl方法分配了一个UUID,并调用了QueryInterface过程:
HRESULT Hr=AttrList.QueryIntrface(IID_AttrList,(void**)&var)
但这总是会返回,
0x80004001**E_NOTIMPL**
在.Net中通过一个简单的赋值实现的东西可能会让我头疼。再次感谢。未实现意味着它有这个接口。这可能意味着你认为的属性列表没有。实际上,当我重新阅读你的d描述我看到你得到了一个“QVariant”,它的构建很可能类似于COM变量。因此你可能必须强制转换为QVariant,然后尝试从中获取值。查看QVariant在线文档并没有显示ArrayList类型…也许你需要QList?有一个类型()这将告诉您变量所包含的内容。您应该在IUnkown上使用QueryInterface来请求所需的接口。您不应该在COM中假设IUnkown可以直接强制转换为您所需的类型。谢谢您的回答,我不确定QueryInterface的用法。您是否引用类似这样的想法?QVariant var=AttrList.GetItem(某些属性);AttrList.queryInterface(某些UUID,(void**)var);如何获取类IAttrList的UUID?。再次感谢。不幸的是,我没有或使用Qt…因此我无法回答库的具体信息。UUID是一个数字,如果您已完成typelib导入,则通常会有一个常量。queryInterface应在作为返回值收到的IUnkown对象上执行。这要求解析到该接口的类的指针。否则,当该接口不受支持时,它将返回一个错误。之所以要这样做,是因为不能保证对于任何接口,您可以直接强制转换到另一个接口。该接口的提供程序可以是该类的子类。我使用工具dumpcp获得的类p并定义了任何UUID。我用SetControl方法分配了一个UUID,并调用了QueryInterface过程:
HRESULT Hr=AttrList.QueryIntrface(IID_AttrList,(void**)&var)
但这总是会返回,
0x80004001**E_NOTIMPL**
在.Net中通过一个简单的赋值实现的东西可能会让我头疼。再次感谢。未实现意味着它有这个接口。这可能意味着你认为的属性列表没有。实际上,当我重新阅读你的d描述我看到你有一个“QVariant”,就像