当前位置: 首页 > news >正文

如何修改Windows CE的平台类型

作者:马宁

在开发Windows CE的应用程序时,经常需要检测平台类型,了解我们的应用程序运行在Pocket PC、Smartphone还是Windows CE上。在这篇文章里,我们介绍如何编写一个应用程序来检测当前运行的平台类型。

在开发Windows CE的操作系统时,我们会遇到另外一种情况:某些应用程序限制了运行的操作系统平台,比如只允许运行在Pocket PC上。而我们如果想在Windows CE上运行的话,就需要修改操作系统的平台类型。注意:这种情况只能出现在测试时,不应该修改实际产品的平台类型,否则会引起很多安全性的问题。

创建平台检测程序

首先,我们需要创建一个应用程序来检测当前的平台类型,我们使用C++和Platform Builder来创建这个程序。如果你熟悉.NET Compact Framework的开发,想开发托管的平台检测程序,请参考:

如何检测你的应用程序是否运行在模拟器上

http://blogs.msdn.com/netcfteam/archive/2006/09/15/756755.aspx

检测你的程序运行在Pocket PC或Smartphone上

http://blogs.msdn.com/netcfteam/archive/2006/09/22/766343.aspx

检测平台是否支持触摸屏

http://blogs.msdn.com/netcfteam/archive/2006/10/02/Platform-detection-III_3A00_-How-to-detect-a-touch-screen-on-Windows-CE-in-.NET-CF.aspx

创建OS Design和编译的过程在此略过,可以参考《Windows CE 6.0 R2开发初体验》. 我们首先在Platform Builder里创建一个子工程(Subporject),在Solution Explorer里找到Subporject节点,右键选择Add New Porject,会启动向导。

clip_image001

在向导中,选择WCE Application,将工程名称改为”CheckPlatform”.

clip_image002

为了少写代码,我们选择”Hello World” application,一般情况下,我们应该选择simple Windows Embedded CE application.

clip_image003

我们打开Subprojects节点中的CheckPlatform(工程名称)中的Source files节点中找到CheckPlatform.cpp文件。在文件中找到WndProc函数,将代码修改为:

TCHAR szPlatform[1024];

switch (message)

{

case WM_PAINT:

hdc = BeginPaint(hWnd, &ps);

// TODO: Add any drawing code here...

RECT rt;

GetClientRect(hWnd, &rt);

if (SystemParametersInfo(SPI_GETPLATFORMTYPE,sizeof(szPlatform),szPlatform,0)!=0)

{

DrawText(hdc, szPlatform, _tcslen(szPlatform), &rt, DT_CENTER);

}

EndPaint(hWnd, &ps);

break;

default:

return DefWindowProc(hWnd, message, wParam, lParam);

}

代码写的并不好,主要是为了验证SystemParametersInfo函数,我们就将Platform Type显示到窗体上了。正常情况下,我们应该用下面的代码判断运行平台:

if (SystemParametersInfo(SPI_GETPLATFORMTYPE,sizeof(szPlatform),szPlatform,0)!=0)

{

if (lstrcmp(szPlatform,TEXT("PocketPC"))==0)

; // Pocket PC

else if (lstrcmp(szPlatform,TEXT("Smartphone"))==0)

; // smartphone

}

如果使用SPI_GETOEMINFO参数,我们可以获得OEM信息,如果返回字符串中包括“Microsoft DeviceEmulator”,则表示当前应用程序运行在模拟器中。

CheckPlatform程序编译好后,会自动加入到NK.bin 中。我们可以通过Command Shell,运行应用程序。调用Attach Device启动Windows CE操作系统后,选择Target菜单中的Target Control(快捷键Alt+1),输入”s chekplatform”,就可以运行CheckPlatform程序。

clip_image004

好了,最后看一下运行结果:

clip_image006

修改操作系统的类型

上面的话题其实很多文章都讨论过了。但是在实际工作中,我们会遇到一些平台迁移的工作。我们会首先将Windows Mobile的软件在Windows CE上运行,以验证功能。不过有些软件检测了操作系统类型,在不修改软件代码的情况下,我们是否可以在Windows CE上运行检测平台类型的应用程序呢?

Windows CE操作系统的Platform Type类型值是在BSP中被指定的,我们可以通过修改BSP中的Platform Type来改变系统的Platform Type。注意:这种情况只能出现在测试时,不应该修改实际产品的平台类型,否则会引起很多安全性的问题。

