基于ATL的COM组件开发

基于ATL的COM组件开发

ID:40917884

大小:286.34 KB

页数:12页

时间:2019-08-10

基于ATL的COM组件开发_第1页
基于ATL的COM组件开发_第2页
基于ATL的COM组件开发_第3页
基于ATL的COM组件开发_第4页
基于ATL的COM组件开发_第5页
资源描述:

《基于ATL的COM组件开发》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、技术简介:本文档讲解的是基于活动模板库(ActiveTemplateLibrary,ATL)来实现COM组件开发。在COM的开发上,ATL是最重要的工具,只有利用ATL我们才能充分利用COM这一工具。ATL的主要目的是创建小的、基于COM的软件模块,然后把这些模块组装成大的应用程序。微软也允许在非Windows的平台下传递COM,如UNIX等,也就是说ATL一种跨平台的COM开发工具。下面我先用一个例子(串口操作)来看看一个基于ATL的COM组件的实现。工具是VisualStudio2010.工程创建如下:1、新建项目,选择“ATL项目”应用程序类型选择动态链接库。在资源视

2、图里面会自动生成一个.idl的文件如下:对.idl文件的说名如下:方括号里面的是本工程生成的lib的属性,“uuid”是它的唯一标示,在注册之后,这个唯一标示符和后面要说到的ProgIDG结合起来,在我们调用此组件时,通过ProgIDG唯一找到这个标示符指定的组件。1、打开类视图:右击工程添加类->添加ATL简单对象如下图:然后会有如下向导:这里注意最后一个ProgIDG选项框里的内容,这是客户端调用此组件的标示。也就是通过它在注册表里找到唯一uuid关联的组件。本例子里使用如上的特性:线程模型用单元,接口用自定义。此时在类视图里生成了我们需要的接口ISerialCOM,再

3、看.idl文件,新生成如下内容:如上的属性object,表示本接口不允许远程调用,只能本地使用。在生成的ISerialCOM接口是继承IUnKnown的接口。COM定义的每一个接口必须从IUnknown继承过来,IUnknown接口提供了两个非常重要的特性,生成期控制和接口查询(参考《COM本质论》)。在.idl文件里,interface在编译的时候和struct含义等同。3、为接口添加方法打开工程类视图在ISerialCOM上右击添加方法如图:实例中添加一个Open方法,它包含两个参数,在.idl文件的描述如下:[]HRESULTOpen([in]BSTRPort,[in

4、]LONGBaudRate,[in]LONGByteSize,[in]LONGParity,[in]LONGStopBits,[in]BSTR*pRet);同样的方式添加读和写的方法:[]HRESULTReadCOM([out,retval]BSTR*pRet);[]HRESULTWriteCOM([in]BSTRsendData,[out,retval]BSTR*pRet);在这里由于在初始化的时候部分参数和DCB结构体中类型不一,可以手动修改.idl文件和对应类声明和实现。如下红色字体的修改:ATLSerialCOM.idl[]HRESULTOpen([in]BSTRP

5、ort,[in]LONGBaudRate,[in]intByteSize,[in]intParity,[in]intStopBits,[in]BSTR*pRet);SerialCOM.hSTDMETHOD(Open)(BSTRPort,LONGBaudRate,intByteSize,intParity,intStopBits,BSTR*pRet);SerialCOM.cppSTDMETHODIMPCSerialCOM::Open(BSTRPort,LONGBaudRate,intByteSize,intParity,intStopBits,BSTR*pRet)1、方法的实

6、现首先有变量的定义与初始化HNADLEm_hCom;初始化串口的方法实现:Open(BSTRPort,LONGBaudRate,LONGByteSize,LONGParity,LONGStopBits,BSTR*pRet){m_hCom=CreateFile(PortNum,GENERIC_READ

7、GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);if(m_hCom==(HANDLE)-1){*pRet=::SysAllocString(L"初始化串口失败");return(FALSE);}//设置串口缓冲区大小SetupComm(m_

8、hCom,1024,1024);//设置超时COMMTIMEOUTSTimeOuts;TimeOuts.ReadIntervalTimeout=MAXWORD;TimeOuts.ReadTotalTimeoutMultiplier=0;TimeOuts.ReadTotalTimeoutConstant=0;TimeOuts.WriteTotalTimeoutMultiplier=100;TimeOuts.WriteTotalTimeoutMultiplier=500;SetCommTimeouts(m_hCom,&

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。