SAFEARRAY 和 CComSafeArray 的使用

转自:http://blog.csdn.net/tangaowen/article/details/6554640


SAFEARRAY是为了处理未知语言在COM客户之间传递数组的挑战,而定义的一个数组结构。跟VARIANT一样,SAFEARRAY也是自描述的通用数组。

      

      SAFEARRAY的定义如下:

      typedef  struct  tagSAFEARRAY

{

       USHORT   cDims; // 数组的维数

       USHORT   fFeatures;

       ULONG     cbElements;//每个元素的大小

       ULONG     cLocks;

       PVOID      pvData;

       SAFEARRAYBOUND  rgsabound[1]; //上下界指针数组

} SAFEARRAY;

 

       SAFEARRAYBOUND 的定义如下:

       typedef  struct   tagsSAFEARRAYBOUND

{

       ULONG    cElements;  //当前维度的 元素个数

       LONG       lLbounds;//  下界,开始的下表,比如0

} SAFEARRAYBOUND;

 

 

       数组最左边的维数保存在rgsbound[0]中,最右边的维数保存在rgsbound[cDims-1]中。

 

     (1) 如何创建一个 SAFEARRAY  ,SafeArrayCreate函数

        第一个参数指定元素数据类型,第二个参数指定维数,第三个参数指定维数数组。

 

       例如:创建一个c语言格式的 [3][4] 数组

 

       SAFEARRAYBOUND   rgsbound[2];

       rgsbound[0].cElements=3;

       rgsbound[0].lLbound=0;

       rgsbound[1].cElements=4;

       rgsbound[1].lLbound=0;

 

       SAFEARRAY  *  psa= ::SafeArrayCreate(VT_I4,2, rgsbound);

 

 

      (2) 如何获得一个元素  SafeArrayGetElement

       第一个参数是SAFEARRAY指针,第二个参数是指定下标的数组,第三个参数返回指定元素的值。

         注意第二个参数,下标数组的顺序是从右往左的,跟数组的创建顺序正好相反。

 

        例如: 要获得[1][2]所在下标的位置

        long  rgIndices[]={2,1};  //注意不是 {1,2}

        long   lElem;

        ::SafeArrayGetElements(pas,rgIndices,(void *)&lElem);

 

 

      (3)  释放销毁一个SAFEARRAY   SafeArrayDestroy

 

           SafeArrayDestroy(psa);

 

 

                                         CComSafeArray

 

    

    CComSafeArray是ATL对SAFEARRAY结构体的包装,是一个模板类。 SAFEARRAY只能够保存VARIANT内的那些数据一个子集。

    (1)CComSafeArray的构造函数

 

           (1.1)  CComSafeArray(ULONG  ulCount,LONG lLbound=0)

            函数构造一个ulCount个元素的一维数组,下标从lLbound开始。

 

             

[cpp]  view plain copy
  1. CComSafeArray<long>  csa(10);  //创建一个10个元素的以0为起始下标的一维数组  
  2.   
  3.    CComSafeArray<long>  csa(10,0);//创建一个10个元素的以0为起始下标的一维数组  
  4.   
  5.    CComSafeArray<long>  csa(10,1);//创建一个10个元素的以1为起始下标的一维数组  

           (1.2)CComSafeArray(const  SAFEARRAYBOUND & bound,UINT  uDims=1)

 

            CComSafeArrayBound 被用来构建一个SAFEARRAYBOUND,它是从SAFEARRAYBOUND派生出来的包装类。所以可以用来替换SAFEARRAYBOUND。

 

             例如:构建一个[2][3][4]数组

 

             

[cpp]  view plain copy
  1. CComSafeArrayBound  b1(2,0);  
  2.   
  3.   CComSafeArrayBound  b2(3,0);  
  4.   
  5.   CComSafeArrayBound  b3(4,0);  
  6.   
  7.   
  8.   
  9.   CComSafeArrayBound  rgBounds[]={b1,b2,b3};  
  10.   
  11.   CComSafeArray<int>  sa(rgBounds, 3);  

 

 

 

 

 

            (1.3) CComSafeArray(const  SAFEARRAY  * psaSrc):m_psa(NULL);

                    CComSafeArray(const  SAFEARRAY &  psaSrc):m_psa(NULL);

                    CComSafeArray(const  CComSafeArray & saSrc):m_psa(NULL);

 

            

     (2) CComSafeArray的析构函数

           析构函数就是调用内部SAFEARRAY的 SafeArrayDestroy函数。

 

 

     (3)  CComSafeArray的赋值

            一个是接受SAFEARRAY 的赋值,一个是接受CComSafeArray的赋值。

            在赋值之前,都会清除左边实例的内容,释放原先的资源。

 

      (4)  Detach和 Attach方法

             Detach将所有权从CComSafeArray转移到SAFEARRAY,而Attach正好相反,Attach是将所以权从SAFEARRAY转移到CComSafeArray,这个跟CComVariant相似。

 

 

            当我们在一个方法内部,获得从外面传递进来的SAFEARRAY的时候,采用下面的方法:

           

