无法将ByRef VARIANT数组转换为SAFEARRAY
Cannot convert ByRef VARIANT array to SAFEARRAY
我正在编写一个C++DLL,以便从Excel VBA访问(它只是完成数学方程,不需要从工作表访问)。DLL旨在取代当前的VBA代码,为了提高性能,我想用C/C++编写它。
由于我使用的是现有的代码,只是想用新的DLL替换当前的VBA函数,所以我必须使用包含单个矢量数组的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++函数ByVal
或ByRef
,并且它似乎被正确接收。当我尝试在使用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
,则会出现错误。CCD_ 11返回的值与CCD_。
如果我将输入更改为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函数(Iehttp://support.microsoft.com/kb/167668这略有不同,但在我关注的点上是相同的)。
我在ByRef函数中做错了什么?
您应该检查VT_BYREF
标志,如果已设置,则取消引用指针以访问数组,如下所示:
pSafeArrayInput0 = *V_ARRAYREF(input0);
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 从SAFEARRAY中获取一个元素(或将其转换为长数组)
- 无法将参数 1 从 'char [25]' 转换为'SAFEARRAY *'
- 无法将ByRef VARIANT数组转换为SAFEARRAY
- 如何将字符串数组转换为 SAFEARRAY 或 VARIANT 或 COLEVariant