谢谢!

解决方案 »

  1.   

    mRS//是我封装 _RecordsetPtr 类tVal=mRS.GetCellValue("Image");//这是从数据库中取得数据,原理一样
    if((VT_ARRAY|VT_UI1)==(tVal.vt&(VT_ARRAY|VT_UI1))) //VT_ARRAY 代表为数组 VT_UI1是字节形的
    {
       //如是数组,并且是字节形}
      

  2.   

    接上,
       //如果是………………
    LPBYTE pbData = NULL;
    HRESULT hr = S_OK;
    if (tVal.parray)
    {
     //在你访问SAFEARRAY数据之前,你必须调用SafeArrayAccessData。该函数锁定数据并且返回一个指针。在这里,锁定数组意味着增加该数组的内部计数器(cLocks)
       hr = SafeArrayAccessData(tVal.parray, (void **)&pbData);
    }
    else
    hr = HRESULT_FROM_WIN32(GetLastError());

    if (SUCCEEDED(hr))
    {
       //你的代码
       // tVal.parray->cDims 数组维数
       // tVal.parray->rgsabound[0].cElements 第1维,元素个数
       // pbData 数据指针   //tVal.parray 是一个结构
       /*
        SAFEARRAY
        {
           short cDims //注释:这个数组有几维? 
           short fFeatures //注释:这个数组有什么特性? 
           short cbElements   //注释:数组的每个元素有多大? 
           int cLocks   //注释:这个数组被锁定过几次? 
           int pvData   //注释:这个数组里的数据放在什么地方? 
           SFArrayBOUND rgsabound[]
        } 
        SFArrayBOUND 有几维,就有几个
         SAFEARRAYBOUND
        {
            int cElements //注释:这一维有多少个元素? 
            int lLbound   //注释:它的索引从几开始? 
        }   */
    }if (pbData)
    {
    //相应用来释放数据的函数是SafeArrayUnaccessData(),该功能释放该参数的计数。
    SafeArrayUnaccessData(tVal.parray);
    }