如何编写一个应用程序来检测Windows CE的平台类型

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

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

创建平台检测程序
首先,我们需要创建一个应用程序来检测当前的平台类型,我们使用C++和Platform. Builder来创建这个程序。

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

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

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

我们打开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程序。

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

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

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

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

x:WINCE600PLATFORMDEVICEEMULATORSRCINC

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

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

#if defined( project_smartfon )

#define IOCTL_PLATFORM_TYPE (L"SmartPhone")

#elif defined( project_wpc )

#define IOCTL_PLATFORM_TYPE (L"PocketPCSSDK")

#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。

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

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

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

时间: 2024-10-21 23:36:15

如何编写一个应用程序来检测Windows CE的平台类型的相关文章

如何修改Windows CE的平台类型

在开发Windows CE的应用程序时,经常需要检测平台类型,了解我们的应用程序运行在Pocket PC.Smartphone还是Windows CE上.在这篇文章里,我们介绍如何编写一个应用程序来检测当前运行的平台类型. 在开发Windows CE的操作系统时,我们会遇到另外一种情况:某些应用程序限制了运行的操作系统平台,比如只允许运行在Pocket PC上.而我们如果想在Windows CE上运行的话,就需要修改操作系统的平台类型.注意:这种情况只能出现在测试时,不应该修改实际产品的平台类型

c++-编写一个C++程序,有个输出最长的符合要求的字母。

问题描述 编写一个C++程序,有个输出最长的符合要求的字母. 编写程序: 如果一个字母延伸到中线之上,如d或f,则称其有上出头部分(ascender). 如果一个字母延伸到中线之下,如p或g,则称其有下出头部分(dexcender). 编写程序,读入一个单词文件,输出最长的即不包含上出头部分,也不包含 下出头部分的单词. 解决方案 用动态规划 和查找最长公共子串的算法类似,先构造后缀数组,然后排序,遍历,找到最长的.

vc2012 c++-关于如何编写一个视频抓取程序的问题,求思路

问题描述 关于如何编写一个视频抓取程序的问题,求思路 我想问一下,如果想用VC编写一个程序,去抓取正在一个播放器,例如迅雷播放器正在播放的视频,然后以某种格式将这个视频存起来的思路是怎么进行的,求大神帮忙 这个问题就我所知应该比较复杂,例如要如何去抓取迅雷的窗口,要如何进行转码储存视频,感觉很乱很杂,所以现在求指点如何规划这个程序以及需要哪一些知识去做 如有人能帮忙回答,万分感谢

文档-编写一个java程序,将webbrowser控件嵌入进去

问题描述 编写一个java程序,将webbrowser控件嵌入进去 用java语言编写一个程序实现从网页中找到文档链接并下载和删除.拜托各位啦 解决方案 http://blog.csdn.net/b_h_l/article/details/8266899

list-link中编写一个抽奖程序,如何将comboBox转变成List<T>

问题描述 link中编写一个抽奖程序,如何将comboBox转变成List<T> link中编写一个抽奖程序,如何将comboBox转变成List 解决方案 List<string> items = comboBox1.Items.Cast<String>();

第一次接触bat-bat编写一个脚本程序,检查注册表注册成功

问题描述 bat编写一个脚本程序,检查注册表注册成功 编写一个检查注册码注册成功的脚步程序.注册表的路径如下:HKEY_CURRENT_USERSoftwareHewlett-PackardManual RunnerMicTestPackagesWebPackageSettingsCustomEventsConfigurationWebButtononmousedown 如何检查onmousedown注册成功?然后提醒用户注册成功.

汇编语言 编写一个自相关程序

问题描述 汇编语言 编写一个自相关程序 求大神帮忙编写一个DSP的汇编语言的自相关程序,并给出设计思路和程序注释 解决方案 dsp用的是什么单片机,要说清楚

编写一个单片机程序,通过一个钮子开关K1控制八只发光二极管的两种不同状态。

问题描述 编写一个单片机程序,通过一个钮子开关K1控制八只发光二极管的两种不同状态. 用AT89C51来完成实验.要求:1.使用P3口作为信号输入口,P1口作为信号输出口.2.若开关节K1接高电平时,八只二极管均处于点亮状态,并持续10秒,开关接低电平时,八只二极管处于交叉两灭状态,并持续5秒3.编写程序的首地址设为4000H. 解决方案 你这个是上课作业吧? 解决方案二: 要用汇编写程序啊...头痛..很久没用汇编了.. 解决方案三: 先画好流程图,用C语言编好程序,用keil编译,通过后就把

编写一个winform程序,实现以下功能

问题描述 1.在数据库中建三个表,并用sql语句插入若干条数据.表一:订单表,包括以下几个字段:订单编号:主键货物编号:外键客户编号:外键货物数量计划发货时间实际发货时间表二:货物表货物编号:主键货物名称:单价:库存数量:初始化时均设置为100件表三:客户表客户编号:主键客户名称是否VIP客户2.编写一个winform程序,实现以下功能(注意键的冲突):1.删除三个表中的数据,2.从三个excel文件中导入初始化数据至三个表中.3.通过程序插入三条数据至订单表,(用事务控制数据一致性)4.调用一