与使用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在流中的预估大小,对于简单类型,是正确的预估
分享到:
相关推荐
通过使用`CComVariant`,开发者可以在ATL组件中轻松地处理与日期和时间相关的数据交换。 压缩包内的"说明.htm"可能是对ATLDateTime类的详细解释,包括如何创建、初始化、操作和转换日期时间。"代码中国.txt"可能...
在IT行业中,开发工具的选择和使用对于项目的效率和质量至关重要。...大漠插件是一款功能强大的文本处理和图像识别工具,广泛应用于软件开发中,...在使用过程中,还需要关注与软件兼容性、稳定性以及性能优化等相关问题。
提供的压缩包文件名称列表`codefans.net`可能是一个网站链接,如果要获取具体的源代码示例,可以访问该网站查找相关的MFC与Excel交互的教程或资源。学习和理解这些示例,有助于更好地掌握MFC操作Excel的技巧。
接下来,我们需要在MFC项目中引入ADO相关的头文件,例如`#import "msado15.dll"`。这个动态链接库包含了ADO的核心对象,如`Connection`、`Recordset`等。同时,为了能够处理数据库操作中的错误,还需要包含`_...
首先,我们需要包含必要的头文件,如`#include <atlbase.h>`,`#include <atlcom.h>`以及`#import`来导入Office相关的库: ```cpp #import "mscoree.tlb" no_namespace rename("Boolean", "bool") #import "stdole....
CComVariant docPath("C:\\path_to_your_word_file.docx"); pApp->Documents->Open(docPath, false, false, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &pDoc); ``` 现在,我们可以访问文档的各种属性了。例如,...
CComVariant("John Doe"), CComVariant(18)); pCommand->Execute(NULL, NULL, adCmdText); ``` 最后,将这些操作封装到MFC的类和函数中,结合消息映射机制,当用户在界面上进行操作时,调用相应的函数进行数据的增...
在字符串处理方面,书中涵盖了C++、COM和ATL中的相关知识,让开发者能熟练掌握智能类型如CComPtr、CComQIPtr、CComBSTR和CComVariant的使用。此外,还探讨了实现IUnknown接口的不同选项,帮助开发者选择最适合的方法...
首先,要进行C++操作Word,我们需要包含必要的头文件,如`#include <afxwin.h>`,这包含了MFC的基本类,以及`#import`指令来导入Microsoft Office相关的COM接口,如`#import "mscoree.tlb" no_namespace rename("max...
CComVariant varX(i), varY(data[i]); pSeries->AddPoint(&varX, &varY); } } ``` 最后,别忘了在项目的属性页中配置控件的注册信息。由于`MSCHRT20.OCX`是ActiveX控件,可能需要在“链接器”->“输入”->“附加...
CComVariant varImage(imgPath, VT_BSTORAGE); pCommand->SetParameter(1, adParamInput, adLongVarBinary, 0, &varImage); pCommand->Execute(NULL, NULL, adExecuteNoRecords); ``` 对于图片的修改,你可能需要先...
CComVariant varText(L"这是自动添加的文本。"); pRange->Text = varText; // 添加图片 CComPtr< CInlineShapes > pInlineShapes; pWordApp->ActiveDocument->InlineShapes->GetItem(1, &pInlineShapes); CComPtr...
### VC++和Excel对象接口的研究与应用 #### 一、引言 在现代办公环境中,Microsoft Excel 是一种广泛使用的工具,不仅用于数据管理,还用于数据分析等高级功能。...因此,持续关注相关技术的发展动态是非常重要的。
而"ado.h"则是头文件,包含了相关的函数声明和可能的数据结构定义,供"ado.cpp"及其他需要使用ADO功能的文件引用。 在"ado.cpp"中,你可能会看到以下关键组件: 1. **连接对象(Connection Object)**:这是与...
要使用ADO读取Access文件,首先需要包含必要的头文件,如`#include <atlbase.h>`和`#include <atlcom.h>`,以及ADO相关的头文件,如`#import <msado15.dll> no_namespace rename("EOF", "adEOF")`。接下来,需要初始...
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);...
- **添加菜单项**:在主窗口中添加报告相关的菜单项,如“报告生成”、“报告预览”和“报告打印”等。每个菜单项对应一个函数,用于执行不同的操作。 - **初始化COM组件**:在项目的`CWordReportApp`类中的`...
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...