zoukankan      html  css  js  c++  java
  • COM组件数据类型相关资料

    1.BSTR 字符串

    http://vckbase.com/document/viewdoc/?id=1911

    2.VARIANT的使用

    http://edu.codepub.com/2009/1104/17347.php

    http://dev.yesky.com/47/2022047_2.shtml

    与使用BSTR相较而言,使用VARIANT算比较简单了,设置了类型信息和数据就完事,而且,从内存管理的角度来说,VARIANT的内存方式也相对接近常规化,因不了解而出问题的概率大大减少了,但是,为了避免万一的情况发生,我们总是不懈努力,这就是CComVariant出现的动机吧(个人诳语丷丷)。

    哈哈,其实CComVariant的出现应该从VARIANT的不足谈起(也就是所谓的使用VARIANT要遵从的几个规则):

    1.使用前必须初始化(使用VariantInit或设置VT_EMPTY)。
    2.必须使用VariantCopy函数进行拷贝,因为VARIANT的类型未知,深浅拷贝需要正确。
    3.销毁VARIANT必须使用VariantClear,因为销毁也涉及深销毁的问题。
    4.VARIANT可以选择性的使用一层简介层(最多一层),当然可以使用VariantCopyInd来消除间接性。
    5.可以使用VariantChangeType来进行类型转换。

    为了简化以上各个操作,ATL定制了CComVariant类,该类有如下功能(我在代码里使用了注释描述):

    //A.构造函数,CComVariant提供了23个构造函数,未列全    

    //1.默认构造为VT_EMPTY      
    CComVariant cvar1;      
    //2.使用BYTE(VT_UI1)构造      
    BYTE    b2  = 5;      
    CComVariant cvar2(b2);      
    //3.使用short构造      
    CComVariant cvar3(short(5));      
    //4.使用long构造      
    CComVariant cvar4(long(50));      
    //5.使用float构造      
    CComVariant cvar5(51.25f);      
    //6.使用bool构造      
    CComVariant cvar6(true);      
    //7.IDispatch      
    IDispatch*  disp7   = NULL;      
    CComVariant cvar7(disp7);      
    //8.IUnknown      
    IUnknown*   unkn8   = NULL;      
    CComVariant cvar8(unkn8);      
    //9.VARIANT      
    VARIANT var9;      
    var9.vt = VT_I4;      
    var9.intVal = 100;      
    CComVariant cvar9(var9);      
    //10.const CComVariant      
    CComVariant cvar10(cvar9);      
    //11.CComBSTR      
    CComBSTR    bstr11("hello World");      
    CComVariant cvar11(bstr11);      
    //12.LPCOLESTR      
    CComVariant cvar12(OLESTR("hello world"));      
    //13.LPCSTR      
    CComVariant cvar13("hello world");      
    //B.赋值,CComVariant定义了33个赋值操作,其中一大部分和构造函数类型对应。      
    //C.操作,这里的这些操作都注意要进行VT_EMPTY初始化,否则可能出问题      
    //1.释放      
    cvar12.Clear();      
    //2.拷贝,生成新的VARIANT,两者生命周期无关      
    VARIANT var2;      
    var2.vt = VT_EMPTY;      
    cvar11.Copy(&var2);     //从var2拷贝入cvar11          
    //3.Detach      
    VARIANT var3;      
    var3.vt = VT_EMPTY;      
    cvar13.Detach(&var3);       //CComVariant本身交出生命周期控制,自己变成VT_EMPTY      
    //4.Attach      
    cvar13.Attach(&var3);       //VARIANT把生命周期控制交给CComVariant,VARIANT变成VT_EMPTY      
    //5.类型转换      
    VARTYPE vtype5;      
    vtype5  = VT_INT;      
    cvar2.ChangeType(vtype5);   //把cvar2向vtype类型转换      
    //D.CComVariant的比较,CComVariant的比较分两步,首先要比较vt(类型),然后使用VarCmp进行数据比较 //E.CComVariant的永久性      
    IStream*    iStrm   = NULL;      
    cvar13.WriteToStream(iStrm);    //写入流      
    cvar13.ReadFromStream(iStrm);   //从流中读出      
    ULONG   len13   = cvar13.GetSize(); //获得CComVariant在流中的预估大小,对于简单类型,是正确的预估 

  • 相关阅读:
    121.买卖股票 求最大收益1 Best Time to Buy and Sell Stock
    409.求最长回文串的长度 LongestPalindrome
    202.快乐数 Happy Number
    459.(KMP)求字符串是否由模式重复构成 Repeated Substring Pattern
    326.是否为3的平方根 IsPowerOfThree
    231.是否为2的平方根 IsPowerOfTwo
    461.求两个数字转成二进制后的“汉明距离” Hamming Distance
    206.反转单链表 Reverse Linked List
    448. 数组中缺少的元素 Find All Numbers Disappeared in an Array
    常见表单元素处理
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/2044879.html
Copyright © 2011-2022 走看看