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

付费下载

下载本文档

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

文档简介

15COM提COM什么是 COMCOMCOM展MIDL指向虚函数表(该函数表就成了一组函数指针的集合),每个函数指针指向‘'COM的语言,都可以对接口进行描述 分别为AddRef,ReleaseRef年1]QueryInterface,这些方法用于实现COM对象计数和A接口ACOM接口ACOM接口AoCOMlkl。 —Funb20{j-FunBl(){..Vtable(一FunA20{-FunAl0{..COMVtable(根据COM规范所建立的应用都是基于/Server模型的。一个完整的COM应用括以下几个部分:COMCOMCOM客户程序:COM客户程序通知COM库,向COM库要调用的COM对象的GUID或lIDCOM对象的DLL(以后客户就同该DLL交互)客户程序调用dll接口方法存根dll接收来自du的数据包和散集(Unmarshalling),并发送给组件程序存根dll列集(marshalling),发送给DLL能成功能以及可视化支持。由于ATL的内容非常多,因此本书只对ATL进行一个式的介ATLCOMMFCCOM,MFCclasSATL—N0—VTABLEpublicCComObjectRootEx<ccomMultiThreadModel>,publiCCComCOClass<CSimple,&CLSID_Simple>,publicIDispatch工mpl<工Simple,&IID—ISimple, {{}DECLARE—REGISTRY—RESOURCEID(IDR—SIMPLE)DECLARE—PROTECT—FINAL—BEGIlUOM_MISimple13CSimple·CComObjectRootExCComCoClassWindowsCECComMultiThreadModeltemte<classconstCLSID+pclsid2&CLSID—Class参数TCOMpclsidCOM·IDispatchlmpl为了在语言环境中使用COM组件,COM规范规定:需要在语言环境中使用的COMIDispatchCOMCOMIDispatchIDispatchIUnknown13派生时,此COM组件才可以在不支持指针及语言环境下使用。CSimple类继承·COMCOM(QueryInterface)。用户想多少个接口,就要写多少个COMINTERFACEENTRY宏,ATL会自动用这些生成一个名为ATLINTMAPENTRY的接口表,然后在CComObjectRootBaseIntemalQueryInterfaceQueryInterface15-2.2ATLCOM在这个例子里,将使用ATL创建一个简单的 提供ISimple接口,并通过 Server,如图l5—择“动态库(DLL)”,附加选项选择“支持MFC”复选框项目类型哩 梗扳辽 i!}麓VisuLlC++分布式系统解决方vi=t11Stmdl0 ¨le和苴他基于且D、ref㈣prF¨、 1哑) 1确定ll取捎座甩程序设 0可执行文件旺xE)哩翻辫F座甩程序设 0可执行文件旺xE)哩翻辫F ,j’‘4。动 库锄工)哩樊别《 模授旺 lli;Vi弭dC++添加简单韵活动橇~鹣n9$tadi*已安羹腻溯麓隰者霄^TLSet~teb服务 麴ATL雕f生 弱^TL性能监视嚣对口ATLOIJzDB提供看 滴ATLActiv…SetrPi‘t蛆件矧ATLCOg+10组件 。”=={豳墅噍:|二:l厂瓦衬 接口0$教重哩0两者 一。r》『$㈣ 支持0两者 一。r》『$㈣ 支持 移是嘿 …mm。‰k。。m 匪三至刁j[耍[][重 windowscEc++——_●-———--——_●I-_-—— — ——属性l也就是通过我们自身的线程同步来确保组件的安全3COMCOMCOM4ISupportErrorlnf0COM属性5——是否支持连接点。如果选中此接口,那么向导将生成一图l5.8就是为接口添加方法的框界面,只需要在MethodName输入框中输ShowSvrMs9,ShowSvrMs9方法将简单地弹出一个框,该方法的实现代码如程序15.1所示/+★★★★★★★★★★★★★★★★★★★★★★★★★★程序l5—STDMETHODIMPCSimple:ShowSvrMsg(){女女//TOD0:Addyourimplemenationcode:MessageBox(NULL图I5-8编译此工程并部署到模拟器后,VS2005会自动Server 用程序,编译环境设置为Windows6ProfessionalSDK(ARMV4I),设择CHSWindows6ClassicEmulator,把窗口字体改成宋体小五号将上面创建的Server工程生成的DLL添加到stdAfx.h#import”D:\\refer c++开发WINDOWS应用程 \\\\ Server\\Windows6ProfesSional 以上语句中 Server项目的编 ,读者应该将 修改为自己。码如程序l5.2所示。/+*++**++***++**+***+*+*+***程序l5- Dl9:0nBnClickedBtnCall(){HRESULThr;CLSID★*★★★*★★★★★★K★0★—★S★★n★r★U★t★e★r★女WindowsCEc+ hr=CoInitializeEx(NULL,COINIT {gotO)ISimpleCOMCoCreateInstance(clSid,NULL,CLSCTXINPROCSERVER, {gotoerrorjISimplee{}}/至此,客户端调用WindowsCEComserver示例就编写完成了。编译到模拟器中,15—915-9COM15。3.1COMCOM 接口”(outgoinginterface如果一个COM对象支持一个和多个出接口,那么称这样的对象为可连接对象“出接口”与“入接口”有本质的区别,“入接口”是由COM用此接口指针来与客户程序进行通信在客户程序方实现这些接口的对象称之“(sink),本身也是一个COM对象,但它往往比较简单,负责处理组件接可连接对象支持多个出接口,且每个出接口支持与多个连接l5.11 WindowsCEC++客户把的 ,COMCOM收器并不需要CLSID来标识的标识和创建过程完全是客户程序内部的事情。对于客, er)IConnectionPoinContainer,&pConnectioPointContain 客户端保存连接标识dw,以便以后断开连接时使用。当客户端要取消连接时,需要先调用pConnectionPointoUnadvise(dw)断与15.3.2连接点示 使用VS2005IVC++新建一个智能设备IATL智能设备项目 境设置为Windows6ProfessionalSDK(ARMV4I)设备环境选择CHSWindows6ClassicEmulator,,IAddAdd(LONGa,LONGb)方法。关于为一个接口添加方法的操,15-12IAddAdd(inta,intb)备注:在类视图中,IAddEvents接口 l5.14J图 为一IAddEvents接口添加ExecutionOver(LONGLresult)方表中单“完成按钮便实现了连接点此时C类被生成并EventsFireExecutionOver(LONGIResult)COM口。现在来实现原始IAdd接口中的Add方法。Add方法实现如程序15.3所示/+★★★★★★★★★★★★★★★★★★★★★★★★★+程序清单l5—CAdd:Add(LONG{AFXMANAGESTATE(AfxGetStaticModuleState())jreturnS——0K;}/至此,带连接点的ATLCOM组件就实现完毕了。读者最后可以编译本项目并部署到模拟器中,VS2005的部署工具将自动.dll组件。2.编写客户端,调用带连接点的COM使用VS20051VC++1智能设备IMFC智能设备应用程序向导创建一个基于框的应用程序Connection编译环境设置为Windows6ProfessionalSDK(ARMV4I),备选择CHSWindows6ClassicEmulator,把窗口字体改成宋体小五号设计框,界面如图l5一l6所示表 框上的主要控件及其属性IDC——EDT——输入框,用于输入数字l,对应成员变量m_numberl,类型IDC—输入框,用于输入数字2,对应成员变量m—number2,类型IDC——BTN——按钮,标题设为“执行”。用于调用上面创建 中的 WindowsCEc++实翌三———————— .h文件。代码如下:onC0对m象,h"mdwRefCount M的计数,接着在Csink类中定义一个私有变量一 ,用十cu 凋r豕剀々I川‘l鳅’DwORDmdwRefCount;//计数变。(4)添加。衄 组件的相关GUID定义。打开conilectionC。m工程中的ox7C20780D0x056A0x484C,c。 tuxHu’uxLD7u^帅玼HRESULT p+/DISPID+/REFIID+/LCID+/WORDwFlags, RPC RPC RPCFAR+—FAR+pDispParams,116.IAddEventsGetTypeInfoCountHRESULTSTDMETHODCALLTYPEGetTypeInfoCountHRESULTSTDMETHODCALLTYPEGetTypeInfof卜in]+/UINTiTInf0,in]+/LCIDicid, HRESULTSTDMETHODCALLTYPEGetIDsOfNameS/+【in]+/REFIID/+[Size RPC/+[in】+/UINT/+【in】+/LCID/+【SizeiS][out]+/DISPIDRPC此8个函数的具体实现代码如程序15.4所示/★★★★★★★★★★★★★★★★★★★★★★★★★★★程序l5—CSink:ExecutionOver(LONG{CStringreturnS_OKCSink.QueryInterface(REFIID m windowscEc++——————————————————————————————————————returnS—OK;)iffiid==IID{mreturnS—OK;}returnENOINTERFACE}//3.IAddEventsAddRefULONGSTDMETHODCALl.TYPECSink:AddRef(){mreturnmdwRe}//4.IAddEventsReleaseULONGSTDMETHODCALLTYPECSink:Release(){-ULONG1=mdwRefCountjif(0==mdwRefCount)deletethiS;return//5.InvokeHRESULTSTDMETHODCALLTYPECSink:Invoke(+/DISPID+/REFIID+/LCID+/WORD RPC+/VARIANTRPC RPC RPCFAR+rgErrl{//ExecutionOvercase{LONGiResult=(pDispParamsrgvarg)一>iValj}returnDISPE}HRESULTSTDMETHODCALLTYPECSink:GetTypeInfoCount({returnS}HRESULTSTDMETHODCALLTYPECSink:GetTypeInfo(/+[in]+/UINT/+[in]+/LCID/+【 (retUrnS)pCSikGetIDsOfNameS(in]+/REFIIDriid,sizeiS【in】+/LPOLESTR RPCFAR+rgszNames, in]+/uINTcNames,in】+/LCIDicid,/+【Sizeis】 RPC{returnS——}/(6)为框上的“执行”按钮添加单击代码。单击此按钮,将实现执行加法操作的功能,单击的实现代码如程序l5.5所示。/+★★★★★★★★★★★★★★★★★★★★★★★★★★程序l5—//执行按钮单击,调用IAdd的Add方VOidCConnectionDl9:0nBnClickedBtnExeC(){HRESULThrj DWORDdwAdvise;hr=CoInitializeEx(NULL,COINITIAddCOMhr=pAdd.CoCreateInstance(CLSIDAdd);ASSERT(hr==SOK);//判断IAdd接口是否有连接点,并得到连接点容器对hr=pCPC一>FindConnectionPoint(DIID //从CSink类创建接点通知对象psink=newCSink()j一hr=pCP-IAddAddpAdd->Add(mnumberl,m—number2)jpCPUnadvise(dwAdvise)jpCPRelease();)/此外,还需要在ConnectionDl9.cpp文件中CSink的定义文件。 //forourCSinkclass至此,连接点客户端测试程序就编写完成了。在运行客户端测试程序之前,应确保对象已经被成功到模拟器上在运行客户端程序时分别输入数字 ActiveX 技vC++通常提供MFC和ATL(ActiveXTemteLibrary)两个途径来开发ActiveX控件使但是生成的控件将比较大。而且,客户端如果要运行此ActiveXMFCMFCCOMOLEMFCActiveXMFCActiveXMFCActiveXControlWizardCMyNameCtrl WindowsCEc++控件后,将使用VC++编写一个客户端程序,来演示如何在WindowsCE下ActiveX控称设为MyCEActiveX,然后按照默认设置完成向导。将编译环境设置为Windows6ProfessionalSDK(ARMV4I),设备环境选择CHSWindows6ClassicEmulator。ActiveXl5.18图15.I8MFCClassWizard图15-19“添加属性向导”l5.20 CString修改属性实现代码,代码如程序l5—6所示/★★★★★★★★★★★★★★★★★★★★★★★★★★★程序l5—BSTRCMyCEActiveXCtr:GetMsgConte×t(void)freturnMsgContextCMyCEctiveXCtrl:SetMsgContext(LPCTSR{{mMsgContext2newValj1/添加ShowMessage方法实现代码,代码片段如程序l5-7所示 /+★★★★★★★★★★★★★★★★★★★★★★★★★+程序清单l5—voidCMyCEActiveXtrlShowMessage(){)/IDCEDTMSGm_Ms9,CStrin9。这里还需要修改CMyCEActiveXPropPage:DoDataExchangecMycEActivexPopPage:DDataExchangeCMyCEActiveXropPageDoDa DDX—Text(pDX,IDC—EDT_MSG,m_Msg);DDP—}MsgContext加MsgContext的值发生变化而触发OnMsgChange,其代码如程序l5-8所示/+★★★★★★★★★★★★★★★★★★★★★★★★★★程序l5—Ili2置MsgContext属 CMyCEActiveXCtrlSetMsgCon1AFX_MANAGE—if(m{m }}矿 欢迎使用器加向/名称妲 娄墨内部名称0胡;西h啦 常用0圳:西h姐ts参数粪擞哩 参数名嘿) 蜮。图l5.22“添加向导”界ActiveXWindowsCEActiveX用程序MyCEActiveX编译环境设置为TestWindows6Professional设备环境选择CHSWindows6ClassicEmulator,把窗口字体改成宋体小五号。注意:在向导框中,一定要选中“ActiveX控件”复选框,表示应用程序支持MyCEActiveX从以下来嘏添加娄 keti0表哩)$文件哩) A’eti 类G)tCD_虻Ektlve肛yent |}l}

温馨提示

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

评论

0/150

提交评论