C++ COM对象并返回QVariant转换问题
我试图使用COM对象,但在转换返回的函数值时遇到问题。我使用的是Qt5.7.0,我使用dumpcpp工具获得COM对象的.h和.cpp文件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) {
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”,就像