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

...全文
1554 84 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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)
第1章 Windows Embedded CE 1.1 嵌入式 1.1.1 嵌入式设备 1.1.2 嵌入式软件 1.1.3 嵌入式设备和软件 1.2 Windows Embedded系列 1.3 Windows XP Embedded 1.4 Windows Embedded Point of Service 1.5 Windows Embedded CE 6.0 1.5.1 模块化和简洁的操作系统 1.5.2 实时操作系统 1.5.3 硬件支持 1.5.4 CE 6.0 R2的新特性 1.5.5 定制的UI 1.5.6 有线和无线连接 1.5.7 图形和多媒体 1.5.8 多语言的国际化定位 1.5.9 实时通信和VolP 1.5.10 OS设计模板 1.6 开发CE应用程序 1.7 测试和调试 1.8 Windows Embedded CE的功能 1.9 小结 第2章 开发环境和工具 2.1 Windows Embedded CE Platform Builder 2.2 安装Windows Embedded CE 6.0 2.2.1 支持的处理器 2.2.2 安装顺序 2.2.3 快速修复工程和更新 2.2.4 Windows Embedded CE术语表 2.2.5 Windows Embedded CE环境变量 2.2.6 Windows Embedded CE文件和目录 2.2.7 第三方组件 2.3 构建CE运行时映像 2.4 小结 第3章板级支持包 3.1 BSP概述 3.2 BSP开发 3.2.1 复制设备仿真器BSP 3.2.2 复制CEPC BSP 3.2.3 复制ICOP eBox4300 60E BSP 3.2.4 BSP组件、文件和文件夹 3.2.5 添加文件和模块到BSP中 3.3 小结 第4章 构建定制的CE 6.0运行时映像 4.1 创建初始OS设计 4.1.1 OS设计向导 4.1.2 OS设计项目文件夹和文件 4.1.3 VS2005 IDE中的OS设计项目视图 4.1.4 生成OS运行时映像 4.1.5 MyCEPCBSP的OS运行时映像 4.1.6 MveBox4300BSP的OS运行时映像 4.2 小结 第5章连接目标设备 5.1 目标设备的连接 5.2 连接仿真器 5.2.1 创建MyEmulator目标设备配置文件 5.2.2 设置MyEmulator目标设备配置 5.2.3 将运行映像下载到仿真器中 5.3 连接eBox.4300一MSJK 5.3.1 通过DHCP连接eBOX.4300.MSJK 5.3.2 通过静态IP连接eBOX.4300.MSJK 5.4 连接到CEPC 5.4.1 创建CEPC启动软盘 5.4.2 通过串口连接CEPC 5.4.3 利用以太网连接CEPC 5.5 小结 第6章调试和调试工具 6.1 调试环境 6.1.1 CETK 6.1.2 CoreCon 6.1.3 调试和发布配置 6.2 调试OS设计构建 6.2.1 CE构建过程 6.2.2 构建错误——文件丢失 6.3 远程工具 6.3.1 远程文件查看器(Remote File Viewer) 6.3.2 远程堆遍历器(Remote Heap Walker) 6.3.3 远程放大器(Remote Zoom.In) 6.3.4 远程进程查看器(Remote Process Viewe) 6.3.5 远程注册表编辑器(Remote RegistryEditor) 6.3.6 远程系统信息(Remote Systemlnformation) 6.3.7 远程性能监视器(Remote Performance Monitor) 6.3.8 远程间谍(Remote Spy) 6.3.9 远程内核跟踪器(Remote Kernel Tracker) 6.3.10 远程调用配置器(Remote Call Profiler) 6.4 远程目标控制(Remote Target Control) 6.5 串行调试(Serial Debug) 6.6 小结 第7章启动加载程序概述 7.1 什么是启动加载程序 7.1.1 BIOS加载程序-x86 BIOS加载程序 7.1.2 Eboot Loader 7.1.3 Loadcepc 7.1.4 Romboot Loader 7.1.5 Sboot Loader 7.2 x86设备的BIOS加载程序 7.2.1 x86设备的启动过程 7.2.2 BIOS Loader代码 7.2.3 构建BIOS Loader代码 7.3 小结 第8章 注册表 8.1 Windows Embedded CE注册表 8.2 基于RAM的注册表 8.3 基于配置单元的注册表 8.3.1 基于配置单元的注册表触发两个启动阶段 8.3.2 使用基于配置单元的注册表持久化注册表 8.3.3 注册表刷新 8.4 Windows Embedded CE注册表文件 8.4.1 Windows Embedded CE组件的注册表 8.4.2 串行调试 8.5 有用的注册表参考信息 8.5.1 自动刷新并保存注册表设置 8.5.2 USB可删除存储器的设备名 8.5.3 禁用Start菜单中的Suspend选项 8.5.4 Intemet Explorer启动页 8.5.5 静态IP地址 8.5.6 Windows EmbeddedCE设备名 8.6 访问注册表 8.7 小结 第9章 CETK测试 9.1 Windows EmbeddedCE测试工具包 9.2 CETK测试 9.3 小结 第10章 开发应用程序 10.1 开发范围格局 10.2 新型的嵌入式设备 10.3 小结 第11章 VisualC#2005应用程序 11.1 开发CE的C#应用程序 11.2 小结 第12章 VB2005应用程序 12.1 开发CE的VB应用程序 12.2 小结 第13章 原生代码应用程序 13.1 VisualC++2005原生代码应用程序 13.2 Plat form Builder原生代码应用程序 13.3 小结 第14章 自启动应用程序 14.1 配置注册表白启动 14.2 Windows\Startup自启动 14.3 Auto LaunchApp实用程序 14.4 小结 第15章 定制UI 15.1 CE设备的输入和输出 15.2 CE的自定义UI 15.3 具有NMD自定义UI的CE 15.4 VB2005应用程序作为自定义UI 15.5 小结 第16章 瘦客户端应用程序 16.1 瘦客户端 16.2 Windows瘦客户端OS 16.3 小结 第17章 家庭自动化应用 17.1 家庭自动化控制 17.2 硬件和围设备 17.3 eBoxPhidgetOS设计 17.4 家庭自动化应用程序 17.5 小结 第18章 RFID安全访问控制应用 18.1 无线射频识别技术——RFID技术 18.2 PhidgetRF ID读取器 18.3 RFID读取器应用 18.4 小结 第19章 机器人应用 19.1 Stringer CE机器人 19.2 简单机器人控制应用 19.3 启动机器人应用程序 19.4 小结 第20章 部署CE6.0设备 20.1 Windows网络投影仪 20.2 Windows网络投影仪OS设计 20.3 Windows网络投影仪的使用 20.4 小结 附录A Windows Embedded CE资源 附录B 安装和软件 附录C 示例应用程序和OS设计项目

3,248

社区成员

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

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