COM组件设计与应用

合集下载

COM组件技术在电子商务系统中的应用

COM组件技术在电子商务系统中的应用

COM组件技术在电子商务系统中的应用网上购物是电子商务系统的一个重要的组成部分,本文采用COM组件技术实现了网上购物车,增强了网上购物车系统的安全性和使用效率。

标签:COM组件技术电子商务系统网上购物车一、引言目前,对于电子商务来说,如何构建高效率、高性能可重用的系统是一个需要深入研究的课题。

网络通信技术和计算机硬件技术的显著进步不仅有力地支持了电子商务应用的飞跃式发展,同时也大大提高了大型分布式商务软件系统的规模和复杂度,使企业级电子商务系统的构建技术面临新的挑战。

人们迫切希望构建的企业级电子商务系统既具有高性能、高效率、易部署、易维护和高可靠性的优点,又能灵活地适应企业业务需求的不断变化,方便地支持系统的扩展、移植和重用。

二、COM组件技术COM是开发软件组件的一种方法。

组件实际上是一些小的二进制可执行程序,它们可以给应用程序,操作系统,以及其他组件提供服务,能够跨越链接库、应用程序、系统软件甚至网络软件,多个COM对象甚至可以联接起来形成应用程序或组件系统。

它们也是开发人员时刻都在期望的一种技术,利用这种技术开发自定义的COM组件就如同开发动态的,面向对象的API,能轻松地开发出大型而复杂的应用系统,也能尽可能地利用现有的资源,以一种堆砌的方式来构造自己的应用。

COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。

COM(组件对象模型)是一个与操作平台无关的、分布的、面向对象的机制,它能创建可以相互交互的二进制软件模块。

COM的本质特性是COM对象的接口与实现的分离。

这些对象可以用不同的语言实现,其结构也可以不同。

基于COM的组件开发具有以下几点优势:1.同语言的无关性。

COM是二进制的设计标准,它与语言无关,所以生成的模块能够被各种开发工具所共享。

COM类突破了C++修饰符不兼容的限制,能够最大程度地实现基于OOP的模块重用。

2.提供深入系统底层的手段。

COM-+-应用程序设计-02

COM-+-应用程序设计-02
并发是可伸缩方案中非常普遍旳一种现象
Web 程序不可防止地会遇到并发问题
并发旳基础架构
只有多线程架构才干处理并发旳客户祈求 在多线程环境下编写和调试代码比较困难 管理工作者线程必须要确保线程安全 .NET Enterprise Services 提供了这么旳基础架构
案例演示:实例2-3
2. 并发存在旳问题
操作演示 使用COM+组件 P23
创建客户端应用程序旳基本操作环节: S1:新建/添加→项目→应用程序 S2:添加引用→System.EnterpriseServices S3:添加引用→刚生成旳组件项目 S4:设计应用程序旳Form S5:编写源程序 •添加using System.EnterpriseServices;语句
第12章 COM+ 1.5 旳增强
第2章 配置实时激活与同步
2.1 .NET Enterprise Services 编程模型 2.2 实时 (JIT)激活 2.3 同步
2.1 .NET Enterprise Services编程模型
一、在.NET Enterprise Services中使用属性配置程序集 二、创建服务组件 三、访问对象上下文
组件应用程序设计 — COM + 应用程序设计
第1章 COM+ 服务简介
第2章 配置实时激活 与同步
第3章 使用 处理数据
第4章 事务服务
第5章 确保企业应用 程序旳安全
第6章 状态管理
第7章 补偿资源管理器
第8章 松耦合事件
第9章 队列组件
第10章 调试 COM+ 应用 程序
第11章 布署和管理 COM+ 应用程序
客户端
1

COM 组件设计与应用(17)—持续性

COM 组件设计与应用(17)—持续性

COM 组件设计与应用(十七)——持续性作者:杨老师下载源代码一、前言我们写程序,经常需要实现这样的需求:例一、程序运行产生一个窗口,用户关闭的时候需要记录窗口的位置,以便下次运行时保持位置不变;例二、由于程序运行时间很长,今天执行一部分,明天继续执行。

那么在下次运行前要恢复前次的状态;... ... ... ...智慧的老师:以上这些需求,如何实现呢?懵懂的学生:这个简单,只要在程序退出前提取必要的信息保存到文件中,下次运行时再从文件中读出来,设置一下就OK了。

