导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→发表看法:[emtronix]ARM9工控板在远程监控中的应用之三--



No.71461
作者:emtronix
邮件:web@emtronix.com
ID:116336
登陆:11次
文章数:54篇
最后登陆IP:222.212.37.103
最后登陆:2010/11/10 2:23:27
注册:2008/9/17 22:22:59
财富:418
发帖时间:2009/6/22 9:30:52
发贴者IP:218.88.36.128
标题:emtronix:ARM9工控板在远程监控中的应用之三---数采功能的标准COM组件接口[原创]
摘要:No.71461ARM9工控板在远程监控中的应用之三---数采功能的标准COM组件接口[原创] 文章来源 :  
英创ARM9工控主板的数据采集功能通常采用板上的GPIO实现数字输入输出、通过精简ISA总线扩展相应的AD或DA实现模拟数据的输入输出。在英创ARM9工控主板提供的基本开发资料中对GPIO和精简ISA总线的驱动均以C的静态库的形式提供,对部分使用C#、LabView等其他开发工具的客户来说,不能直接使用C的API函数。针对这一部分客户的应用需求,我们把相关C函数库封装成标准COM组件,使客户能方便使用主板的数据采集功能。本文将详细介绍数据采集COM组件的相关技术要点,供广大客户使用时参考。

      COM(Component Object Model),即组件对象模型,是微软公司开发的一种新的软件开发技术,提出了组件之间进行交互的规范,也提供了实现交互的环境,因为组件对象之间交互的规范不依赖于任何特定的语言,所以COM也可以是不同语言协作开发的一种标准,如VB、C#、LabView可以使用同一个COM组件来进行软件开发。COM组件的整体结构大概分为三个层次:组件、接口、方法函数,它们的关系如下图所示: 

      COM组件与我们常用的C++类的关系,可以简单的理解为:
            COM组件名:即C++库文件名称
            COM组件接口:即C++库中的类
            COM组件实现方法函数:即C++中的类的成员函数

      下面以EM9000的EM9000_ISA_API.LIB静态库为例,介绍在EVC开发环境,如何在EM9000_ISA_API.LIB静态库的基础上构建相应的COM组件,该方法也可同样应用于英创公司的其他ARM9工控主板产品。

      1、新建一个工程,在新建工程中选择WCE ATL COM AppWizard,并给工程命名为“EM9000_ISA_API_COM”,工程会自动生成一个文件来。在工程编译后,将生成“EM9000_ISA_API_COM.DLL”库文件。这个文件就是要用的COM组件的目标文件。

       2、设置好以后,点击“OK”进入工程的类型选项,在这里,选择动态链接库并将对MFC的支持选择上。即完成工程的建立。


      3、将英创提供的EM9000_ISA_API.h文件复制到当前这个工程目录下面,并在工程的“Settings”下面的LINK中加入“EM9000_ISA_API.lib”。

      4、为COM组件添加接口:这个接口名就是在调用COM组件时的入口名字,在工程中命为EM9000_ISA_COM,添加接口的方法是:Insert ->   New ALT Object…,在弹出来的对话框中,直接点击下一步,这时会再弹出一个对话框,这时,在对话框的Name表单的左上角框中输出接口名EM9000_ISA_COM,这时会生成相应的接口的名字,左边是C++调用的头文件及库,右边是COM组件的接口文件名。系统会自动地在接口名Interface项前加上一个大写字符“I”。

      在工程对话框的attributes选项中,将Threading Model中选择“Free”。确定即可。

      5、为该COM组件添加方法函数:将EM9000_ISA_API.H中的函数添加到COM组件中去。要注意一点,由于在制作COM组件过程中,COM组件实现的方法函数会调用EM9000_ISA_API.H中的函数且方法函数名和要调用的函数不能同名,所以在COM组件的方法函数名前加前缀“COM_”以便区分。在工程的workspace的ClassView中,单击COM组件的接口名“IEM9000_ISA_COM”并单击右键选择“Add Method…”,弹出添加方法函数的对话框。

      如将EM9000_ISA_API.H中的GetPortState( int Port )函数添加进去。这里方法函数为就变为“COM_GetPortState”,参数则有两个,一个是输入参数,用[in]关键字说明,一个是函数返回值,用[out,retval]关键字说明,除了返回值的参数名外,其它的输入输出参数最好和函数的参数一样。参数类型均为”long”,可以参考:

      输入完毕后,点击“OK”完成,这时可以看见新增加的这个方法函数出现在工程中了。双击接口名“IEM9000_ISA_COM”,就会看到该方法函数在文件中的定义:

      interface IEM9000_ISA_COM : IDispatch
      {
            [id(1), helpstring('method COM_GetPortState')] HRESULT COM_GetPortState([in] long Port , [out,retval] long *pVal);
      };

      6、双击CEM9000_COM下的IEM9000_ISA_COM的方法函数名“COM_GetPortState(long Port,Long *Val)”,这时就打开具体实现的源文件EM9000_ISA_COM.CPP文件。在文件中加入:#include 'EM9000_ISA_API.h',并且在FileView的头文件中加入该文件。

      这时将COM_GetPortState方法函数的实现完成,即调用EM9000_ISA_API.h中相应的函数完成功能。

      STDMETHODIMP CEM9000_ISA_COM::COM_GetPortState(long Port, long *pVal)
      {
            AFX_MANAGE_STATE(AfxGetStaticModuleState())
            // TODO: Add your implementation code here
            *pVal = GetPortState( Port );
            return S_OK;
      }

      到这里,就完成了对静态库中的一个函数转成COM组件的方法函数的基本操作,依照上述方法,将其它的函数需要加入到COM组件中,只需重复第5、6步的操作就行了。注意,最后还需要加入出错处理的方法函数:

            方法函数名:_com_issue_errorex
            参数:HRESULT _hr1 , IUnknown *pthis1 , const GUID refiid1
      通过编译生成COM组件EM9000_ISA_API_COM.dll。
      我们所提供的COM组件“EM9000_ISA_AP ......

>>返回讨论的主题



  发表回复
用户名   *您没有注册?
密码   *
验证码   * .
标题   *
心情
随便说说    我回答你    最新发现    得意的笑   
气死我了    真是没劲    坚决同意    表示反对   
大家过来    好奇怪哟    懒得理它    大家小心   
文件上传
内容


字体:      字体大小:    颜色:
粗体 斜体 下划线 居中 超级连接 Email连接 图片 Flash图片 Shockwave文件 realplay视频文件 Media Player视频文件 QuickTime视频文件 引用 飞行字 移动字 发光字 阴影字 查看更多的心情图标 背景音乐
点击加入表情
                         
选项
有回复时用短消息通知您?

   




老古网执行:31毫秒 最大:5186毫秒 查询6次