SAFEARRAY 和 CComSafeArray 的使用

                                   SAFEARRAY 和 CComSafeArray  的使用

     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开始。

 

             

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

 

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

 

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

 

             

 

 

 

 

 

            (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的时候,采用下面的方法:

                  

 

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

            

 

       

 

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

          

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

           MultiDimGetAt和 MultiDimSetAt

           MultiDimGetAt(const LONG* index,T &t)

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

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

           例子代码如下:

          

      (7)  operator []操作符

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

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

          

            实例代码如下:

            

          

           

           

          

    

             

           

 

     

       

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值