这个问题源于以下问题:

Chaining methods of ATL/COM objects

假设我有一个暴露给vba的dll的ATL / COM类MyObj1的实例TheClass和一个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”,x的voji类型为“Value2”,例如,如果范围是一个包含expty单元格的矩形,并且在excelt展开时,在excel中为double的两倍(仍在vba中进行调试),它由类型为Variant/VariantValue2Variant组成。我要在下一步中隔离的就是这个“核心”“Variant/DoubleVariant/Empty,即c++ 中的

下一步,在C++中的调试中,签名的ATL方法Value2的条目
STDMETHODIMP TheClass::TheMethod( VARIANT* var_in )

看到Variant(接收到后者的TheMethod)具有等于var_inx。这个家伙可以肯定地携带(即使我不知道)后者的vt已经携带的所有东西,但是我想知道如何隔离其中的“VT_DISPATCH”部分以捕获并使用它,仅x部分使我感兴趣。

让我说我知道,我可以在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_DISPATCH变量pVARIANT_IN中的真实“数组变量”(vt等于VT_ARRAY)。

稍后,我将尝试导入Excel的类型库。

关于c++ - 选定范围的Excel单元格传递给VBA函数的参数 “as Variant”,然后传递给c++中的ATL对象的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18859999/

10-12 22:41