gpt4 book ai didi

c++ - 无法将 ByRef VARIANT 数组转换为 SAFEARRAY

转载 作者:行者123 更新时间:2023-11-30 04:16:08 26 4
gpt4 key购买 nike

我正在编写一个要从 Excel VBA 访问的 C++ DLL(它只完成数学方程式,不需要从工作表访问)。 DLL 旨在替换当前的 VBA 代码,我想用 C/C++ 编写它以提高性能。

由于我正在使用现有代码并且只是想用新的 DLL 替换当前的 VBA 函数,所以我必须使用包含单个 vector 数组的 VBA 变体。以下是 VBA 调用代码的缩略示例:

Sub VBACaller()
Dim InputR0(1 To 5) As Variant, vResult As Variant

InputR0(1) = 26.8
InputR0(2) = 27.8
InputR0(3) = 28.8
InputR0(4) = 29.8

vResult = ReadArrayVBA(InputR0)
End Sub

我可以将这个 Variant 数组作为 VARIANT 数据类型传递给我的 C++ 函数 ByValByRef 并且它似乎被正确接收.在使用 SafeArrayAccessData 将数组转换为 SAFEARRAY 后尝试读取数组的内容时,出现了我的问题。 SAFEARRAY 转换似乎有效,但数组的内容不正确。以下是我的 C++ 代码:

VARIANT __stdcall ReadArrayByRef(VARIANT *input0)
{
//Variable to assign value from Array
double d_m = 0;

//Check if this is a variant type or not
if (V_VT(input0) & VT_ARRAY)
{
SAFEARRAY* pSafeArrayInput0 = NULL;
pSafeArrayInput0 = V_ARRAY(input0);

double* pVals;

HRESULT hr = SafeArrayAccessData(pSafeArrayInput0, (void **)&pVals); // direct access to SA memory
if (SUCCEEDED(hr))
{
long lLBound = -1, lUBound = 1; // get array bounds
SafeArrayGetLBound(pSafeArrayInput0, 1, &lLBound);
SafeArrayGetUBound(pSafeArrayInput0, 1, &lUBound);

if (lLBound > -1 && lUBound > -1)
{
d_m = pVals[1];
}
SafeArrayUnaccessData(pSafeArrayInput0);
}
}

//Output
VARIANT v;
VariantInit(&v);
v.vt = VT_R8;
v.dblVal = d_m;

return v;
}

我发现的例子似乎表明 .parray 应该保存数据,但是 input0 的检查表明它在 .pparray。如果我尝试分配 pSafeArrayInput0 = input0.pparray 它会出错。 d_m 返回的值与 1.05319234616515E-307 一致。

如果我将输入更改为 ByVal,那么我可以使用以下 C++ 代码正确访问数组的元素(唯一的区别是 SAFEARRAY 正在访问 input0 的地址

VARIANT __stdcall ReadArrayByVal(VARIANT input0)
{
//Variable to assign value from Array
double d_m = 0;

//Check if this is a variant type or not
if (V_VT(&input0) & VT_ARRAY)
{
SAFEARRAY* pSafeArrayInput0 = NULL;
pSafeArrayInput0 = V_ARRAY(&input0);

double* pVals;

HRESULT hr = SafeArrayAccessData(pSafeArrayInput0, (void **)&pVals); // direct access to SA memory
if (SUCCEEDED(hr))
{
long lLBound = -1, lUBound = 1; // get array bounds
SafeArrayGetLBound(pSafeArrayInput0, 1, &lLBound);
SafeArrayGetUBound(pSafeArrayInput0, 1, &lUBound);

if (lLBound > -1 && lUBound > -1)
{
d_m = pVals[1];
}
SafeArrayUnaccessData(pSafeArrayInput0);
}
}

VARIANT v;
VariantInit(&v);
v.vt = VT_R8;
v.dblVal = d_m;

return v;
}

我发现的所有示例都表明,通过指针传递 VARIANT 输入应该按照我的 ReadArrayByRef 函数(即 http://support.microsoft.com/kb/167668 略有不同,但在我之后)。

我的 ByRef 函数做错了什么?

最佳答案

您应该检查 VT_BYREF 标志,如果已设置,则取消引用指针以访问数组,如下所示:

pSafeArrayInput0 = *V_ARRAYREF(input0);

关于c++ - 无法将 ByRef VARIANT 数组转换为 SAFEARRAY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17882690/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com