SafeArray 一维数组解析方法

        //方法2 SafeArrayGetElement(SAFEARRAY* psa,long* ailndex,void* pvElem)
        if(pvDataValues->vt & VT_ARRAY){
            switch(pvDataValues->vt){
            case VT_BOOL| VT_ARRAY:
            case VT_UI1    | VT_ARRAY:
            case VT_I1    | VT_ARRAY:
            case VT_UI2    | VT_ARRAY:
            case VT_I2    | VT_ARRAY:
            case VT_UI4    | VT_ARRAY:
            case VT_I4    | VT_ARRAY:
            case VT_R4    | VT_ARRAY:
            case VT_R8    | VT_ARRAY:
            case VT_BSTR | VT_ARRAY:{
                // Get pointer to array data:
                SafeArrayLock(pSafeArr);//这个函数调不调,影响未知
                CSafeArray *pSafeArr = (CSafeArray *) (pvDataValues->parray);
                // Process array data if pointer appears to be good:
                if (pSafeArr){                
                    // Get the array dimensions:
                    DWORD dwCols = pSafeArr->GetNumCols();          //数组的列数
                    DWORD dwSize = pSafeArr->GetByteLength ();      //所有元素占的字节个数
                    DWORD dwElementNum = pSafeArr->GetNumElements();//共有多少个元素
                    ULONG cbElements = pSafeArr->cbElements;        //每个元素占用的字节个数
                    LPBYTE lpByte = (LPBYTE)pSafeArr->pvData;       //数据的启始位置
                    DWORD dwCol = 0;
                    
                    for(DWORD idx = 0;idx<dwElementNum;idx++){
                        if(pvDataValues->vt & VT_UI1){
                            unsigned char uchValue = 0;
                            HRESULT hres = SafeArrayGetElement(pSafeArr,&idx,&uchValue);
                            if(FAILED(hres)){
                                return false;
                            }
                            _stprintf(szNum,_T("%u"),uchValue);
                        }else if(pvDataValues->vt & VT_I1){
                            char chValue = 0;
                            HRESULT hres = SafeArrayGetElement(pSafeArr,&idx,&chValue);
                            if(FAILED(hres)){
                                return false;
                            }
                            _stprintf(szNum,_T("%d"),chValue);
                        }else if(pvDataValues->vt & VT_UI2){
                            unsigned short ushValue = 0;
                            HRESULT hres = SafeArrayGetElement(pSafeArr,&idx,&ushValue);
                            if(FAILED(hres)){
                                return false;
                            }
                            _stprintf(szNum,_T("%u"),ushValue);
                        }else if(pvDataValues->vt & VT_I2){
                            short shValue = 0;
                            HRESULT hres = SafeArrayGetElement(pSafeArr,&idx,&shValue);
                            if(FAILED(hres)){
                                return false;
                            }
                            _stprintf(szNum,_T("%d"),shValue);
                        }else if(pvDataValues->vt & VT_UI4){
                            unsigned int uiValue = 0;
                            HRESULT hres = SafeArrayGetElement(pSafeArr,&idx,&uiValue);
                            if(FAILED(hres)){
                                return false;
                            }
                            _stprintf(szNum,_T("%u"),uiValue);
                        }else if(pvDataValues->vt & VT_I4){
                            int iValue = 0;
                            HRESULT hres = SafeArrayGetElement(pSafeArr,&idx,&iValue);
                            if(FAILED(hres)){
                                return false;
                            }
                            _stprintf(szNum,_T("%d"),iValue);
                        }else if(pvDataValues->vt & VT_R4){
                            float fValue = 0.0;
                            HRESULT hres = SafeArrayGetElement(pSafeArr,&idx,&fValue);
                            if(FAILED(hres)){
                                return false;
                            }
                            _stprintf(szNum,_T("%f"),fValue);                    
                        }else if(pvDataValues->vt & VT_BSTR){
                            BSTR bstrValue = NULL;
                            HRESULT hres = SafeArrayGetElement(pSafeArr,&idx,&bstrValue);//bstrValue调用方是否需要释放
                            if(FAILED(hres)){
                                return false;
                            }

                            sValues.AddTail(bstrValue);
                            continue;
                        }else if(pvDataValues->vt & VT_I8){
                            __int64 i64Value = 0;
                            HRESULT hres = SafeArrayGetElement(pSafeArr,&idx,&i64Value);
                            if (FAILED(hres)){
                                return false;
                            }                        
                            TCHAR *pValue = _i64tot(i64Value,szNum,10);
                        
                        }else if(pvDataValues->vt & VT_UI8){
                            unsigned __int64 ui64Value = 0;
                            HRESULT hres = SafeArrayGetElement(pSafeArr,&idx,&ui64Value);
                            if(FAILED(hres)){
                                return false;
                            }

                            TCHAR *pValue = _ui64tot(ui64Value,szNum,10);

                        }else if(pvDataValues->vt & VT_R8){
                            double dbValue = 0;
                            HRESULT hres = SafeArrayGetElement(pSafeArr,&idx,dbValue);
                            if(FAILED(hres)){
                                return false;
                            }
                            _stprintf (szNum, _T("%G"), dbValue);                            
                        }else{
                            return false;
                        }
                    }
                }            
            }
            break;
            default:{
                return false;
            }
        }
    }

 

posted @ 2023-02-22 16:04  dignitys  阅读(125)  评论(0编辑  收藏  举报