如何将_variant_t转换为 IXMLDOMDocumentPtr

How to cast _variant_t to IXMLDOMDocumentPtr?

本文关键字:转换 IXMLDOMDocumentPtr variant      更新时间:2023-10-16

有一个用VBA编写的宏,我想从C++调用它:

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);

好吧,这行不通。错误说,类型是错误的。那么正确的选角方式是什么呢?

你的错误在这里:

_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