智慧的老师:恩,不错,这位同学的思想值得表扬。

懵懂的学生:不好意思,这都要感谢老师的栽培,我对您的景仰如滔滔江水......智慧的老师:别臭P了,我话还没有说完那......如果你需要提取和保存的信息很多,结构很复杂......怎么办?懵懂的学生:也好办,我设计一个结构来记录这些信息。

智慧的老师:恩......不错。

但如果这些信息提供方是别人写的模块,并且随着版本的不同还经常变化,你怎么办?懵懂的学生:... ...智慧的老师:解决这些问题的方法是---持续性。

二、原理持续性,也叫永久性。

组件方提供IPersistXXX 接口,调用者(容器)提供存储介质,比如文件啦、内存啦、注册表啦、流啦、文本啦......啦啦拉。

需要保存的时候,调用者通过IPersistXXX::Save() 接口函数让组件去自己存储属性信息,而调用者根本不用关心存储格式和存储内容;需要还原状态的时候,调用者打开存储介质,然后同样调用IPersistXXX::Load() 接口函数让组件自己去读取属性信息并完成初始化的设置。

目前,微软定义了如下各种类型的持续性接口,足够满足你的需求了。

我们只要在自己写的组件中实现其中一个或几个持续性接口,那么调用者就可以按照统一的方式和我们的组件协商完成属性信息的保存和状态还原了。

三、持续性接口组件的实现示例程序分别在vc6.0 和 上实现了IPersistStreamInit 接口的COM 组件和调用举例。

COM试验

COM试验

试验任务书试验题目:COM 组件对象的设计与应用试验目的:通过对简单COM 组件的编写,加深对COM 理论知识的理解,为更深层的COM 应用做准备。

试验任务:按照组件化程序设计方法,用Visual C++编写实现包含IAdd 、IStr 、IMul 三个接口的.dll 组件,并利用客户端应用程序完成对各接口的充分测试。

试验要求:独立完成COM 组件和客户端测试程序的编写。

在实验报告中记录相关实现代码,并在试验报告中记录试验结果。

要求客户端调用Cat 方法实现自己姓名字符串和班级学号字符串的连接,以及测试加法运算和乘法运算。

试验步骤:1.分析组件结构。

2.编写简单.dll 组件。

3.逐步添加接口。

4.编写客户端应用程序进行测试。

⑴用regedit 命令打开注册表⑵注销操作:RegSvr32 /u c:\XXXXX.dll ⑶注册操作:RegSvr32 c:\XXXXX.dll ⑷在运行客户程序前,必须先注册组件程序。

5.写出上机实验报告。

实验报告格式:1.画出实验所设计的COM组件的结构2.关键代码⑴组件部分的关键代码①idl文件内COM对象和接口的关键定义代码②C++文件中成员函数的关键实现代码⑵客户端测试程序中组件调用部分的关键代码3.实验结果实验参考一、建立ATL工程( 注意:和试验任务书要求的组件结构不同)IUnknown步骤1:建立一个工作区(WorkSpace)。

步骤2:在工作区中,新建一个A TL工程(Project)。

命名为SimpleCom(如图1),并选择DLL方式(如图2)。

图1 新建ATL工程图2 选择DLL类型说明:⑴Dynamic Link Library(DLL) 表示建立一个DLL 的组件程序。

⑵Executable(EXE) 表示建立一个EXE 的组件程序。

⑶Service(EXE) 表示建立一个服务程序,系统启动后就会加载并执行的程序。

⑷Allow merging of proxy/stub code 选择该项表示把“代理/存根”代码合并到组件程序中,否则需要单独编译,单独注册代理存根程序。

COM组件设计与应用之GUID和接口

COM组件设计与应用之GUID和接口

一、前言书接上回,话说在doc(Word) 复合文件中,已经解决了保存xls(Excel) 数据的问题了。

那么,接下来又要解决另一个问题:当WORD 程序读取复合文件,遇到了xls 数据的时候,它该如何启动Excel 呢?启动后,又如何让Excel 自己去读入、解析、显示xls 数据呢?二、CLSID 概念有一个非常简单的解决方案,那就是在对象数据的前面,保存有处理这个数据的程序名。

