SAFEARRAY安全数组的使用方法

#include <iostream>
using std::cout;
using std::endl;
using std::cerr;
#include <OAidl.h>
int _tmain(int argc, _TCHAR* argv[])
{
	long l2Arr[4][3]={{3,15,9},{27,14,98},{35,11,6},{19,4,61}};
	/*
	以下代码执行:
	1#:将l2Arr二维数组写入安全数组
	2#:再从安全数组中读出二维数组
	*/
	SAFEARRAY* lpSafeArr=NULL;
	HRESULT hr=SafeArrayAllocDescriptor(2,&lpSafeArr);	//为安全数组描述器分配内存,这个数组的维数是2
	if(SUCCEEDED(hr))
	{
		//lpSafeArr->cDims=2;								//维数
		lpSafeArr->cbElements=sizeof(l2Arr[0][0]);		//每个数组元素的大小(字节单位)
		lpSafeArr->fFeatures=FADF_AUTO|FADF_FIXEDSIZE;	//表明该二维数组具有固定的大小并且保存在栈上(而不是分配于堆上)
		//lpSafeArr->pvData=l2Arr;						//安全数组的数据

		lpSafeArr->rgsabound[0].lLbound=0;				//下标起始于0
		lpSafeArr->rgsabound[0].cElements=4;			//有4个元素(4行)

		lpSafeArr->rgsabound[1].lLbound=0;				//下标起始于0
		lpSafeArr->rgsabound[1].cElements=3;			//有3个元素(3列)

		hr=SafeArrayAllocData(lpSafeArr);
		if(SUCCEEDED(hr))
		{
			long rgIndices[2]={0,0};

			unsigned long nRowCount=lpSafeArr->rgsabound[0].cElements;//4
			unsigned long nColCount=lpSafeArr->rgsabound[1].cElements;//3

			long lLBound1,lLBound2,lUBound1,lUBound2;
			SafeArrayGetLBound(lpSafeArr,1,&lLBound1);//0
			SafeArrayGetUBound(lpSafeArr,1,&lUBound1);//2
			SafeArrayGetLBound(lpSafeArr,2,&lLBound2);//0
			SafeArrayGetUBound(lpSafeArr,2,&lUBound2);//3

			//1# 将l2Arr二维数组写入安全数组
			for(long i=lLBound2;i<=lUBound2;i++)
			{
				rgIndices[1]=i;//行索引
				for(long j=lLBound1;j<=lUBound1;j++)
				{
					rgIndices[0]=j;//列索引
					hr=SafeArrayPutElement(lpSafeArr,rgIndices,&(l2Arr[i][j]));
					if(FAILED(hr))
					{
						cerr << "SafeArrayPutElement Failure.\n";
						return -1;
					}
				}
			}

			//2# 从安全数组中读出二维数组
			for(long i=lLBound2;i<=lUBound2;i++)
			{
				rgIndices[1]=i;//行索引
				for(long j=lLBound1;j<=lUBound1;j++)
				{
					rgIndices[0]=j;//列索引
					long lEleVal;
					hr=SafeArrayGetElement(lpSafeArr,rgIndices,&lEleVal);
					if(SUCCEEDED(hr))
					{
						cout << lEleVal;
						((j+1)%(lUBound1+1)==0)?cout << endl:cout<< "\t";
					}
				}
			}
			SafeArrayDestroyData(lpSafeArr);
		}
		SafeArrayDestroyDescriptor(lpSafeArr);
	}
}
3       15      9
27      14      98
35      11      6
19      4       61
请按任意键继续. . .
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值