`
beyondqinghua
  • 浏览: 42403 次
  • 性别: Icon_minigender_1
  • 来自: 南昌
社区版块
存档分类
最新评论

CComVariant相关

阅读更多

 与使用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在流中的预估大小,对于简单类型,是正确的预估  

 

分享到:
评论

相关推荐

    C++、MFC源代码ATLDateTime

    通过使用`CComVariant`,开发者可以在ATL组件中轻松地处理与日期和时间相关的数据交换。 压缩包内的"说明.htm"可能是对ATLDateTime类的详细解释,包括如何创建、初始化、操作和转换日期时间。"代码中国.txt"可能...

    VS2017免注册调用大漠(收费版类库)

    在IT行业中,开发工具的选择和使用对于项目的效率和质量至关重要。...大漠插件是一款功能强大的文本处理和图像识别工具,广泛应用于软件开发中,...在使用过程中,还需要关注与软件兼容性、稳定性以及性能优化等相关问题。

    MFC打开表格

    提供的压缩包文件名称列表`codefans.net`可能是一个网站链接,如果要获取具体的源代码示例,可以访问该网站查找相关的MFC与Excel交互的教程或资源。学习和理解这些示例,有助于更好地掌握MFC操作Excel的技巧。

    MFC使用ADO连接MySQL的例子

    接下来,我们需要在MFC项目中引入ADO相关的头文件,例如`#import "msado15.dll"`。这个动态链接库包含了ADO的核心对象,如`Connection`、`Recordset`等。同时,为了能够处理数据库操作中的错误,还需要包含`_...

    AutomateWord.zip

    首先,我们需要包含必要的头文件,如`#include <atlbase.h>`,`#include <atlcom.h>`以及`#import`来导入Office相关的库: ```cpp #import "mscoree.tlb" no_namespace rename("Boolean", "bool") #import "stdole....

    VC 获取WORD文档相关属性信息.rar

    CComVariant docPath("C:\\path_to_your_word_file.docx"); pApp->Documents->Open(docPath, false, false, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &pDoc); ``` 现在,我们可以访问文档的各种属性了。例如,...

    asdf.zip_asdf46580_visual c

    CComVariant("John Doe"), CComVariant(18)); pCommand->Execute(NULL, NULL, adCmdText); ``` 最后,将这些操作封装到MFC的类和函数中,结合消息映射机制,当用户在界面上进行操作时,调用相应的函数进行数据的增...

    ATL.Internals.8.2nd

    在字符串处理方面,书中涵盖了C++、COM和ATL中的相关知识,让开发者能熟练掌握智能类型如CComPtr、CComQIPtr、CComBSTR和CComVariant的使用。此外,还探讨了实现IUnknown接口的不同选项,帮助开发者选择最适合的方法...

    vs2012下C++操作word的简单实例

    首先,要进行C++操作Word,我们需要包含必要的头文件,如`#include <afxwin.h>`,这包含了MFC的基本类,以及`#import`指令来导入Microsoft Office相关的COM接口,如`#import "mscoree.tlb" no_namespace rename("max...

    MFC中用MSChart绘制图表

    CComVariant varX(i), varY(data[i]); pSeries->AddPoint(&varX, &varY); } } ``` 最后,别忘了在项目的属性页中配置控件的注册信息。由于`MSCHRT20.OCX`是ActiveX控件,可能需要在“链接器”->“输入”->“附加...

    vc 存取jpg图片到数据库 .rar_VC 图片_access_jpg 数据_vc access_修改 图片

    CComVariant varImage(imgPath, VT_BSTORAGE); pCommand->SetParameter(1, adParamInput, adLongVarBinary, 0, &varImage); pCommand->Execute(NULL, NULL, adExecuteNoRecords); ``` 对于图片的修改,你可能需要先...

    VC++导入OFFICE 操作

    CComVariant varText(L"这是自动添加的文本。"); pRange->Text = varText; // 添加图片 CComPtr< CInlineShapes > pInlineShapes; pWordApp->ActiveDocument->InlineShapes->GetItem(1, &pInlineShapes); CComPtr...

    VC++和Excel对象接口的研究与应用 (2009年)

    ### VC++和Excel对象接口的研究与应用 #### 一、引言 在现代办公环境中,Microsoft Excel 是一种广泛使用的工具,不仅用于数据管理,还用于数据分析等高级功能。...因此,持续关注相关技术的发展动态是非常重要的。

    Simple database Access using an ADO class使用ADO访问数据库

    而"ado.h"则是头文件,包含了相关的函数声明和可能的数据结构定义,供"ado.cpp"及其他需要使用ADO功能的文件引用。 在"ado.cpp"中,你可能会看到以下关键组件: 1. **连接对象(Connection Object)**:这是与...

    VC++编程:使用ADO方式读取Access文件

    要使用ADO读取Access文件,首先需要包含必要的头文件,如`#include <atlbase.h>`和`#include <atlcom.h>`,以及ADO相关的头文件,如`#import <msado15.dll> no_namespace rename("EOF", "adEOF")`。接下来,需要初始...

    读取Excel文件并求最大、最小、平均值

    CComVariant val = pRange->Cells[i, j]->Value; if (val.vt == VT_R8) { // 检查是否为双精度浮点型 double cellVal = val.dblVal; maxVal = std::max(maxVal, cellVal); minVal = std::min(minVal, cellVal);...

    在VC中利用Word生成测量报告

    - **添加菜单项**:在主窗口中添加报告相关的菜单项,如“报告生成”、“报告预览”和“报告打印”等。每个菜单项对应一个函数,用于执行不同的操作。 - **初始化COM组件**:在项目的`CWordReportApp`类中的`...

    VC ++与Access连接及其简单操作的实现

    CComVariant varDSN(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\\test\\testdb.mdb")); CComBSTR bstrDSN(varDSN.bstrVal); CComPtr<IDataFactory> pFactory; CoInitialize(NULL); if (SUCCEEDED...

Global site tag (gtag.js) - Google Analytics