我们打开Windows CE 6.0 R2的源代码,位置在:

x:\WINCE600\PLATFORM\DEVICEEMULATOR\SRC\INC

我们修改的是DEVICEEMULATOR的代码,如果是其他平台的代码,则去相应BSP文件夹中的指定位置。在BSP的INC文件夹中,我们会找到一个ioctl_cfg.h文件。

在ioctl_cfg.h文件中,我们会找到下面的代码:

#if defined( project_smartfon )

#define IOCTL_PLATFORM_TYPE (L"SmartPhone\0")

#elif defined( project_wpc )

#define IOCTL_PLATFORM_TYPE (L"PocketPC\0SSDK\0")

#else

#define IOCTL_PLATFORM_TYPE (L"DeviceEmulator")

#endif

#define IOCTL_PLATFORM_OEM (L"Microsoft DeviceEmulator")

Device Emulator的BSP通过编译选项区分了不同的平台类型,如果是Windows CE系统,则Platform Type为DeviceEmulator。好了,我们可以通过修改IOCTL_PLATFORM_TYPE的值,来“欺骗”操作系统,让应用程序认为自己运行在Pocket PC或Smartphone上。注意:因为Windows Mobile和Windows CE的函数库存在巨大差异,Windows Mobile的应用程序在Windows CE上未必能够直接运行。

修改IOCTL_PLATFORM_TYPE之后,我们需要重新编译BSP,才能够完成Platform Type的修改。在Build菜单中选择Advanced Build Commands中的Rebuild Current BSP and Subprojects。

clip_image007

我们可以编译BSP和Subporject后,调用BuildRel和Makeimg生成新的NK.bin。这样,我们就可以节省大量的重新编译的时间。在我的机器上大概几分钟就完成了BSP的编译,如果是重新Build操作系统的话,需要二十分钟左右。

NK编译成功后,选择Attach Device,重新运行系统和CheckPlatform程序,会得到下面的运行结果:

clip_image009

最后还需要提示一下,这种方法只对通过SystemParametersInfo API检测Platform Type的应用程序有效。如果软件使用了其他方法检测Platform Type的话,那就需要具体问题具体分析了。

更多关于Windows Embedded CE开发的文章,请参考“Windows Embedded CE 中国研发团队”的中文博客:http://blogs.msdn.com/wincechina/

相关文章:

  • LeetCode -- Game of Life
  • 黄舒骏,改变1995
  • LeetCode -- H-Index II
  • vim插件 ctags 和 taglist 的安装和使用
  • LeetCode -- Longest Increasing Subsequence
  • LeetCode -- Serialize and Deserialize Binary Tree
  • Ubuntu中用apt安装和卸载软件
  • LeetCode -- Single Number III
  • Linux 常用C函数(内存及字符串操作篇2)
  • LeetCode -- Subsets II
  • WCDMA与CDMA2000网络结构比较
  • LeetCode -- Integer to English Words
  • WiMAX组网技术与解决方案
  • LeetCode -- Sum Root to Leaf Numbers
  • 移动设备管理(MDM)与OMA(OTA)DM协议向导(三)——AAA服务器
  • JavaScript-如何实现克隆(clone)函数
  • Android优雅地处理按钮重复点击
  • Angular 响应式表单之下拉框
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • Date型的使用
  • Docker入门(二) - Dockerfile
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • Object.assign方法不能实现深复制
  • PAT A1120
  • Python实现BT种子转化为磁力链接【实战】
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 初探 Vue 生命周期和钩子函数
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 记录:CentOS7.2配置LNMP环境记录
  • 通过git安装npm私有模块
  • 项目管理碎碎念系列之一:干系人管理
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​Python 3 新特性:类型注解
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • # Maven错误Error executing Maven
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (26)4.7 字符函数和字符串函数
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (十一)c52学习之旅-动态数码管
  • .net mvc部分视图
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • /*在DataTable中更新、删除数据*/
  • /etc/fstab 只读无法修改的解决办法
  • @基于大模型的旅游路线推荐方案
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [20150707]外部表与rowid.txt
  • [flask]http请求//获取请求头信息+客户端信息
  • [Linux] day07——查看及过滤文本
  • [P4V]Perforce(P4V)使用教程
  • [python 邮件处理]