(见下图左上)图一、CLSID 的概念这的确是一个简单的方法,但同时问题也很严重。

在“张三”的计算机上,Excel 的路径是:"c:\office\Excel.exe",如果把这个.doc 文件复制到“李四”的计算机上使用,而“李四”的Excel 的路径是:"d:\Program files\Microsoft Office\Office\Excel.exe",完蛋了于是,微软想出了一个解决方案,那就是不使用直接的路径表示方法,而使用一个叫CLSID(注1)的方式间接描述这些对象数据的处理程序路径。

CLSID 其实就是一个号码,或者说是一个16字节的数。

观察注册表(上图),在HKCR\CLSID\{......}主键下,LocalServer32(DLL组件使用InprocServer32)中保存着程序路径名称。

CLSID 的结构定义如下:typedef struct _GUID {DWORD Data1; // 随机数WORD Data2; // 和时间相关WORD Data3; // 和时间相关BYTE Data4[8]; // 和网卡MAC相关} GUID;typedef GUID CLSID; // 组件IDtypedef GUID IID; // 接口ID#define REFCLSID const CLSID &// 常见的声明和赋值方法CLSID CLSID_Excel ={0x00024500,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}}; struct __declspec(uuid("00024500-0000-0000-C000-000000000046"))CLSID_Excel;class DECLSPEC_UUID("00024500-0000-0000-C000-000000000046")CLSID_Excel;// 注册表中的表示方法{00024500-0000-0000-C000-000000000046}用一个号码间接表示程序名,的确是个Good idea,实现了组件位置的透明性,并方便地扩展出DCOM (远程组件)。

COM组件技术在电子商务系统中的应用

COM组件技术在电子商务系统中的应用

COM组件技术在电子商务系统中的应用引言电子商务系统已经成为现代商业的重要组成部分。

随着科技的进步和互联网的普及,越来越多的企业选择使用电子商务系统来进行在线销售和交易。

在开发和构建电子商务系统时,选择合适的技术和工具非常关键。

COM组件技术是一种常用的技术,其在电子商务系统中的应用也非常广泛。

本文将探讨COM组件技术在电子商务系统中的应用,并分析其优势和挑战。

COM组件技术概述COM(Component Object Model)是一种面向对象的二进制接口标准,旨在实现不同软件组件之间的互操作性。

COM组件可以通过定义和实现接口来提供特定功能,并通过接口方法进行交互。

COM组件可以用于各种软件开发和集成的场景,并且在Windows操作系统中得到广泛支持。

COM组件技术在电子商务系统中的应用1. 产品管理和库存控制电子商务系统需要管理大量的产品信息和库存数据。

通过使用COM组件技术,可以开发可重用的组件来处理产品管理和库存控制的功能。

这些组件可以提供添加、编辑和删除产品信息的接口,同时还可以实现库存的实时更新和管理。

通过将这些组件集成到电子商务系统中,可以实现高效的产品管理和库存控制。

2. 支付和交易处理电子商务系统的核心功能之一是支付和交易处理。

COM组件技术可以提供安全可靠的支付和交易处理功能。

通过使用COM组件技术,可以实现与第三方支付网关的集成,并提供方便的支付接口。

这些组件可以处理支付请求、验证交易信息,并生成支付确认和交易记录。

通过使用COM组件技术,电子商务系统可以实现快速、安全和准确的支付和交易处理。

3. 订单管理和物流追踪电子商务系统需要管理和追踪大量的订单和物流信息。

通过使用COM组件技术,可以开发可重用的组件来处理订单管理和物流追踪的功能。

这些组件可以提供创建、编辑和取消订单的接口,同时还可以实现订单状态的实时更新和物流信息的跟踪。

通过将这些组件集成到电子商务系统中,可以实现高效的订单管理和物流追踪。

COM 组件设计与应用

COM 组件设计与应用

COM 组件设计与应用第一节起源及复合文件一、文件的存储传说350年前,牛顿被苹果砸到了头,于是发现了万有引力。

但到了二十一世纪的现在,任何一个技术的发明和发展,已经不再依靠圣人灵光的一闪。

技术的进步转而是被社会的需求、商业的利益、竞争的压力、行业的渗透等推动的。

微软在Windows平台上的组件技术也不例外,它的发明,有其必然因素。

什么是这个因素那?答案是——文件的存储。

打开记事本程序,输入了一篇文章后,保存。

——这样的文件叫“非结构化文件”;打开电子表格程序,输入一个班的学生姓名和考试成绩,保存。

——这样的文件叫“标准结构化文件”;在我们写的程序中,需要把特定的数据按照一定的结构和顺序写到文件中保存。

——这样的文件叫“自定义结构化文件”;(比如 *.bmp 文件)以上三种类型的文件,大家都见的多了。

那么文件存储就依靠上述的方式能满足所有的应用需求吗?恩~~~,至少从计算机发明后的50多年来,一直是够用的了。

嘿嘿,下面看看商业利益的推动作用,对文件的存储形式产生了什么变化吧。

30岁以上的朋友,我估计以前都使用过以下几个著名的软件:WordStar(独霸DOS下的英文编辑软件),WPS(裘伯君写的中文编辑软件,据说当年的市场占有率高达90%,各种计算机培训班的必修课程),LOTUS-123(莲花公司出品的电子表格软件)......微软在成功地推出 Windows 3.1 后,开始垂涎桌面办公自动化软件领域。

微软的OFFICE 开发部门,各小组分别独立地开发了 WORD 和 EXCEL 等软件,并采用“自定义结构”方式,对文件进行存储。

在激烈的市场竞争下,为了打败竞争对手,微软自然地产生了一个念头------如果我能在 WORD 程序中嵌入 EXCEL,那么用户在购买了我 WORD 软件的情况下,不就没有必要再买 LOTUS-123 了吗?!“恶毒”的计划产生后,他们开始了实施工作,这就是 COM 的前身 OLE 的起源(注1)。

COM 组件设计与应用(十一)—— IDispatch 及双接口的调用

COM 组件设计与应用(十一)—— IDispatch 及双接口的调用

COM 组件设计与应用(十一)—— IDispatch 及双接口的调用一、前言前段时间,由于工作比较忙,没有能及时地写作。

其间收到了很多网友的来信询问和鼓励,在此一并表示感谢。

咳......我也需要工作来养家糊口呀......上回书介绍了两种方法来写自动化(IDispatch)接口的组件程序,一是用MFC 方式编写“纯粹”的 IDispatch 接口;二是用 ATL 方式编写“双接口”的组件。

二、IDispatch 接口和双接口使用者要想调用普通的 COM 组件功能,必须要加载这个组件的类型库(Type library)文件tlb(比如在 VC 中使用 #import)。

然而,在脚本程序中,由于脚本是被解释执行的,所以无法使用加载类型库的方式进行预编译。

那么脚本解释器如何使用 COM 组件那?这就是自动化(IDispatch)组件大显身手的地方了。

IDispatch 接口需要实现4个函数,调用者只通过这4个函数,pVarResult,[out] EXCEPINFO * pExcepInfo,[out] UINT * puArgErr) .... } 其实,就是根据序号进行分支调用啦。

