前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Windows CE 系统进程外组件应用开发

Windows CE 系统进程外组件应用开发

作者头像
雪影
发布2018-08-02 14:40:17
7540
发布2018-08-02 14:40:17
举报
文章被收录于专栏:流媒体人生流媒体人生

这篇文章说明了如何使用 WindowS CE 6.0 系统的 DCOM ,开发 com 服务进程。向客户端提供跨进程的 COM 组件服务,以及自定义接口代理 / 存根 dll 的建立,注册。

假定你需要创建一个实时的控制程序,需要一直在后台运行着,而你的客户端却是多个或多样性,客户端的开发语言不确定性。这就需要创建一个 COM 服务进程程序。

Windows CE 镜像中需要包括 DCOM 组件服务

不幸的是由于系统空间的限制,很多基于 Windows CE 系统的 OS 都不支持 DCOM 。 需要使用 Platfom Builder 向我们的 Windows CE 镜像中添加 DCOM 。

另外必须导出支持 DCOM API 的 Windows CE SDK 开发包。

其它的一些工具我们需要准备的注册工具

GuiRegsvrCE.exe 用于注册你的 COM DLLs

这类工具可以在网上搜索到

创建 COM Server

由于 Windows CE 不支持自动化列集 / 散集,因此我们需要建立自己的代理 / 存根,用与 COM Server 和 Client 之间的接口方法参数的列集与散集。当然,在 windows XP/2000 系统中,如果我们在 COM 方法中使用 OLE 兼容的数据类型,我们可以不提供代理 / 存根 DLL 。如果需要使用自定义的数据类型则都需要建立对应的代理 / 存根代码,并注册之后才能使用。

由于上述原因,开发 WindowsCE COM Server 时,需要将 IDL 文件 LIBRARY 块中的 dispinterface 定义代码移到 LIBRARY 块外部来。所有的接口都必须在 LIBRARY 快的外部定义,这样 MIDL 编译器将生成恰当的代理 / 存根代码。

注意, sink dispainterface 接口被重定义,被标识为 dual 并从 IDispatch 接口派生。、

[ object, uuid(8D2D2A49-E8D3-4630-924D-1F83A4B063DB), dual, nonextensible, helpstring("IAlgorithm 接口"), pointer_default(unique) ] interface IAlgorithm : IDispatch{ [id(1), helpstring("方法Add")] HRESULT Add([in] LONG n1, [in] LONG n2, [out,retval]LONG* nVal); [id(2), helpstring("方法Minus")] HRESULT Minus([in] LONG n1, [in] LONG n2, [out,retval] LONG* nVal); [id(3), helpstring("方法Input")] HRESULT Input([in] BSTR str); }; #ifdef UNDER_CE [ uuid(C33B6BCD-ABBB-4E80-8E55-F34CC867BE83), dual, helpstring("_IAlgorithmEvents 接口") ] interface _IAlgorithmEvents : IDispatch { //properties: //methods: [id(1), helpstring("方法Output")] HRESULT Output([in] BSTR str); }; #endif //UNDER_CE [ uuid(4EC8BE3C-DF5C-4E56-B1F5-9350266E32FC), version(1.0), helpstring("ServDemo 1.0 类型库") ] library ServDemoLib { importlib("stdole2.tlb"); interface IDocHostUIHandlerDispatch; interface IAxWinAmbientDispatchEx; #ifndef UNDER_CE [ uuid(C33B6BCD-ABBB-4E80-8E55-F34CC867BE83), helpstring("_IAlgorithmEvents 接口") ] dispinterface _IAlgorithmEvents { properties: methods: }; #endif //UNDER_CE [ uuid(9EEFFB69-1604-4DA2-A12A-FAB65CE9D587), helpstring("Algorithm Class") ] coclass Algorithm { [default] interface IAlgorithm; [default, source] dispinterface _IAlgorithmEvents; }; };

代理存根 DLL 的创建 Proxy/Stub

和 PC 端的代理存根的创建差不多,需要注意的是,需要定义一些宏才能编译通过。另外定义一个 def 文件,注明要到处的函数。

// dlldata.c 的包装 #define REGISTER_PROXY_DLL //DllRegisterServer 等 #ifndef _WIN32_WCE #define _WIN32_WINNT 0x0400 //对于 WinNT 4.0 或安装了 DCOM 的 Win95 #else #define WIN32 #endif #define USE_STUBLESS_PROXY //仅当使用 MIDL 开关 /Oicf 时定义 #ifndef _WIN32_WCE #pragma comment(lib, "rpcns4.lib") #endif #pragma comment(lib, "rpcrt4.lib") //#define ENTRY_PREFIX Prx #include "dlldata.c" #include "ServDemo_p.c"

编译好以上两个工程之后,基本上进程外 COM Server 工作算是完成了。在机器是使用是还需注册才行。

如何调用进程外组件 ( Client 程序)

对应客户端而已,基本上和调用进程内组件没什么区别了。在这里我提供了一些辅助代码《EventHandler.h》,协助客户端在不使用 ATL 情况下接受 COM Server 的事件。

源代码下载: http://download.csdn.net/source/3080188

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2011年03月10日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档