用户操作
[留言]  [发消息]  [加为好友] 
订阅我的博客
XML聚合    FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
aawolf的公告
<a href="http://www.microsoft.com/china/windows/embedded/invitation.mspx" target='_blank'> <img src='http://p.blog.csdn.net/images/p_blog_csdn_net/aawolf/121473/o_120240.gif'> </a> <br> <a href="http://www.microsoft.com/china/windows/embedded/invitation.mspx" target='_blank'>第十三届国际集成电路研讨会暨展览会</a> <br> <br> <script type="text/javascript"><!-- google_ad_client = "pub-2632630562282231"; google_ad_width = 120; google_ad_height = 240; google_ad_format = "120x240_as"; google_ad_type = "text_image"; google_ad_channel = ""; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> <br> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> <br> <img height='220' src='http://p.blog.csdn.net/images/p_blog_csdn_net/aawolf/121473/o_MVP_FullColor_ForScreen.JPG'/> <br> 本BLOG所发表文章,作者保留一切权利。必须经过作者本人同意后方可转载,并注名作者和出处。 <br> <a href="http://groups.csdn.net/aawolf_Mobile" target='_blank'> <img src='http://groups.csdn.net/group/ui/styles/default/GroupGlobalPageCaption/groups_logo.gif'/> </a> <br> <a href="http://groups.csdn.net/aawolf_Mobile" target='_blank'>欢迎进入讨论区发表观点或提问</a> <br>
文章分类
Blog
Windows Embedded Blog from China(RSS)
传说中的面霸
唐勉的BLOG ARM-WinCE
张欣的blog
老狗工作室
自游中国
金·评·没
陈锐的博客
Webcast
.NET Compact Framework中的P/Invoke
.NET Compact Framework自定义组件开发
Direct 3D Mobile初体验
SQL Mobile 2005的Replication和RDA开发入门
SQL Mobile新特性介绍
SQL Server 2005 SqlCeResultSet和高性能数据访问深度探索
SQL Server 2005 SqlCeResultSet和高性能数据访问深度探索
Using SQL MOBILE on.NET CF 2.0(Level 300)
VS.NET 2005和.net compact framework 2.0新特性介绍
Windows Mobile 2nd 开发黄金周(4):移动设备应用程序如何使用本地数据编程
Windows Mobile 3rd 技术开发黄金周(6):使用SQL Server Everywhere开发Windows Mobile最佳移动数据应用
Windows Mobile 5 新特性
Windows Mobile 5:让你的企业动起来
Windows Mobile应用访问远程服务
使用.NET CF开发Smartphone应用程序
使用MSMQ创建Windows Mobile远程通讯程序
基于Windows Mobile的企业办公应用及架构
基于Windows Mobile的企业应用开发
存档

原创  如何修改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/

发表于 @ 2009年05月10日 11:16:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:终于有了MSDN上的Blog | 新一篇:Smartphone 2.0 = Phone + Service

  • 发表评论
  • 评论内容:
  •  
Copyright © aawolf
Powered by CSDN Blog