(注3)行效率是比较低的。

ATL 从效率出发,实现了一种叫“双接口(dual)”的接口模式。

下面我们来看看,到底什么是双接口:图一、双接口(dual) 结构示意图从上图中可以看出,所谓双接口,其实是在一个 VTAB 的虚函数表中容纳了三个接口(因为任何接口都是从 IUnknown 派生的,所以就不强调 IUnknown 了,叫做双接口)。

我们如果从任意一个接口中调用 QueryInterface()得到另外的接口指针的话,其实,得到的指针地址都是同使用方式 因为 所以脚本语言使用组件 解释器只认识 IDispatch 接口 可以调用,但执行效率最低编译型语言使用组件 它认识 IDispatch 接口 可以调用,执行效率比较低编译型语言使用组件 它装载类型库后,就认识了 Ixxx 接口可以直接调用 Ixxx 函数,效率最高啦 结论 双接口,既满足脚本语言的使用方便性,又满足编译型语言的使用高效性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

IDispatch 接口for vc6.0作者:杨老师下载源代码一、前言终于写到了第九回,我也一直期盼着写这回的内容耶,为啥呢?因为自动化(automation)是非常常用、非常有用、非常精彩的一个COM 功能。

由于WORD、EXCEL 等OFFICE 软件提供了“宏”的功能,就连我们使用的VC开发环境也提供了“宏”功能,更由于HTML、ASP、JSP 等都要依靠脚本(Script)的支持,更体现出了自动化接口的重要性。

