这里说明二维数组向SAFEARRAY转换的方法。二维转换如果会了, 一维转换原理相同,只是指定SafeArrayGetElement的索引(第二个参数)不同。
// 定义动态的二维数组
VARIANT** arg3;
注:这里必须是VARIANT类型,否则在执行SafeArrayGetElement时,用于存储数据的本地数组(第三个参数)下标不是从0开始,这样就会出问题。
// 假设varRet中是从double型二维数组转换而来的。下面从SAFEARRAY中提取数据。
// 获得SAFEARRAY的信息
// 获得维数
UINT uDim = SafeArrayGetDim( varRet.parray );
// 获得元素大小,这个没什么用
UINT uEleSize = SafeArrayGetElemsize( varRet.parray );
// 获得一维的下界和上界
long nDim1UBound;
long nDim1LBound;
SafeArrayGetUBound( varRet.parray, 1, &nDim1UBound );
SafeArrayGetLBound( varRet.parray, 1, &nDim1LBound );
// 获得二维的下界和上界
long nDim2UBound;
long nDim2LBound;
SafeArrayGetUBound( varRet.parray, 2, &nDim2UBound );
SafeArrayGetLBound( varRet.parray, 2, &nDim2LBound );
// 计算元素个数,分配空间使用
long nDim1Count = nDim1UBound - nDim1LBound + 1;
long nDim2Count = nDim2UBound - nDim2LBound + 1;
// 分配空间
arg3 = new VARIANT *[ nDim1Count];
for ( int nn = 0; nn < nDim1Count; nn++ )
{
arg3[nn] = new VARIANT[nDim2Count];
}
// 转换
int x = 0;
int y = 0;
for ( long nDim1 = nDim1LBound; nDim1 <= nDim1UBound; nDim1++ )
{
lIndex[0] = nDim1;
y = 0;
for ( long nDim2 = nDim2LBound; nDim2 <= nDim2UBound; nDim2++ )
{
lIndex[1] = nDim2;
SafeArrayGetElement (varRet.parray, lIndex, &arg3[x][y]); //
y++;
}
x++;
}
// 输出测试结果
for ( i = 0; i < nDim1UBound; i++ )
{
for ( int j = 0; j < nDim2UBound; j++ )
{
CString strMsg;
strMsg.Format( _T( "%f" ), arg3[i][j].dblVal );
AfxMessageBox( strMsg );
}
}
// 释放内存
SafeArrayDestroyData( psa );
for ( nn = 0; nn < nDim1Count; nn++ )
{
delete[] arg3[nn];
}
delete arg3;