2014-01-08 34 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

相關問題