Windows CE 系统进程外组件开发的demo

雪影 2011-03-10 05:23:15
前序:
Windows CE提供以下几种COM-Base的应用
1. Minimal COM提供最基础的COM开发接口(API),每个com对象的创建大概需要10~20K。
2. COM提供了普通COM和OLE自动化实现的支持,只能实现自由线程模型、进程内的COM对象。各个COM对象创建大概需要100~200K。
3. DCOM提供了COM所有功能的支持,包括远程设备COM服务。每个对象最少需要700K。
在 默认状态下,由于安全角度考虑,远程服务功能是关闭的;使得DCOM只能提供本地服务,服务进程可连接Internet。要启用远程COM服务功能需要将SYSGEN_DCOM_REMOTEACCESS置为1.
4. COM Storage将结构化存储功能加入了Mini COM、COM、DCOM的实现。
通过上面几点可知,只有DCOM才具有开发进程外组件的能力。
因此想要开发WINCE进程外的组件步骤
1.将DCOM组件加入OS中
2.导出相应的SDK


这篇文章说明了如何使用 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 开发包。
其它的一些工具我们需要准备的注册工具
google 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 的包装

//#ifdef _MERGE_PROXYSTUB // 合并代理存根(stub) DLL

#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://blog.csdn.net/tttyd/archive/2011/03/10/6237904.aspx
...全文
148 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
儿大不由爷 2011-03-10
  • 打赏
  • 举报
回复
佩 服
雪影 2011-03-10
  • 打赏
  • 举报
回复
sf 自己坐

7,659

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