1

这个问题源于以下问题:

ATL/COM 对象的链接方法

假设我有一个暴露给 vba 的 dllMyObj1的 ATL/COM 类的实例,以及一个.TheClassTheMethodTheClass

在 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”,并且具有Value2vba 类型“”的“ Variant/Variant”,并且如果范围是例如包含 expty 单元格的矩形并且在 excel 中加倍,Value2则当展开时(仍在 watch in在 vba 中调试),它由“ ”或“ ”Variant类型的 's组成。我想在下一步中用c++隔离这个“核心”“ ” 。Variant/DoubleVariant/EmptyValue2Variant

下一步,在 debug in c++ 的 ATLTheMethod签名方法的入口处

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 中使用这种东西

4

1 回答 1

1

好的,正如 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 的类型库。

于 2014-01-18T10:25:32.887 回答