[英]How to wrap an Excel Rnage object passed in VARIANT in Excel::Range
[英]Selected range of Excel cells passed to an argument “as Variant” of a VBA function, then passed to an method of an ATL object in c++
這個問題來自以下問題:
假設我有一個暴露給 vba 的 dll 的 ATL/COM 類TheClass
的實例MyObj1
和TheMethod
的方法TheClass
。
在VBA中,我有一個功能
Public Function func(x as Variant) as Variant
'... something
MyObj1.TheMethod( x )
'... other things
End Function
這個函數在excel中使用,我將一個excel范圍的單元格傳遞給它。 在 VBA 中調試時,x 被視為 vba 類型“ Variant/Object/Range
”,並且具有 vba 類型“ Variant/Variant
”的“ Value2
”,如果范圍是例如包含 expty 單元格的矩形並在 excel 中加倍,當Value2
展開時(在 vba 中的調試中仍在觀察中),它由Variant
的類型“ Variant/Double
”或“ Variant/Empty
”組成。 在下一步中,我想在 c++ 中隔離這個“核心”“ Value2
” Variant
。
下一步,at debug in c++ at the entry of the ATL method TheMethod
of signature
STDMETHODIMP TheClass::TheMethod( VARIANT* var_in )
var_in
(接收到后者x
)的vt
等於VT_DISPATCH
。 這個家伙肯定會攜帶(即使我不知道)后者x
已經攜帶的所有東西,但我想知道如何隔離它的“ Value2
”部分以捕獲它並使用它,因為只有我對Value2
部分感興趣。
讓我說我知道我可以在 vba 中執行此操作而不是在 c++ 中執行此操作:
Public Function func(x as Variant) as Variant
'... something
MyObj1.TheMethod( x.Value2 )
'... other things
End Function
但我不想在 VBA 中訴諸這樣的事情。
好的,正如 Igor Tandetnik 建議的那樣,我做了類似的事情:
VARIANT * pVARIANT_IN_EXTENSION = new VARIANT() ;
VariantInit(pVARIANT_IN_EXTENSION);
IDispatch * piDisp = pVARIANT_IN->pdispVal ;
::DISPPARAMS invokeparams = {0} ;
HRESULT hRes = piDisp->Invoke(0, IID_NULL, 0, DISPATCH_PROPERTYGET,&invokeparams, pVARIANT_IN_EXTENSION, NULL, NULL);
將真正的“數組變體”(vt 等於 VT_ARRAY)打包到 VT_DISPATCH 變體 pVARIANT_IN 中。
稍后我將嘗試導入Excel的類型庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.