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

雪影 2011-03-10 05:12:52
加精
前序:
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

...全文
1465 84 打赏 收藏 转发到动态 举报
写回复
用AI写文章
84 条回复
切换为时间正序
请发表友善的回复…
发表回复
xylshjj 2011-03-20
  • 打赏
  • 举报
回复
学习了。。
johnnyruan 2011-03-20
  • 打赏
  • 举报
回复
学习了,不过暂时还没有考虑WIN CE下的开发
linbeisi 2011-03-20
  • 打赏
  • 举报
回复
很有指导意义,谢谢!
tcbo 2011-03-20
  • 打赏
  • 举报
回复
有时间学学
  • 打赏
  • 举报
回复
[Quote=引用 70 楼 xylicon 的回复:]
收藏,学习。
[/Quote]
xylicon 2011-03-17
  • 打赏
  • 举报
回复
收藏,学习。
jimmy5656 2011-03-16
  • 打赏
  • 举报
回复
认真学习了!受用!
dos5gw 2011-03-16
  • 打赏
  • 举报
回复
项目用wince的方案被cut了。。。
kijl000 2011-03-15
  • 打赏
  • 举报
回复
最近公司刚入手一台wince,让我拿着,看看怎么搞,不懂得地方还要向您请教请教~
koumingjie 2011-03-14
  • 打赏
  • 举报
回复
感谢分享!!!
denglic 2011-03-13
  • 打赏
  • 举报
回复
嘻嘻!俺来拿积分地
fly_cool 2011-03-13
  • 打赏
  • 举报
回复
虽然看不懂,但是要学习
beaugauge2013 2011-03-13
  • 打赏
  • 举报
回复
好东西,收藏~


-----------------------
虚拟仪表控件 www.beaugauge.com
ShunYuan0909 2011-03-12
  • 打赏
  • 举报
回复
我才刚开始,所以还不能看懂,继续努力中......
lyh7736362 2011-03-12
  • 打赏
  • 举报
回复
不是多个窗体同时运行,也相当于多个线程同时运行
qq820224144 2011-03-12
  • 打赏
  • 举报
回复
dfgdfghfdh好,能配解释文档更好
zmlmf319 2011-03-11
  • 打赏
  • 举报
回复
看看讨论意见
techexcel123 2011-03-11
  • 打赏
  • 举报
回复
Windows CE SDK
line_us 2011-03-11
  • 打赏
  • 举报
回复
看看讨论意见
无水先生 2011-03-11
  • 打赏
  • 举报
回复
好,能配解释文档更好
加载更多回复(16)

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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