safeArray的使用方法

    技术2022-05-19  19

    方法一:使用SafeArrayAllocDescriptor在栈上创建一维数组

     

    //创建SAFEARRAY数组,每个元素为long型,该数组是一维数组

    long nData[10]={1,2,3,4,5,6,7,8,9,10};

    SAFEARRAY* pArray=NULL;

    HRESULT hr=SafeArrayAllocDescriptor(1,&pArray);//创建SAFEARRAY结构的对象

    if(hr!=S_OK)

    return;

    pArray->cbElements=sizeof(nData[0]);

    pArray->rgsabound[0].cElements=10;

    pArray->rgsabound[0].lLbound=0;

    pArray->pvData=nData;

    pArray->fFeatures=FADF_AUTO|FADF_FIXEDSIZE;//FADF_AUTO指定在栈上分配数据,并且大小不可以改变(固定为10)

    //访问SAFEARRAY数组

    long* pValue=NULL;

    SafeArrayAccessData(pArray,(void**)&pValue);

    for(int i=0;irgsabound[0].cElements;i++)

    {

    cout<

    }

    SafeArrayUnaccessData(pArray);

    SafeArrayDestroy(pArray);

    这种方法在栈上分配数组元素所占的空间,即nData数组所用的空间

    方法二:使用SafeArrayAllocDescriptor和SafeArrayAllocData在堆上创建一维数组

    //创建SAFEARRAY数组,每个元素为long型,该数组是一维数组

    long nData[10]={1,2,3,4,5,6,7,8,9,10};

    SAFEARRAY* pArray=NULL;

    HRESULT hr=SafeArrayAllocDescriptor(1,&pArray);//创建SAFEARRAY结构的对象

    if(hr!=S_OK)

    return;

    pArray->cbElements=sizeof(nData[0]);

    pArray->rgsabound[0].cElements=10;

    pArray->rgsabound[0].lLbound=0;

    SafeArrayAllocData(pArray);//注意:这句要写在给pvData赋值前面,不然用nData给pArray赋值后,使用SafeArrayAllocData会把数据清零

    pArray->pvData=nData;

    pArray->fFeatures=FADF_AUTO|FADF_FIXEDSIZE;//FADF_AUTO指定在栈上分配数据,并且大小不可以改变(固定为10)

    //访问SAFEARRAY数组

    long* pValue=NULL;

    SafeArrayAccessData(pArray,(void**)&pValue);

    for(int i=0;irgsabound[0].cElements;i++)

    {

    cout<

    }

    SafeArrayUnaccessData(pArray);

    SafeArrayDestroy(pArray);

    方法三:使用SafeArrayAllocDescriptor和SafeArrayAllocData在堆上创建二维数组

    //定义并初始化设置SafeArray存储第一行3个元素,第二行4个元素的二维数组

    SAFEARRAY* pArray = NULL;

    HRESULT hr = SafeArrayAllocDescriptor(2,&pArray);

    if(hr != S_OK)

    return;

    pArray->cbElements = sizeof(long);

    pArray->rgsabound[0].cElements = 3;

    pArray->rgsabound[0].lLbound = 0;

    pArray->rgsabound[1].cElements = 4;

    pArray->rgsabound[1].lLbound = 0;

    SafeArrayAllocData(pArray);

    //为safeArray的元素赋予值

    long lDimension[2]={0};

    long element = 1; //safeArray元素值

    //第一行赋值

    for(int i=0;i<3;i++)

    {

    lDimension[0] = i; //列

    lDimension[1] = 0; //行

    SafeArrayPutElement(pArray,lDimension,(void*)&element);

    element++;

    }

    //第二行赋值

    for(int i=0;i<4;i++)

    {

    lDimension[0] = i; //列

    lDimension[1] = 1; //行

    SafeArrayPutElement(pArray,lDimension,(void*)&element);

    element++;

    }

    //获取元素

    for(int i=0;i<3;i++) //第一行

    {

    long getElem(0);

    lDimension[0] = i;

    lDimension[1] = 0;

    SafeArrayGetElement(pArray,lDimension,(void*)&getElem);

    cout<

    }

    cout<

    for(int i=0;i<4;i++) //第二行

    {

    long getElem(0);

    lDimension[0] = i;

    lDimension[1] = 1;

    SafeArrayGetElement(pArray,lDimension,(void*)&getElem);

    cout<

    }

    cout<

    二维SAFEARRAY数组使用的时候下标要注意,这里采用的是列主序的方式,即lDimension[1]代表行,lDimension[0]代表列。

    方法四:使用SafeArrayCreate在堆上创建一维数组

    long nData[10]={1,2,3,4,5,6,7,8,9,10};

    SAFEARRAYBOUND Bound[1]={0};

    Bound[0].lLbound = 0;

    Bound[0].cElements = 10;

    SAFEARRAY* pArray=SafeArrayCreate(VT_I4,1,Bound);

    pArray->pvData = nData;

    //获取数据

    long *pData=NULL;

    HRESULT hr=SafeArrayAccessData(pArray,(void**)&pData);

    for(int i=0;irgsabound[0].cElements;i++)

    {

    cout<

    }

    SafeArrayUnaccessData(pArray);

    SafeArrayDestroy(pArray);

    方法五:使用SafeArrayCreate在堆上创建二维数组

    SAFEARRAYBOUND Bound[2]={0};

    Bound[0].lLbound = 0;

    Bound[0].cElements = 10;

    Bound[1].lLbound = 0;

    Bound[1].cElements = 3;

    SAFEARRAY* pArray=SafeArrayCreate(VT_I4,2,Bound);

    long Demen[2];

    int element=1;

    //第一行赋值

    for(long i=0;i<10;i++)

    {

    Demen[0] = i;

    Demen[1] = 0;

    SafeArrayPutElement(pArray,Demen,(void*)&element);

    element++;

    }

    //第二行赋值

    for(long i=0;i<3;i++)

    {

    Demen[0] = i;

    Demen[1] = 1;

    SafeArrayPutElement(pArray,Demen,(void*)&element);

    element++;

    }

    //获取数据

    for(int i=0;i<10;i++) //第一行

    {

    long getElem(0);

    Demen[0] = i;

    Demen[1] = 0;

    SafeArrayGetElement(pArray,Demen,(void*)&getElem);

    cout<

    }

    cout<

    for(int i=0;i<3;i++) //第二行

    {

    long getElem(0);

    Demen[0] = i;

    Demen[1] = 1;

    SafeArrayGetElement(pArray,Demen,(void*)&getElem);

    cout<

    }

    cout<

    组件/客户中传递SAFEARRAY的原则:

    1) 在堆上创建SAFEARRAY数组

    2) 一方创建,一方回收

    3) 接收方不可以修改SAFEARRAY的数据,只能读或者销毁


    最新回复(0)