如果你使用vc6.0 的开发环境,请继续阅读。

如果你使用 2003,请阅读下一回。

二、IDispatch接口如果是编译型语言,那么我们可以让编译器在编译的时候装载类型库,也就是装载接口的描述。

在第七回文章当中,我们分别使用了#include 方法和#import 方法来实现的。

装载了类型库后,编译器就知道应该如何编译接口函数的调用了---这叫“前绑定”。

但是,如果想在脚本语言中使用组件,问题就大了,因为脚本语言是解释执行的,它执行的时候不会知道具体的函数地址,怎么办?自动化接口就为此诞生了---“后绑定”。

自动化组件,其实就是实现了IDispatch 接口的组件。

IDispatch 接口有4个函数,解释语言的执行器就通过这仅有的4个函数来执行组件所提供的功能。

IDispatch 接口用IDL 形式说明如下:(注1)[object,uuid(00020400-0000-0000-C000-000000000046), // IDispatch 接口的 IID = IID_IDispatchpointer_default(unique)]interface IDispatch : IUnknown{typedef [unique] IDispatch * LPDISPATCH; // 转定义IDispatch * 为 LPDISPATCHHRESULT GetTypeInfoCount([out] UINT * pctinfo); // 有关类型库的这两个函数,咱们以后再说HRESULT GetTypeInfo([in] UINT iTInfo,[in] LCID lcid,[out] ITypeInfo ** ppTInfo);HRESULT GetIDsOfNames( // 根据函数名字,取得函数序号(DISPID)[in] REFIID riid,[in, size_is(cNames)] LPOLESTR * rgszNames,[in] UINT cNames,[in] LCID lcid,[out, size_is(cNames)] DISPID * rgDispId);[local] // 本地版函数HRESULT Invoke( // 根据函数序号,解释执行函数功能[in] DISPID dispIdMember,[in] REFIID riid,[in] LCID lcid,[in] WORD wFlags,[in, out] DISPPARAMS * pDispParams,[out] VARIANT * pVarResult,[out] EXCEPINFO * pExcepInfo,[out] UINT * puArgErr);[call_as(Invoke)] // 远程版函数HRESULT RemoteInvoke([in] DISPID dispIdMember,[in] REFIID riid,[in] LCID lcid,[in] DWORD dwFlags,[in] DISPPARAMS * pDispParams,[out] VARIANT * pVarResult,[out] EXCEPINFO * pExcepInfo,[out] UINT * pArgErr,[in] UINT cVarRef,[in, size_is(cVarRef)] UINT * rgVarRefIdx,[in, out, size_is(cVarRef)] VARIANTARG * rgVarRef );}以上IDispatch 接口函数的讲解,我们留到后回中进行介绍。

如何在组件程序中实现这些函数那?还好,还好,就象IUnknown 一样,MFC 和ATL 都帮我们已经完成了。

本回我们着重介绍组件的编写,下回则介绍组件的调用方法。

三、用MFC 实现自动化组件我写的这整个系列文章---《COM 组件设计与应用》,多是用ATL 写组件程序,但由于自动化非常有用,在后续的文章中,还要给大家介绍组件的“事件”功能,还要介绍如何在MFC 的程序中象WORD 一样支持“宏”的功能。

这些都要用到MFC,所以就给读者唠一唠啦:-)3-1:建立一个工作区(Workspace)3-2:建立一个MFC DLL 工程(Project),工程名称为“Simple5”3-3:一定要选择automation,切记!切记!3-4:建立新类3-5:在新建类中支持automationClass information - Name你随便写个类名子啦Class information - Base class一定要从CComTarget 派生呀,只有它才提供了IDispatch 的支持Automation - None表示不支持自动化,你要选择了它,那就白干啦Automation - Automation支持自动化,但不能被直接实例化。

后面在讲解多个IDispatch 的时候就用到它了,现在先不要着急。

