属性结构如下:
  ABC
   |
    ---DEF
        |
         ---XYZ我想做出带数组的属性,使它可以这样被调用
1)ABC.DEF(3).XYZ(是ABC.DEF(3).XYZ,而不是ABC.DEF.XYZ(3),后者我会,前者不会)2)其中传入传出XYZ的是一个BYTE的三维数组,XYZ的属性的get和put该怎么写??请问该如何做到,分数不够可以加!!!!!希望有高手不吝赐教,再重复一遍,分数不够可以再加,我现在只能加100分,我从不食言up者有分!!!!!!!!

解决方案 »

  1.   

    COM中对collection的实现有严格的定义,有许多IEnumxxx类型的接口定义。详情请见MSDN
      

  2.   

    to ruihuahan(飞不起来的笨鸟) :
    那我要实现byte类型的数组,该用哪个IEnumxxx??
      

  3.   

    问题1已经解决,有哪位高人能告诉我,如果存数组??
    是不是用SAFEARRAY??
      

  4.   

    在ATL用CComSafeArray是对SAFEARRAY的封装。
    接口定义用VARIANT:
    Fun(VARIANT* Varray)
    {
    switch( Varray->vt )
    {
    case VT_ARRAY|VT_R4:
                           //add ur code here
    case VT_ARRAY|VT_R8:
                           //add ur code here
    }
    }
      

  5.   

    "其中传入传出XYZ的是一个BYTE的三维数组"疑问:1 xyz是三维数组,还是一个有三个元素的一维数组
      比如:  xyz(0), xyz(1) , xyz(2) 是具有三个元素的一维数组
            xyz(0,0,0) ,  xyz(0,0,1)
            xyz(0,1,0) ,  xyz(0,1,1)
            xyz(1,0,0) ,  xyz(1,0,1)
            xyz(1,1,0) ,  xyz(1,1,1)
            是三维数组,每一维的元素个数分别是2,2,2      2 如果xyz真是三维数组,那么每一维各有几个元素
      

  6.   

    这段代码也许对你有帮助
    // Create a two dimensional array (2 rows x 5 columns)
    SAFEARRAY * sa; 
    SAFEARRAYBOUND saDims[2]; 
    saDims[0].lLbound = 1;     // Lower bound of the first dimension
    saDims[0].cElements = 2;   
    saDims[1].lLbound = 1;     // Lower bound of the second dimension
    saDims[1].cElements = 5;sa = ::SafeArrayCreate(VT_I4, 2, saDims);// Fill the array with data one element at a time
    HRESULT hr;
    long lIndex[2];
    long lNum;
    int r, c;for (r=1; r<=2;r++)
    {
       lIndex[0]=r;
       for (c=1;c<=5;c++)
       {
          lIndex[1] = c;
          lNum = c * r;
          hr = ::SafeArrayPutElement(sa, lIndex, &lNum);
       }
    }// Get the data from the array
    for (r=1; r<=2;r++)
    {
       lIndex[0]=r;
       for (c=1;c<=5;c++)
       {
          lIndex[1] = c;
          hr = ::SafeArrayGetElement(sa, lIndex, &lNum);
          printf("%d\t", lNum);
       }
       printf("\n");
    }// . . . Do something with the array . . . // Destroy the array when done
    hr = ::SafeArrayDestroy(sa);
      

  7.   

    如果是在VB下或者其他开发环境中调用,用struct类型,然后用SAFEARRAY,传出的时候用VARIANT类型,如果在Script下调用,必须把类型封装成对象,然后在做一个类型集合的对象.具体做法可以查一下以前的贴子.
      

  8.   

    用map摸板类,可以封装多个叠代器。
      

  9.   

    to z_j() 
       就假设是 BYTE abc[3,3,3];to  facetoface(永远的菜鸟)
       这段代码我知道,但是它是一个一个字节放一个一个字节取的,我这里要求运行效率极高,这样我怕会不会太慢了??to flyycyu(fly) 
        什么模板?to xpf_2000(萧丰)
        我是放在vb或vc中用的,不会在script中用的,我查了以前的贴子,由于我的愚笨,还是未能找到答案,希望大侠再不吝指点一二,万分感谢
      

  10.   

    1 如果数组的数据维数固定,每一维的个数固定,并且个数不会太多,又要高速度,那么可以简单地使用多个参数来实现,比如 
      dim  a(10) as byte
      abc.def.f a(0),a(1),a(2)......a(9)
      不太优雅,但简单2 如果数据量大,那么用SafeArray 是一种选择 ( VC, VB中都可以用)3 如果仅仅在VC中用,并且不是分布式应用,那么可以简单地将数组的地址以long 的形式传出,在客户程序中再将该 long 转换成 char* (处理不当容易引起非法访问)
      

  11.   

    谢谢z_j大哥的帮忙,可是我的数组蛮大的,至少是256*256*256的,方法一可能不行,我的程序要在vb中也能用,所以方法三也不行,只有方法二有可能,我是在想有没有办法一次性传入,而不是用两个for来做,两个for做起来可能会比较慢的吧? 谢谢
      

  12.   

    把你的3维数组展开为1维(其实内存中就是一维的)的BSTR,传出去的相当于一个内存块,外面处理这个内存块,这样效率高点
      

  13.   

    http://www.codeproject.com/atl/collectionwizard.asp