




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
技术简介:本文档讲解的是基于活动模板库(Active Template Library,ATL)来实现COM组件开发。在COM的开发上,ATL是最重要的工具,只有利用ATL我们才能充分利用COM这一工具。ATL的主要目的是创建小的、基于COM的软件模块,然后把这些模块组装成大的应用程序。微软也允许在非Windows的平台下传递COM,如UNIX等,也就是说ATL一种跨平台的COM开发工具。下面我先用一个例子(串口操作)来看看一个基于ATL的COM组件的实现。工具是Visual Studio 2010.工程创建如下:1、 新建项目,选择“ATL项目”应用程序类型选择动态链接库。在资源视图里面会自动生成一个.idl的文件如下:对.idl文件的说名如下:方括号里面的是本工程生成的lib的属性,“uuid”是它的唯一标示,在注册之后,这个唯一标示符和后面要说到的ProgIDG结合起来,在我们调用此组件时,通过ProgIDG唯一找到这个标示符指定的组件。1、 打开类视图:右击工程添加类-添加ATL简单对象如下图:然后会有如下向导:这里注意最后一个ProgIDG选项框里的内容,这是客户端调用此组件的标示。也就是通过它在注册表里找到唯一uuid关联的组件。本例子里使用如上的特性:线程模型用单元,接口用自定义。此时在类视图里生成了我们需要的接口ISerialCOM,再看.idl文件,新生成如下内容:如上的属性object,表示本接口不允许远程调用,只能本地使用。在生成的ISerialCOM接口是继承IUnKnown的接口。COM定义的每一个接口必须从IUnknown继承过来,IUnknown接口提供了两个非常重要的特性,生成期控制和接口查询(参考COM本质论)。在.idl文件里,interface在编译的时候和struct含义等同。3、为接口添加方法打开工程类视图在ISerialCOM上右击添加方法如图:实例中添加一个Open方法,它包含两个参数,在.idl文件的描述如下: HRESULT Open(in BSTR Port, in LONG BaudRate, in LONG ByteSize, in LONG Parity, in LONG StopBits, in BSTR* pRet);同样的方式添加读和写的方法: HRESULT ReadCOM(out,retval BSTR* pRet); HRESULT WriteCOM(in BSTR sendData, out,retval BSTR* pRet);在这里由于在初始化的时候部分参数和DCB结构体中类型不一,可以手动修改.idl文件和对应类声明和实现。如下红色字体的修改:ATLSerialCOM.idl HRESULT Open(in BSTR Port, in LONG BaudRate, in int ByteSize, in int Parity, in int StopBits, in BSTR* pRet);SerialCOM.hSTDMETHOD(Open)(BSTR Port, LONG BaudRate, int ByteSize, int Parity, int StopBits, BSTR* pRet);SerialCOM.cppSTDMETHODIMP CSerialCOM:Open(BSTR Port, LONG BaudRate, int ByteSize, int Parity, int StopBits, BSTR* pRet)2、 方法的实现首先有变量的定义与初始化HNADLE m_hCom;初始化串口的方法实现:Open(BSTR Port, LONG BaudRate, LONG ByteSize, LONG Parity, LONG StopBits, BSTR* pRet)m_hCom = CreateFile(PortNum,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);if(m_hCom = (HANDLE)-1)*pRet = :SysAllocString(L初始化串口失败);return(FALSE);/设置串口缓冲区大小SetupComm(m_hCom,1024,1024);/设置超时COMMTIMEOUTS TimeOuts;TimeOuts.ReadIntervalTimeout = MAXWORD;TimeOuts.ReadTotalTimeoutMultiplier = 0;TimeOuts.ReadTotalTimeoutConstant = 0;TimeOuts.WriteTotalTimeoutMultiplier =100;TimeOuts.WriteTotalTimeoutMultiplier = 500;SetCommTimeouts(m_hCom,&TimeOuts);/初始化串口参数DCB dcb;GetCommState(m_hCom,&dcb);dcb.BaudRate = BaudRate;dcb.ByteSize = ByteSize;dcb.Parity = Parity;dcb.StopBits = StopBits;SetCommState(m_hCom,&dcb);PurgeComm(m_hCom,PURGE_RXABORT|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_TXCLEAR);return S_OK;写串口:STDMETHODIMP CSerialCOM:WriteCOM(BSTR sendData, BSTR* pRet)/ TODO: 在此添加实现代码_bstr_t temp = sendData;/将BSTR类型转化为char*char* sendBuf = temp;DWORD dwByteWrite = strlen(sendBuf);BOOL bWriteState;bWriteState = WriteFile(m_hCom,sendBuf,dwByteWrite,&dwByteWrite,NULL);if(!bWriteState)return false;return S_OK;读串口:STDMETHODIMP CSerialCOM:ReadCOM(BSTR* pRet)/ TODO: 在此添加实现代码COMSTAT ComStat;DWORD dwErrorFlags;char str101;memset(str,0,sizeof(str);DWORD dwByteRead =sizeof(str)-1;BOOL bReadState;ClearCommError(m_hCom,&dwErrorFlags,&ComStat);dwByteRead = min(dwByteRead,(DWORD)ComStat.cbInQue);bReadState = ReadFile(m_hCom,str,dwByteRead,&dwByteRead,NULL);if(!bReadState)return false;PurgeComm(m_hCom,PURGE_RXABORT|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_TXCLEAR);*pRet = _com_util:ConvertStringToBSTR(str);/将char*类型转换为BSTRreturn S_OK;以上是同步操作串口。编译完成后会生成ATLSerialCOM.dll然后以管理员的身份在终端上注册此组件:regsvr32 ATLSerialCOM.dll反注册:regsvr32 -u ATLSerialCOM.dll此时就可以写一个客户端来使用这个组件。其实对于我们调用COM组件,理论过程如下:也就是说客户端通过注册表找到COM组件,并调用组件提供的接口方法实现对串口的读写操作。下面简单说明利用C+编写客户端使用的几个API来使用COM组件。初始化 COM 库; 创建一个用于建立快捷方式的COM 对象并取得IShellLink 接口; 调用IShellLink 接口的SetPath()方法; 调用对象的QueryInterface()函数并取得IPersistFile接口; 调用IPersistFile 接口的Save()方法; 释放接口; 收回COM库; / 1. 初始化COM库(让Windows 加载DLLs). 通常在InitInstance()中调用/ CoInitialize ( NULL )或其它启动代码。MFC 程序使用AfxOleInit() 。(BOOL AFXAPI AfxOleInit( );)CoInitialize ( NULL );/ 2. 使用外壳提供的Shell Link组件对象类创建COM对象。./ 第四个参数通知COM 需要什么接口(这里是IShellLink)。hr = CoCreateInstance ( CLSID_ShellLink,NULL, CLSCTX_INPROC_SERVER,IID_IShellLink, (void*) &pISL );3、用指定的类标识符创建一个Com对象,用指定的类标识符创建一个未初始化的对象。当在本机中只创建一个对象时,可以调用CoCreateInstance;在远程系统中创建一个对象时。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 德州十中住宿班考试题及答案
- 天然药物学实操考试题及答案
- 期末数量关系专项测试卷(含答案) 五年级数学上册(人教版)
- 2025年公需科目人工智能与健康考试题(附答案)
- 2025年高校教师岗前培训高等教育心理学知识竞赛考试题库及参考答案
- 2025年高速监测员面试题及答案
- 2025年高级钳工试题题库及答案
- 读章程及运行管理办法
- 计量标签化管理办法
- 苏州青青菜管理办法
- CT检查的课件教学课件
- 电动汽车原理与构造- 课件全套 第1-9章 绪论 -电动汽车的智能化技术
- 医院防疫员考试试题及答案
- 皮肤炎症修复管理办法
- 车辆检测与维修驾驶员聘用合同
- 腹部血管超声诊断
- 2025年安全生产考试题库:安全生产隐患排查治理实操技能试题汇编
- PCR基本知识课件
- 员工烧烤联谊活动方案
- 草原安全管护方案(3篇)
- 中国鱼腥草素钠栓行业市场发展前景及发展趋势与投资战略研究报告(2024-2030)
评论
0/150
提交评论