首页 > 其他分享 >SafeArray 一维数组解析方法

SafeArray 一维数组解析方法

时间:2023-02-22 16:12:12浏览次数:32  
标签:SafeArray return hres pSafeArr VT 一维 pvDataValues false 解析

        //方法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;
            }
        }
    }

 

标签:SafeArray,return,hres,pSafeArr,VT,一维,pvDataValues,false,解析
From: https://www.cnblogs.com/dignitys/p/17144743.html

相关文章

  • 《分布式技术原理与算法解析》学习笔记Day19
    分布式通信:消息队列什么是消息队列?队列是一种具有先进先出特点的数据结构,消息队列是基于队列实现的、存储具有特定格式的消息数据。消息以特定格式放入这个队列的尾部后......
  • golang 解析json数据
       packagemainimport(jsoniter"github.com/json-iterator/go")funcString2Bytes(datastring)[]byte{return[]byte(data)}funcmain(){......
  • java初学-代码解析02
    publicclassHelloWorld{ publicstaticvoidmain(String[]args){ System.out.println("HelloWorld"); }} 能修改的地方只有类名称和双括号里面的语句......
  • 深入解析 JavaScript 中 ES6 的 Generator 生成器
    前言大家好,我是CoderBin,本次将深入解析JavaScript中ES6的Generator生成器,希望对大家有所帮助,谢谢。如果文中有不对、疑惑的地方,欢迎在评论区留言指正......
  • linux源码解析15- 匿名页面的生命周期
    1.匿名页面的产生从内核角度看,如下情况会产生匿名页面:1.1用户空间malloc()/mmap()分配的内存;在内核发生缺页中断时,调用do_anonymous_page()产生匿名页;1.2写时复制:当......
  • 物理服务器与云服务器的优缺点解析
    如果您想在线提供信息或应用程序,则需要一个安全可靠且量身定制的托管基础。无论它是一个业余爱好网站,还是博客论坛,抑或是公司数据库,都需要评估自身需求,例如需要怎样的服务......
  • 【Spring AOP】【七】Spring AOP源码解析-代理对象执行过程
    1 前言不知道你现在清晰了没,我们一路从AOP的基础概念,到AOP配置的解析,到AOP在Bean的生命周期的切入时机以及创建代理的过程一步步走下来,脑瓜还清晰不,那我们是不是就该到......
  • 随堂笔记11-spring之配置类解析
    spring之配置类解析启动spring时,需要传入一个appconfig.class给applicationContext,然后被封装为beanDefinition,这种beanDefinition称之为配置类beanDefinitionConfigu......
  • 基于UIAutomation+Python+Unittest+Beautifulreport的WindowsGUI自动化测试框架common
    1框架工具说明工具说明使用Unittest框架开源自动化测试框架,直接使用批量或指定用例运行Unittest框架可支持此功能log日志使用Python的logging库即可......
  • 大咖说·阿里云云效|效能治标不治本的三个陷阱的解析
    效能治标不治本是因为踩进了哪些陷阱?实现效能治理的闭环有哪些关键?在效能治理的过程中,我们又能获得哪些经验?本期大咖说,中金公司信息技术部副总经理方飞,分享效能治理过程......