Automation - Createable by type ID一定要选择这个项目,这样我们在后面的调用中,VB就能够CreateObject(),VC 就能够CreateDispatch()对组件对象实例化了。

注意一点,这个ID 其实就是组件的ProgID 啦。

3-6:启动ClassWizard,选择Automation 卡片,准备建立函数3-7:添加函数。

我们要写一个整数加法函数Add()。

3-8:再增加一个转换字符串大小写的函数Upper()。

函数返回值是BSTR,这个没有什么疑问,但参数类型怎么居然是LPCTSTR?在COM 中,字符串不是应该使用BSTR 吗?是的,是应该使用BSTR,但由于我们是用MFC 写自动化组件,它帮我们进行BSTR 和LPCTSTR 之间的转换了。

3-9:好了,下面开始输入程序代码:long CDispSimple::Add(long n1, long n2){return n1 + n2;}BSTR CDispSimple::Upper(LPCTSTR str){CString strResult(str);strResult.MakeUpper();return strResult.AllocSysString();}3-10:编译注册如果上面的操作由于疏忽而发生了错误,那么你可以手工进行改正。

其一、步骤<3-6>的对话窗中有“Delete”操作;其二、你可以打开ODL 文件(注2)进行修改,修改时要特别小心函数的声明中,有一个[id(n)] 的函数序号,可不要乱了;其三、同步修改H/CPP 中的函数声明和函数体;其四、在CPP文件中,根据情况也要修改BEGIN_DISPATCH_MAP/END_DISPATCH_MAP()函数影射宏。

正确编译后,MFC不象ATL那样会自动注册。

你需要手工执行regsvr32.exe 进行注册,或者执行菜单“Tools\Register control”四、用ATL 实现双接口组件(操作方法和步骤,请参考《COM 组件设计与应用(五)》)4-1:建立一个ATL 工程(Project),工程名称为“Simple6”4-2:按默认进行。

选择DLL 类型、不合并代理和存根代码、不支持MFC、不支持MTS4-3:New Atl Object... 选择Simple Object4-4:输入名称和属性,属性按默认进行,也就是dual(双接口)方式(注3)4-5:增加函数。

在ClassView 卡片中,选择接口、鼠标右键菜单、Add Method...Add([in] VARIANT v1, [in] VARIANT v2, [out, retval] VARIANT * pVal);Upper([in] BSTR str, [out,retval] BSTR * pVal);关于Add()函数,你依然可以使用Add([in] long n1, [in] long n2, [out,retval] long * pVal) 方式。

但这次我们没有使用long ,而是使用了VARIANT 做参数和返回值。

这里我先卖个关子,往下看,就知道使用VARIANT 的精彩之处了。

4-6:完成代码STDMETHODIMP CDispSimple::Add(VARIANT v1, VARIANT v2, VARIANT *pVal){::VariantInit( pVal ); // 永远初始化返回值是个好习惯CComVariant v_1( v1 );CComVariant v_2( v2 );if((v1.vt & VT_I4) && (v2.vt & VT_I4) ) // 如果都是整数类型{ // 这里比较没有使用 == ,而使用了运算符 & ,你知道这是为什么吗?v_1.ChangeType( VT_I4 ); // 转换为整数v_2.ChangeType( VT_I4 ); // 转换为整数pVal->vt = VT_I4;pVal->lVal = v_1.lVal + v_2.lVal; // 加法}else{v_1.ChangeType( VT_BSTR ); // 转换为字符串v_2.ChangeType( VT_BSTR ); // 转换为字符串CComBSTR bstr( v_1.bstrVal );bstr.AppendBSTR( v_2.bstrVal ); // 字符串连接pVal->vt = VT_BSTR;pVal->bstrVal = bstr.Detach();}return S_OK;}STDMETHODIMP CDispSimple::Upper(BSTR str, BSTR *pVal){*pVal = NULL; // 永远初始化返回值是个好习惯CComBSTR s(str);s.ToUpper(); // 转换为大写*pVal = s.Copy();return S_OK;}刚才卖的关子,现在开始揭密了......加法函数Add()不使用long类型,而使用VARIANT的好处是:函数内部动态判断参数类型,如果是整数则进行整数加法,如果是字符串,则进行字符串加法(字符串加法就是字符串连接哈)。

相关文档
最新文档