Windows Embedded CE 中国研发团队

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

  • 让Windows CE 6.0 R2支持.NET CF 3.5

    作者:马宁

    原文:http://blog.mcuol.com/User/aawolf/Article/6389_1.htm

          .NET Compact Framework已经升级到3.5的版本了,.NET CF 3.5支持LINQ和WCF等新的特性。对于Windows Mobile的开发人员来说,只需要安装一个更新的CAB包就可以了。可是Windows CE的开发者如果想将.NET CF 3.5加入到OS Design,还是需要花一点功夫的。我们会使用革新2410D开发板作为我们的平台,关于该开发板的介绍和开发过程,大家可以参考我之前的文章——《革新2410D开发板试用手记》,链接如下:
    http://www.cnblogs.com/aawolf/archive/2008/05/29/1209854.html
          来自Mike Hall的QFE
          这篇文章的起因是Mike Hall在自己BLOG上发表的一篇文章:
    http://blogs.msdn.com/mikehall/archive/2008/03/17/net-compact-framework-3-5-component-for-windows-embedded-ce-6-0-catalog-component.aspx

          这篇文章介绍了微软在2008年一月份推出的一个QFE的包,其中包括了.NET Compact Framework 3.5的组件。所谓QFE,就是Quick Fix Engineering,用于快速修复一些BUG或者增加一些新的功能,修改比SP要小,所以可以每月推出。
    好了,既然有老大级的人物给我们指明了方向,小弟们跟着干就是了,首先在微软网站上下载这个QFE包:
    http://www.microsoft.com/downloads/details.aspx?FamilyID=a83124d5-7c8e-4abe-87fd-69654561be40&displaylang=en

        然后确认你的开发计算机上已经装了下面的东西:
          1. Visual Studio 2005
          2. Visual Studio 2005 SP1
          3. Visual Studio 2005 SP1 Update for Vista (if applicable)
          4. Windows Embedded CE 6.0 Platform Builder
          5. Windows Embedded CE 6.0 SP1 (required if PB 6.0 Tools have been installed)
          6. Windows Embedded CE 6.0 R2

          别紧张,基本上来说,只要你用的是Windows CE 6.0 R2,那么这些东西就都有了。

          接下来,我们确认将Visual Studio 2005关闭,然后运行QFE的安装程序就可以了。如果是在Vista下安装的话,可能会遇到安装文件出错的问题,这是由权限问题造成的。我们可以参考下面的文章解决:
    http://support.microsoft.com/kb/950793/en-us
          不过我在Vista下安装时没有碰到这个问题。
          创建.NET Compact Framework 3.5的应用程序

          好了,安装完成后,我们是不是需要打开Visual Studio 2005开始我们的平台定制历程了?不,首先还是让我们先换一台机器。

          换机器干嘛?因为我们遇到了一个逻辑问题——.NET CF 3.5的应用程序在哪里?.NET CF 3.5的应用程序是由Visual Studio 2008开发的,而我们的Platform Builder 6.0是运行在Visual Studio 2005之上的。您可以将VS 2005和VS 2008装在同一台机器上,但是我没有那么做,而是换了台装有VS 2008的机器,来进行下面的应用程序开发。

          需要说明的是,按照常规,我们应该先用Platform Builder 6.0构建一个CE 6.0的平台,然后导出SDK,然后再装有VS 2008的机器上安装,安装完成后再使用VS 2008开发一个针对该CE 6.0平台的应用程序。如果真这么干,拐弯就拐到爪哇国去了。

          幸好Visual Studio 2008为我们提供了另一种方式,还是来看一下:

          打开Visual Studio 2008后,还是首先选择File – New – Project菜单项。在New Project对话框中选择Visual C#中的Smart Device,然后选择创建Smart Device Project,名字随便定。

          接下来的对话框对于经常看我文章的朋友也会很熟悉:

          只是这一次我们选择的Target platform不是Pocket PC或者Smartphone,而是Windows CE,还要记得一定要选择.NET CF 3.5。

          好了,接下来就进入了IDE的窗口设计器,看起来和普通的WinForm程序没有太多区别。我们添加了三个按钮和一个ListBox,还有两个菜单项。

    在第一个Button“Message”里添加下面的事件处理函数:

    private void button1_Click(object sender, EventArgs e) 
    { 
        MessageBox.Show("Hello,.NET CF 3.5"); 
    }
    
    我承认我没追求,所有程序不都是从Hello World开始的吗?为了要突出一下.NET Compact Framework 3.5的新特性,我们还要添加对于LINQ的支持:
    private void button2_Click(object sender, EventArgs e) 
    { 
        listBox1.Items.Clear();
    
        var numbers = new List() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    
        var evenNumbers = 
            from p in numbers 
        where (p % 2) == 0 
            select p;
    
        foreach (var number in evenNumbers) 
            listBox1.Items.Add(string.Format("{0} ", number)); 
    } 
    
    关于LINQ我就不多作解释了,记得添加System.Linq的引用,还有:
    using System.Linq;
    在添加完Linq后,我们还有一个更直接的办法,就是版本号:
    private void button3_Click(object sender, EventArgs e) 
    { 
        MessageBox.Show(Environment.Version.ToString()); 
    } 
    
    System.Environment中的Version属性可以很直接的告诉我们当前运行的.NET CLR的版本号。具体细节看MSDN帮助吧。

          好了,程序编写好了,接下来就要运行它了。但是我们的Visual Studio 2008里并没有Windows CE的模拟器。没办法,只好选择Windows Mobile 6 Professional的模拟器来跑了。

            事实证明,在应用程序开发方面,Windows CE和Windows Mobile的差距的确不大。程序不但跑起来了,而且菜单还按照Windows Mobile的方式显示到了窗体下方。

             上面就是点击Version按钮后的运行结果,可以看到我们的.NET CLR是3.5的。
            创建支持.NET CF 3.5的OS Design
            OK,终于可以回到我们的Platform Builder里创建包含.NET CF 3.5的OS Design了。我们可以创建一个新的OS Design,或者利用已有的OS Design。
            具体方法请参考:
            革新2410D开发板试用手记(三)
    http://www.cnblogs.com/aawolf/archive/2008/06/03/1212696.html
    Windows Embedded CE 6.0开发初体验(五)构建CE平台
    http://www.cnblogs.com/aawolf/archive/2008/01/15/1040306.html

            当我们打开OS Design的Catalog Item View页面。在Core OS - CEBASE – Application and Services Development下,我们可以看到.NET Compact Framework 2.0和.NET Compact Framework 3.5两个选项。选择.NET CF 3.5的选项和简体中文资源,以及OS Dependencies for .NET Compact Framework 3.5的选项。

          当然,我们也可以在OS Design的创建向导里选择.NET CF 3.5的组件。
    为了验证我们的.NET CF 3.5 CLR可以良好运行,我们还需要添加一个.NET CF 3.5的应用程序。怎么添加呢?

          第一步,呃,从另外一台机器上把应用程序拷过来……
          第二步,在Solution Explorer里选择OS Design下的Parameter Files下的Project.bib文件。在《Windows Embedded CE 6.0开发初体验(六)平台定制》中我们详细讨论过bib文件,请参考:
    http://www.cnblogs.com/aawolf/archive/2008/02/03/1063444.html
          第三步,将.NET CF 3.5的应用程序加入到OS Design中:

           就一句话,简单吧?然后就是OS Design的编译、下载、运行和调试了。需要说明一点的是,可能由于Debug版的NK.bin太大,我一直没有成功运行起来。不过Release版的一切正常。

           关于编译和下载的话题,可以参考下面的文章:
    革新2410D开发板试用手记(六)
    http://www.cnblogs.com/aawolf/archive/2008/06/24/1228752.html
    Windows Embedded CE 6.0开发初体验(七) 编译和调试平台
    http://we.cnblogs.com/article.aspx?id=20

           好了,最后来看一下运行结果:我们点击了Version按钮,显示当前的.NET CF CLR确实是.NET CF 3.5版本。

           最后让大家看看开发板的裸照吧(开发板本来就……)

This Blog

Syndication

Tags

No tags have been created or used yet.

Archives


© 2009 Microsoft Corporation. All rights reserved. Terms of Use  |  Trademarks  |  Privacy Statement
Microsoft
Page view tracker