科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道如何修改Windows CE的平台类型

如何修改Windows CE的平台类型

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

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

作者:马宁 来源:Zdnet软件频道 2010年1月4日

关键字: Windows CE

  • 评论
  • 分享微博
  • 分享邮件
在开发Windows CE的应用程序时,经常需要检测平台类型,了解我们的应用程序运行在Pocket PC、Smartphone还是Windows CE上。在这篇文章里,我们介绍如何编写一个应用程序来检测当前运行的平台类型。
 
在开发Windows CE的操作系统时,我们会遇到另外一种情况:某些应用程序限制了运行的操作系统平台,比如只允许运行在Pocket PC上。而我们如果想在Windows CE上运行的话,就需要修改操作系统的平台类型。注意:这种情况只能出现在测试时,不应该修改实际产品的平台类型,否则会引起很多安全性的问题。
 
创建平台检测程序
首先,我们需要创建一个应用程序来检测当前的平台类型,我们使用C++和Platform. Builder来创建这个程序。如果你熟悉.NET Compact Framework的开发,想开发托管的平台检测程序,请参考:
 
如何检测你的应用程序是否运行在模拟器上
 
 
检测你的程序运行在Pocket PC或Smartphone上
 
 
检测平台是否支持触摸屏
 
 
创建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:\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。
 
 
 
我们可以编译BSP和Subporject后,调用BuildRel和Makeimg生成新的NK.bin。这样,我们就可以节省大量的重新编译的时间。在我的机器上大概几分钟就完成了BSP的编译,如果是重新Build操作系统的话,需要二十分钟左右。
 
NK编译成功后,选择Attach Device,重新运行系统和CheckPlatform程序,会得到下面的运行结果:
 
 
 
最后还需要提示一下,这种方法只对通过SystemParametersInfo API检测Platform. Type的应用程序有效。如果软件使用了其他方法检测Platform. Type的话,那就需要具体问题具体分析了。
 
更多关于Windows Embedded CE开发的文章,请参考“Windows Embedded CE 中国研发团队”的中文博客:http://blogs.msdn.com/wincechina/
 
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章