我试图使用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指针似乎没有效果,因为我遇到了一个分段错误,试图使用它。
我不知道问题可能是什么,任何减法?谢谢你提前。
答案 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遇到了类似的问题,第一个代码帮我解决了。