[cpp]  view plain copy
  1. void  SetArray(SAFEARRAY * psa)  
  2.   
  3.   
  4.   
  5.   
  6.  CComSafeArray<long>  sa;  
  7.   
  8.  sa.Attach(psa);  
  9.   
  10.  //操作   
  11.   
  12.   
  13.   
  14.  .....  
  15.   
  16.  sa.Detach();  
      

 

            当我们从一个方法来返回SAFEARRAY的时候,用下面的代码:

            

[cpp]  view plain copy
  1. void    GetArray(SAFEARRAY ** ppsa)  
  2.   
  3. {  
  4.   
  5.       CComSafeArray  <long> sa(10);  
  6.   
  7.        
  8.   
  9.        *ppsa=sa.Detach();  
  10.   
  11. }          

 

       

 

       (5) 如何获得和修改一维数组的元素

          

[cpp]  view plain copy
  1.  GetAt  和  SetAt  
  2.   
  3. CComSafeArray<long>  sa(10);  
  4.   
  5. sa.SetAt(1,100);//将第2个元素设置为100  
  6.   
  7. long  value=sa.GetAt(2);     //获得第3个元素的值,放入到value中。  

       (6)  如何获得和修改 多维数组的元素

           MultiDimGetAt和 MultiDimSetAt

           MultiDimGetAt(const LONG* index,T &t)

           MultiDimSetAt(const LONG* index, cosnt  T&t)

           第一个参数是 一个LONG数组,指定访问元素下标,第二个参数是获得或者设置的元素值。

           例子代码如下:

          

[cpp]  view plain copy
  1. //创建一个 【3】【4】的2维数组  
  2.   
  3. CComSafeArrayBound  b1[3];  
  4.   
  5. CComSafeArrayBound  b2[4];  
  6.   
  7. CComSafeArrayBound   rg[]={b1,b2};  
  8.   
  9.   
  10.   
  11. CComSafeArray<long>  sa(rg,2);  
  12.   
  13.   
  14.   
  15.   
  16.   
  17. //获得【2】【1】元素的值  
  18.   
  19. int   rgIndexElementA[]={1,2};   
  20.   
  21. long  lVal  
  22.   
  23. sa.MultiDimGetAt(rgIndexElementA,lVal);  
  24.   
  25.   
  26.   
  27. //设置 【0】【1】元素的值为100  
  28.   
  29. int   rgIndexElementB[]={1,0};  
  30.   
  31. long  newVal=100;  
  32.   
  33. sa.MultiDimSetAt(rgIndexElementB,newVal);  

      (7)  operator []操作符

           【】操作符让我们能够像普通的数组那样来操作CComSafeArray对象,由于内部是

             使用GetAt来实现,所以[]操作符只能准对一维数组对象,而不能准对多维数组对象。

          

            实例代码如下:

            

[cpp]  view plain copy
  1. CComSafeArray  <int>  sa(5);  
  2.   
  3. sa[2]=100;  

  


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vlax-safearray-get-element 是一种 AutoLISP 函数,它用于从 Visual LISP 中的 SafeArray 对象中获取元素。 SafeArray 是一种用于在 Visual Basic、Visual C++ 和 Visual Basic for Applications (VBA) 中存储和传输数组的数据类型。在 AutoLISP 中,可以使用 vlax-make-safearray 函数来创建 SafeArray 对象。一旦创建了 SafeArray 对象,可以使用 vlax-safearray-get-element 函数来获取其中的元素。 函数的语法如下: (vlax-safearray-get-element safe-array indices) 其中,safe-arraySafeArray 对象,indices 是包含要获取元素的索引的列表。对于一维数组,indices 是一个整数,对于二维数组,indices 是一个包含两个整数的列表,以此类推。 下面是一个示例,演示如何使用 vlax-safearray-get-element 函数从 SafeArray 对象中获取元素: ``` (setq sa (vlax-make-safearray vlax-vbDouble '(0 3) '((1.0 2.0 3.0 4.0)))) ; 创建一个包含四个元素的一维数组 (setq elem (vlax-safearray-get-element sa 2)) ; 获取第三个元素,即 3.0 (setq sa2 (vlax-make-safearray vlax-vbDouble '(0 1 0 1) '(((1.0 2.0) (3.0 4.0)) ((5.0 6.0) (7.0 8.0))))) ; 创建一个包含四个元素的二维数组 (setq elem2 (vlax-safearray-get-element sa2 '(0 1))) ; 获取第一行第二列的元素,即 4.0 ``` 注意:vlax-safearray-get-element 函数只能用于具有正确类型的 SafeArray 对象。如果 SafeArray 对象的类型与要获取的元素类型不匹配,函数将返回 nil。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值