windows ce嵌入式高级编程及其实例详解_第1页
windows ce嵌入式高级编程及其实例详解_第2页
windows ce嵌入式高级编程及其实例详解_第3页
windows ce嵌入式高级编程及其实例详解_第4页
windows ce嵌入式高级编程及其实例详解_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

15COM提进行入门介绍,同时帮助读者掌握在WindowsCE境下使用ATL编写COM组件的方法,从COMCOM基本知识概 COMCOMCOMCOMCOMCOMCOM展接口定义接口定义遵循MIDL它是针对0SF的DCE(DistributesComputingEnvironment)规范中的IDL语言扩展。由图l5.1可以看出,接口就是包含了一组函数的数指向虚函数表(该函数表就成了一组函数指针的集合),每个函数指针指向‘'COM对象实 15COM分别为AddRef,ReleaseRef年1]QueryInterface,这些方法用于实现COM对象计数和A接口Aolkl。 —COMClient/ServerCOM括以下几个部分:COMCOMCOMCOMCOMCOMCOM客户程序:COMCOM对象的DLL(以后客户就同该DLL交互)根客户程序调用dll接口方法使用ATL创建COM示能COMATLATLATLATLCOMATLCOMMFCCOM,MFCCOMATLCOMATLCOMclasSATL—N0—VTABLEpublicCComObjectRootEx<ccomMultiThreadModel>,publiCCComCOClass<CSimple,&CLSID_Simple>,publicIDispatch工mpl<工Simple,&IID—ISimple, {{}DECLARE—REGISTRY—RESOURCEID(IDR—SIMPLE)DECLARE—PROTECT—FINAL—BEGIlUOM_M15COMISimple13CSimple·CComObjectRootExCComCoClassCComObjectRootEx模板类支持对象聚合或不聚合情形,同时它还实现了标准COM接口的计数和接口查询方法;CComObjectRootEx模板类的构造函数需要传递COM对象的线WindowsCECComMultiThreadModeltemplate<classconstCLSID+pclsid2&CLSID—Class·IDispatchlmpl为了在语言环境中使用COM组件,COM规范规定:需要在语言环境中使用的COMIDispatchCOMCOMIDispatchIDispatchIUnknown13派·COMCOM(QueryInterface)。用户想多少个接口,就要写多少个COMINTERFACEENTRY宏,ATL会自动用这些生成一个名为ATLINTMAPENTRY的接口表,然后在CComObjectRootBaseIntemalQueryInterface15-2.2ATLCOM在这个例子里,将使用ATL创建一个简单的 提供ISimple接口,并通过ISimple接口的ShowSvrMs9方法弹出一个消息提示框下面就分步骤介绍使用ATL创建COM 择 麓VisuLlC++常智麓设分布式系统解决方宴vi=t11Stmdl0 ¨le基于且名称啦位置睡D、ref㈣prF¨、 1洲览哑)解决 称嗵1确定ll取捎 ,嘞15COM樊别《 ;Vi弭dC++智能设添加简单韵活动橇溯麓隰者辩霄^TLSet~teb服务 口ATLOIJzDB提供看 滴ATLActiv…SetrPi‘t蛆件矧ATLCOg+10组件 。”=={I5-5“ATL接口口 口 匪三至刁j[耍[][重 windowscEc++——_●-———--——_●I-_-—— — ——也3COMCOM属性5——是否支持连接点事件。如果选中此接口,那么向导将生成一个3/+★★★★★★★★★★★★★★★★★★★★★★★★★★程 STDMETHODIMPCSimple:ShowSvrMsg(){女女l5COM//TOD0:Addyourimplemenationcode:Messageox(NULL编译此工程并部署到模拟器后,VS2005会自动Server 使用VS2005[VC++1智能设备IMFC智能设备应用程序向导创建一个基于框的应用程序ClientWindowsMobile6ProfessionalSDK(ARMV4I),设CHSWindowsMobile6ClassicEmulator将上面创建的Server工程生成的DLL添加到stdAfx.h#import”D:\\referprogram\\VSc++WINDOWSMOBILE\\\\\\ \\Server\\WindowsMobile6ProfesSional SerVer.dll”n0—以上语句中的是Server 码如程序l5.2所示 ClintDl90nBnClikedBtnall){HRESULThr;CLSID★*★★★*★★★★★★K★0★—★S★★n★r★U★t★e★r★女WindowsCEc hr=CoInitializeEx(NULL,COINIT {gotO)ISimpleCOMCoCreateInstance(clSid,NULL,CLSCTXINPROCSERVER,uuidof(ISimple),{gotoerrorjISimplepSimpleShowSVrMsg();e{pSimple>Release()j}}/至此,客户端调用WindowsCEComserver示例就编写完成了。编译到模拟器中,15—915-9COM15COM可连接点对象及示15。3.1可连接点对象概述COMCOM 如果一个COM对象支持一个和多个出接口,那么称这样的对象为可连接对象object)COMCOM接IConnectionPointContainerl5.11 WindowsCEC++<客户把的15-11,COMCOM收器并不需要CLSID来标识的标识和创建过程完全是客户程序内部的事情对于客户程序外部而言,也是一个单独的COM对象,它有自己的计数和接口查询方法。, er).IConectionPintContiner,&ponnectonPintContain 调用pConnectionPoint— )建立与的15COM当客户端要取消连接时,需要先调用 )断与 15.3.2连接点示 使用VS2005IVC++新建一个智能设备IATL智能设备项目 境设置为WindowsMobile6ProfessionalSDK(ARMV4I),设备环境选择CHSWindowsMobileClassicEmulator中,将出现Add和IAddEvents接口,后者是一个类,它将在客户端中被实现。它的出,IAddAdd(LONGa,LONGb)方法。关于为一个接口添加方法的操作面的章节中已经做了详细介绍,因此这里就不再赘述了。读者可以参面章节的ElIAddAdd(LONGa,LONGb15.12,15-12IAddAdd(inta,intb)备注:在类视图中,IAddEvents接口 l5.14J 框15.13为一IAddEventsExecutionOver(LONGLresultl5COMCProxy类被生成,并EventsFireExecutionOver(LONGIResult)COM/+★★★★★★★★★★★★★★★★★★★★★★★★★+程序l5—CAdd:Add(LONG{AFXMANAGESTATE(AfxGetStaticModuleState())jreturnS——0K;}/ATLCOM部署到模拟器中,VS2005的部署工具将自动.dll组件。COM。2.COM使用VS20051VC++1智能设备IMFC智能设备应用程序向导创建一个基于框的应ConnectionClient,WindowsMobile6ProfessionalSDK(ARMV4I),CHSWindowsMobile6ClassicEmulator图15.16框界表 属 中的 继承而来的,因此在头文件中必须包含_18尖阴疋义义什’∥’队 .h文件。代码如下:onC0对m象,h"mdwRefCount M的计数,接着在Csink类中定义一个私有变量一 ,用十cu凋r豕剀々I川‘l鳅’DwORDmdwRefCount;//计数变csink_m_dwRefCount0。。(4)添加。衄 组件的相关GUID定义。打开conilectionC。m工程中的c。nn裟c町c嫦毽墨如下懈S,ink.cpp,札0x定义篙雾显£恐肛m咖F,tIIDliDIAddox7C20780D0x056A0x484C,c。 = tuxHu’uxLD7u^帅玼15COMHRESULTSTDMETHODCALLTYPEp+/DISPID+/REFIID+/LCID+/WORDwFlags,[in]+/DISPPARAMSRRC RPC RPC RPCFAR+—FAR+pDispParams,HRESULTSTDMETHODCALLTYPEGetTypeInfoCount117.IAddEventsGetTypeInf0HRESULTSTDMETHODCALLTYPEGetTypeInfof卜in]+/UINTiTInf0,in]+/LCIDicid, out]+/ITypeInf0—RPC—FAR+RPC—HRESULTSTDMETHODCALLTYPEGetIDsOfNameS/+【in]+/REFIID/+[SizeiS][in]+/LPOLESTRRPC/+[in】+/UINT/+【in】+/LCID/+【SizeiS][out]+/DISPIDRPCl5—CSink:ExecuionOverLONG{CStringreturnS_OKSink.ueryInerfce(REF.IIDif(iid==DIIDIAddEvents)m ——————————————————————————————————————returnS—OK;)iffiid==IID{mreturnS—OK;}returnENOINTERFACE}ULONGSTDMETHODCALl.TYPECSink:AddRef(){mdwRefCount++jreturnmdwRefCount;}ULONGSTDMETHODCALLTYPECSink:Release(){-ULONG1=mdwRefCountjif(0==mdwRefCount)deletethiS;return//5.InvokeHRESULTSTDMETHODCALLTYPECSink:Invoke(+/DISPID+/REFIID+/LCID+/WORD[in]+/DISPPARAMSRPC+/VARIANTRPC+/EXCEPINFORPC+/UINTRPCFAR+rgErrl{case{15COMLONGiResult=(pDispParams>rgvarg)一>iValj}returnDISPE}HRESULTSTDMETHODCALLTYPESink:etTypenfoount({returnS}HRESULTSTDMETHODCALLTYPESink:etTypenfo(/+[in]+/UINT/+[in]+/LCID/+【out]+/ITypeInf0——RPc—FAR+——RPC—(retUrnS)pSink:etIDsOfameS(in]+/REFIIDriid,sizeiS【in】+/LPOLESTRRPCFAR+rgszNames, in]+/uINTcNames,in】+/LCIDicid,/+【Sizeis】[out]+/DISPIDRPC{returnS——}/的功能,单击事件的实现代码如程序l5.5所示。l5—VOidConnectinClientl9:0nnClickdBtExeC(){HRESULThrj IConnectionPoint+pCP;DWORDdwAdvise;hr=CoInitializeEx(NULL,COINITIAddCOMhr=pAdd.CoCreateInstance(CLSIDAdd);ASSERT(hr==SOK);hr=pAddQueryInterface(IID—IC。nnecti。nPoinContainer,(void+★)&pCPC);hr=pCPC一>FindConnectionPoint(DIID psink=newCSink()jhr=pCP-pAdd->Add(mnumberl,m—number2)jpCPUnadvise(dwAdvise)jpCPRelease();pCPC)/此外,还需要在ConnectionClientDl9.cpp文件中CSink的定义文件。 //forourCSinkclass对象已经被成功到模拟器上在运行客户端程序时分别输入数字12: 15COM创建ActiveX控ActiveX 技InternetActiveXvC++MFCATL(ActiveXTemplateLibraryActiveX使ActiveXMFCMFCCOMOLEMFCActiveXMFCActiveXMFCActiveXControlWizard WindowsCEc++使用VS2005lVC++1句导创建一个“MFC智能设备ActiveX控件”工程,将项目名MyCEActiveXWindowsMobile6ProfessionalSDK(ARMV4ICHSWindowsMobile6ClassicEmulator。为CMyCEActiveXCtrl类添加属性和方法。在类视图中,选中DMyCEActiveX接口,ActiveXl5.18图15.I8MFCClassWizard15-19“添加属性向导”l5.20图15-20“添加方法向导”CMyCEActiveXCtrl~m_MsgContext,代码如下:CStringBSTRCMyCEctiveXCrl:GeMsgCont×t(vod)freturnCMyCEctiveXCrl:SeMsgContxt(LPCSTR{iffm—{mMsgContext2newValj1/添加ShowMessage方法实现代码,代码片段如程序l5-7所示 voidCyCEActieXCtrl:ShowMesage(){)/IDCEDTMSGm_Ms9,CStrin9。这里还需要修改CMyCEActivXPropPae:DoDtaExchageeCyCEActieXPropPge:Doa DDX—Text(pDX,IDC—EDT_MSG,m_Msg);DDP—}MsgContext 加MsgContext的值发生变化而触发OnMsgChange事件,其代码如程序l5-8所示Ili2置MsgContext属性 CyCEActieXCtrl:SetMsgon115COMif(m{mMsgContext0nChange}}矿 ./ 常用t l5.22最后编译部署该项目,系统将自动此0CX。同时到这里MyCEActiveX控件也编ActiveX使用vs20051vC++1智能设备IMFC智能设备应用程序向导创建一个基于框的应MyCEActiveX,编译环境设置为,.TestWindowsMobile6ProfessionalCHSWindowsMobile6ClassicEmulator,把窗口字体改成宋体小五号。注意:在向导框中,一定要选中“ActiveX控件”复选框,表示应用程序支持OCX_DMyCEActiveX_DMyCEActiveXEventsM

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论