2014-01-08 14 views
0

有写在VBA宏,我想从C++调用:如何将_variant_t转换为IXMLDOMDocumentPtr?

Public Function MacroName() As DOMDocument 

我做这样的:

_variant_t ret = d_pApp->Run(_bstr_t("MacroName")).bstrVal; 

现在,我想投这ret到IXMLDOMDocumentPtr ...

IXMLDOMDocumentPtr d_plDomDocument; 
d_plDomDocument = static_cast<IXMLDOMDocumentPtr>(ret); 

那么,这是行不通的。错误说,类型是错误的。 然后投射的正确方法是什么?

+2

我怀疑'.bstrVal'返回一个'BSTR',而不是'VARIANT'。但是这意味着'Run'已经返回一个变体。那里发生了一些错误。 – MSalters

+0

这是正确的!删除.bstrVal后,它工作正常:) – aurel

回答

1

你的错误是在这里:

_variant_t ret = d_pApp->Run(_bstr_t("MacroName"))>>>>>.bstrVal;<<<< 

它应该是:

_variant_t ret = d_pApp->Run(_bstr_t("MacroName")); 

一旦你这样做,你可能会发现你的static_cast工作 - 我不记得的副手。否则,您可以使用以下方法。

第一个ret.ChangeType(VT_UNKNOWN)然后如果成功,然后使用d_plDomDocument = ret.punkVal;。这将在底层做一个QueryInterface

或者在一个单一的步骤:

d_plDomDocument = IXMLDOMDocumentPtr(ret); 

这将返回一个NULL_com_ptr_t如果所述变体不能被转换为一个对象。

+0

我得到同样的错误,说这种类型是错误的。在第一种方法中,线路上发生错误:ret.ChangeType(VT_UNKNOWN)。 – aurel

+0

这意味着宏没有返回一个对象。 – Ben

+0

好的,我错过了@Msalters发现的错误!我编辑了我的帖子。 – Ben

相关问题