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

这篇文章说明了如何使用 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 的事件。

Windows CE 系统进程外组件应用开发_第1张图片


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

 

你可能感兴趣的:(Algorithm,windows,server,dll,library,interface)