您好,  [请登录] [QQ登录]  [支付宝登录[免费注册]

商品分类

分享到: 百度搜藏 搜狐微博 新浪微博 腾讯微博 QQ收藏 人人网 Facebook Twitter

Windows Embedded Standard开发初体验

发布日期:2011-05-11

        Windows Embedded Standard开发初体验(一)

         Windows Embedded Standard,微软又创造了一个新名词。与此同时,XP Embedded,成为了一个历史名词。微软在年初推出了新的Windows Embedded产品线命名规则:Windows CE改名为Windows Embedded Compact,而XP Embedded改名为Windows Embedded Standard,WEPOS改名为Windows Embedded POSReady,还有新推出的针对导航产品的Windows Embedded NavReady。

        好了,无论Windows Embedded Standard叫什么,我们只要记得,它就是一个组件化的XP Professional SP2就好了。为了适应嵌入式产品的定制化需求,微软将XP Professional拆成了两万多个组件,允许用户根据自己的需求进行二次开发,定制尺寸更小的操作系统。而且可以完成一些特殊的要求,比如换一个桌面程序,启动时执行自定义操作,还可以更换启动的XP界面等。还有一些EWF之类的高级功能。

        但是被乱刀切块的XP Embedded也是XP,所以Windows Embedded Standard也只能运行在x86架构的CPU上,而不能支持其他的CPU,比如ARM。

       当然Windows Embedded Standard比起之前版本的XP Embedded还是有很多进步的,最大的一个特点就是将Silverlight引入到了WES中,后边我们还会详细说到。

       说到这里,相信大家会对Windows Embedded Standard有一个感性的理解。接下来,我们就要通过实践,让大家看到Windows Embedded Standard开发的流程。

       安装Windows Embedded Standard

        目前Windows Embedded Standard还没有正式发布,现在的CTP(社区预览版)相当于征求意见稿,可以免费从微软网站上下载的到。只需要在下列地址中,使用Live ID做一个简单的注册,下载项目中选择Windows Embedded Standard的ISO文件即可。下载地址:

        https://connect.microsoft.com/windowsembedded

       下载过程会安装微软的File Transfer Manager,文件有4G左右,下载过程会根据网速有所不同,请大家耐心等待。

       下载完成后,我们可以刻盘或者使用Daemon虚拟ISO文件,然后自动运行。运行会为我们启动一个Windows Embedded Standard的安装向导。

       首先在Prepare中需要首先安装SQL Server 2005 Express版本,可以从Web或者DVD安装。我选择从Web安装,30多M,不算太大。SQL Server Express主要是为了存储WES的组件数据库。

       接下来直接进入WES的安装向导:

       省略欢迎界面和License界面,反正所有软件都有这两个界面。下面是选择快速安装还是高级安装的界面。我选择了“Advanced”:

       在高级安装模式中,果然有我们需要的东西。在“Windows Embedded Standard”-“Database”中选择“Chinese(PRC) Language Pack”和“Chinese(Taiwan) Language Pack”,简体中文和繁体中文不是默认安装,所以我们要选:

       下面这一步非常重要:我在这里被困扰了两个小时……。安装过程需要输入SQL Server Express的名称。我在这里犯了错误(之前一直在用SQL Server),我们要填写计算机名+实例名称,而SQL Server Express安装时,我没有填写实例名称,然后就想当然的认为没有实例名称。不过经过试验,我知道SQL Server Express的数据库名是:计算机名+SQLEXPRESS。

       然后点击旁边的Test按钮,如果数据库连接成功,则显示下图的对话框。需要说明的是,如果数据库连接不成功,也可以完成安装过程,不过在打开Target Designer时,会告诉你数据库初始化失败。(知道我为什么被困扰两个小时了吧?)

       如果显示下面的界面则说明数据库连接没有问题,放心安装就好了。

       后边的安装过程没有需要介绍的了,安装完成即可。

        Windows Embedded Standard开发初体验(二)

       支持Silverlight的Windows Embedded Standard
好了,完成安装之后,我们就可以来做Windows Embedded Standard的第一个操作系统镜像了。在开始菜单中找到“Microsoft Windows Embedded Studio”,启动其中的Target Designer。然后再Target Designer的File菜单中选择New,创建一个新的Configuration。

       输入名称后,点击OK,进入Target Designer的主界面。为了简单起见,我们选择Virtual PC作为我们的目标设备,这样就可以省去获取硬件设备信息的步骤。

       首先,我们要在左侧的组件列表中找到我们要添加的组件。第一个自然是Silverlight组件了。Windows Embedded Standard中包括的是Silverlight 1.0,目前Silverlight 2.0还是beta阶段,也许等WES正式推出时就是Silverlight 2.0了,即使不是,也肯定会有QFE的。

       由于不确定Silverlight被放到哪里了,所以只好Search了一把。结果是,在Software-System-System Services-Application Support中包括了Silverlight组件。除了Silverlight之外,我们还需要添加几个组件:

       首先,是Design Templates下的Information Application;然后是,Software节点下的Test & Development下的Runtime Quick Start Helper Macro和Virtual PC 2007 Helper Macro两个组件。

       添加了这些组件之后,我们就可以进行依赖检查了,按F5,或者在Configuration菜单下的Check Dependencies项,就可以执行了。如下图:

       依赖检查之后,如果没有错误,我们可以直接进行编译,选择Configuration下的Build Target Image或者按F7,构建过程如下图:

       在编译完成之后,我们就可以在C:\Windows Embedded Images下找到已经编译好的文件。我们将其拷贝到准备好的虚拟硬盘中就可以了。如何构建VPC的开发环境,请参考我的Webcast 《XP Embedded开发初体验》中的介绍。

       在第一次启动时,系统会启动FBA(First boot agent)来完成一些设置,我们需要耐心等待一些时间:

       接下来,我们关闭WES开发环境的VPC,记得一定要选择Shut down。

       然后运行XPETraget的VPC,我们编译出来的Windows Embedded Standard Image其实和XP Professional非常类似,只是少了比较多的组件。不过我们仍然能够通过开始菜单来打开IE浏览器,然后再里边输入URL: www.silverlight.net 。对Silverlight比较熟悉的朋友一定会知道这个网站。而访问这个网站时,并没有提示我们需要安装Silverlight,这表明Silverlight已经被加到了Windows Embedded Standard的Image之中了。

        Windows Embedded Standard开发初体验(三)

        开始创建Silverlight的组件

       Silverlight在嵌入式领域发挥的作用绝对不仅仅只有增加Web的用户体验而已。很多嵌入式设备需要丰富多彩的用户交互界面,比如ATM、自动售货机、自助查询终端、老虎机(喔)……Windows Embedded Standard的主要应用领域恰好在这几个方面,所以Silverlight对于来说Windows Embedded Standard来说是如虎添翼。可能有朋友也会说,我们使用其他技术也可以实现与Silverlight类似的界面,这个肯定是没错。但是考虑到与后台数据库或Web Service的交互、部署成本、维护成本等问题,我相信Silverlight肯定会成为开发者今后开发中的首选。

       好了,先不说那么多,我们下一步要做的是将Silverlight变成WES的主界面,WES启动之后直接进入到Silverlight的应用之中。我们知道Silverlight是Host到IE等浏览器中运行的,在WES中也是这样,而Silverlight的部署有两种方式:第一种是将Silverlight文件部署到WES的Image中,随Image一起发布;另一种是让浏览器启动后访问Internet上的某个Silverlight站点。这两种方法有各自的应用场景,我们在这里不做过多分析。在这里,我们挑选比较难得一种:将Silverlight文件与WES的Image一起发布。

       第一步,我们要创建一个组件:这个组件应该是一个Shell组件,在系统启动后不进入我们传统意义上的“桌面”,而是直接启动这个组件中指定的应用程序。而且组件中还应该包括一些Silverlight相关的文件、一些注册表项,还有一些高级设置。稍后我们会看得到。

       我们还是先打开我们创建组件的工具:Component Designer。Windows Embedded Standard没有一个完整的IDE环境,所以做什么事情的时候要分别打开不同的工具。

       Component Designer的界面如下,我们要先选择File-New创建一个新的组件,然后保存这个组件,并为sld文件设置一个文件名称。

       接下来,我们要创建一个Repositories,这个相当于给组件住的房子。组件是保存在数据库中的,而Repositories在数据库中可以起到隔离组件的作用,而且也比较方便我们维护和升级组件。


       我们右键点击上图中Repositories节点,选择“Add Repository”来创建一个新的Repositories。首先为Repositories起个名字,写在右侧属性窗口的Name中,然后还要点击Source Path后边的Browse按钮。Source Path顾名思义,我们要为该Repositories的源文件找一个保存的位置,而我们一般也会把组件所需的文件都放到这个文件夹下。这个文件夹一般没有规定,但是最好放到C盘下,自己创建个文件夹就可以了。

       接下来,我们就该添加组件了,在上图的Components节点上右键单击,在右键菜单上选择“Add Component”。

       创建组件之后,第一件事是在右侧的属性窗口中修改名字。

       因为我们创建的这个组件是一个Shell组件,所以我们还要规定它在组件库中的原型组件,点击Prototype后边的Browse按钮。

       我们会看到下图的对话框,初始化可能会花费一些时间。选择Software | System | User Interface | Shells下的Shell Prototype Component组件,作为我们组件的原型组件。


       接下来还需要点击Advanced按钮,定义启动时的自定义动作:


       在上面的对话框中,点击Add按钮添加一个叫做“cmiShellPath”的扩展属性,类型为String,具体指为:%16426%\Internet Explorer\iexplore.exe -k "C:\SilverlightApplication2\Default.html"

       怎么样看着眼熟吧,没错就是启动一个IE浏览器的实例,-k表示全屏显示,而后边的文件路径不是一成不变的,要根据你将这个HTML文件放到哪里而决定。如果是在线的网站其实更简单一些,直接写网址就好了。

       然后为组件指定Repositories,点击“Repositories…”按钮,会弹出下面的对话框。好了,直接选择咱们前边创建的,就可以了。


       然后到了非常重要的一步,添加文件。这个问题也曾经困扰了我很久,我们明天再说。

        Windows Embedded Standard开发初体验(四)

       添加文件、依赖组件、注册表
       接下来我们就要进入创建组件最重要的一环了,添加文件。为什么说重要,因为这里有一个大坑,我在Windows Embedded Standard产品组施卫娟老师的指导下,花了两周的时间才勉强爬出来,可见该坑之深。

       在这里我们使用了一个现成的Demo,SilverlightTV作为我们的目标文件。SilverlightTV中包含很多文件和文件夹。我们要做的第一件事,就是将所有文件拷贝到一个文件夹中。这一点非常重要,因为考虑到效率问题,Windows Embedded Standard组件中的文件只能包括在同一个文件夹中。

       主要提示:如果将包含子目录的文件夹添加到组件中,组件设计器不会报错,而要等到这个组件加入到Target Designer时,才会报文件找不到的错误,并且在构建好的Image文件中,只会包括文件夹,而不会包括其中的文件。

       不过,新的问题就来了,如果我的文件结构是固定的,并且有相互的依赖关系,把所有文件都放到一个文件夹后,程序无法正常运行该怎么办呢?我们自然有办法,不过现在,还是赶紧将所有文件放在一个文件夹中吧,这个文件夹就是添加Repositories时指定的Source Path文件夹。不过千万记清文件原来所在的文件夹,否则下一步就麻烦了。


       做完这步之后,回到Component Designer中,在Files节点单击右键,在菜单中选择Add – Files in Folder,在稍后弹出的对话框中,选择我们放置源文件的文件夹。经过下面的处理过程之后,文件夹中所有的文件都被加入到组件中了


       不过问题是,所有的文件还被放置在同一个目录中,无法正常执行。这时,我们要通过一个比较繁琐的过程来解决这个问题——修改文件的目的文件夹。在右侧的文件列表中,选中某一个文件,双击,打开文件编辑对话框:


       我们打开的是一个wmv文件,我们只需要修改Destination中的目录结构,%24%是一个转义字符,表示C盘,我们不要去动它。根据我们文件的原始位置填写目的文件的所在目录就可以了。这个工作要花费一段时间,需要点耐心。

       接下来,我们要添加组件的Group Memberships,表示组件在组件目录树中所处的位置。我们在“Group Memberships”节点上右键选择“Add Group Membership”命令。在弹出的对话框中,选择SoftwareàSystemàUser InterfaceàShells,然后选择Shell即可。点击OK,关闭对话框。

       接下来为组件添加依赖关系。依赖关系表明该组件依赖于那些组件,当我们添加了该组件到Target Image中时,在依赖检查时,会将其所依赖的组件也添加到Image中。


       我们选择“Component or Group Dependency”,右键菜单中“Add”-“Component Dependency”,会弹出添加组件依赖对话框。

       我们在“Component dependency source”选择Database,即选择组件数据库中的组件。然后找到SoftwareàSystemàNetworking & Communicationsà ApplicationsàInternet Explorer – Hotfix Q321232,并且确认My Component下选择的是“Depends on the selected component”,然后点击Apply按钮,添加依赖关系。

       这时对话框不会关闭,所以我们还需要添加第二个依赖组件,就是大名鼎鼎的


       好了,到这里,我们的组件就基本完成了,哦,还忘了件事,添加注册表。不过请大家注意的是,并不是每个Silverlight组件都需要添加注册表项,是因为SilverlightTV这个组件中调用了ActiveX,IE中会有安全限制,所以我们才通过修改注册表的方式来规避这个问题。关于IE安全限制的问题,我们后边会专门说明,在这里大家只要了解如何为组件添加注册表项就可以了。


       在Component Designer中选择Registry Data,右键菜单中选择添加注册表项。我们可以点击Key name后边的Browse按钮,在注册表中定位要添加的项。我们要添加的项为:

       HKEY_CURRENT_USER\Software\Microsoft\Internet        Explorer\Main\FeatureControl\FEATURE_LOCALMACHINE_LOCKDOWN

       中的“iexplore.exe”项,值为DWORD,设置为0。

       大家一看就知道这个选项是与IE有关的,至于什么关系,我们先卖个关子,稍后再说。先点击OK,关闭注册表编辑对话框。

       好了,到这里我们支持Silverlight的Shell组件终于编辑完成了。好的,赶紧保存一下吧。不过,我们怎么在Target Designer里使用这个组件呢?

       这就要看下一节的了……

        Windows Embedded Standard开发初体验(五 )

        导入组件数据库
       将组建导入组件数据库的工作相对简单,只需要打开Component Database Manager,然后在Database属性页中,点击Import按钮。在弹出的Import SLD对话框中,首先选择SDL file,也就是我们刚才通过Component Designer编辑好的组件,然后点击Import按钮就可以了。

       因为导入的文件有些多,所以可能会延时几秒钟,等看到文件被成功导入的提示后,就可以关闭Component Database Manager,打开Target Designer来设计我们的操作系统了。

        创建Silverlight播放器

       在已经创建过一个Target Image之后,我们创建一个以Silverlight为Shell的Image看起来也不是那么复杂。还是让我们回到Target Designer中吧。首先创建一个新的Configuration。

       然后添加下面的这些组件:

       1, Software àTest & Deployment à Virtual PC 2004 Helper Macro

       2, SoftwareàSystemàSecurityàInfrastructureàWindows Logon (Standard)

       3, Software à System àUser Interface àShells à MyShell(这个就是你创建的Shell组件)

       4, Software à Test & Deployment à Runtime Quick Start Helper Macro


       我们打开Runtime Quick Start Helper Macro节点,选中Setting,然后在右边的属性窗口中,不选中Explorer shell。如果不去掉Explorer shell,它将在依赖检查时与我们创建的MyShell发生冲突。

       好了,在完成这一步后,按F5进行依赖检查。在依赖检查完成后,我们还需要设置一下显示器的分辨率,在中间区域被添加的组件中找到“S3 Trio64V+”显卡驱动组件,选中其Setting。在右边的设置窗口中,将Screen resolution选择为“1024 by 768 pixels”。


       好了,完成这一步之后,我们可以放心大胆地F7,编译Windows Embedded Standard的Image,然后将其部署到另外的VPC中去。

       在经历了FBA之后,我们会看到系统启动后,直接进入了Silverlight的显示界面:

       COOL吧?至少我觉得挺酷的。

        Windows Embedded Standard开发初体验(六)

        IE的安全限制
       好了,让我们回过头来说Silverlight TV的那个安全限制吧,还是要强调一下,并不是所有的Silverlight都会遇到这个问题,只是Silverlight TV调用了ActiveX组件,才会遇到这个问题。

       这个安全提示在我们平时使用IE时也经常会遇到,点一下也就没事了,毕竟为了安全着想嘛。不过如果将这个Silverlight组件作为Shell,每次启动之后,都是一个黑屏,需要人工点一下之后才能正常运行,用户体验似乎不够友好。

       于是,我们就需要更改一些IE的高级安全设置来解决这个问题了。如果熟悉IE的朋友,可能很快就知道问题出在哪里了,不过我是在同事的帮助下花了两天才找到问题根源的。问题的原因在于:


       对的,就是在IE的Internet Options对话框里,安全选项(Security)中“Allow active content to run in files on My computer”的选项默认是不选的。选上这个设置之后,运行Silverlight TV时就不会有安全提示出现了。

       IE的问题解决了,可是到了Windows Embedded Standard里又有问题了。IE的Advanced设置在WES IE组件的设置里是没有的。所以,我们只能通过修改注册表这一条路了。

       总之,经过了千难万险,我们知道了“Allow active content to run in files on My computer”对应:

       HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_LOCALMACHINE_LOCKDOWN

       中的“iexplore.exe”项,而且非常特别的是,该项为0,表示选中该选项;为1时,则表示未选中该项。大家开发时一定注意。

       总之,我们了解了这个设置对应的注册表项后,接下来就是在组件中添加相应的注册表项就可以了。这个工作在前边已经做过了。

        Windows Embedded Standard开发初体验(七)

        更改启动画面
       好了,到这里,我们的Windows Embedded Standard开发初体验活动接近尾声了,还有一个问题,有人觉得Windows Embedded Standard的启动界面与XP完全一样,让人感觉和用XP没有区别。于是,我们就需要修改一下启动画面来达到这个效果了:

       我必须承认,自己是个很没有美工天赋的人(要么怎么当了没前途的程序员呢J)。加上启动界面的要求过于苛刻,做成这样已经很不错了。需要说明的是,我是按照雷志刚BLOG中的《更换XPE开关机画面和欢迎界面》来实现的,链接如下:

       http://lzg-ad.blog.sohu.com/76781546.html

       首先,我们需要创建一个640x480的位图,位图颜色为16色(注意不是16位色)。我用了Windows Embedded Standard的标准界面。然后,将位图改名为Boot.bmp,保存到WES Image的Windows目录下。还需要修改Boot.ini文件:

[boot loader]
timeout=30
default=mulit(0)disk(0)rdisk(0)partition(1)\Windows
[operating systems]
default=mulit(0)disk(0)rdisk(0)partition(1)\Windows="Windows XP Professional"/fastdetect /bootlogo /noguiboot

       其实主要是修改粗体字部分,其余部分保持原状即可。

 

       好了,到这里,我们的Windows Embedded Standard初体验就完成了。必须承认,Silverlight为我们提供了强大的UI表现能力,而Windows Embedded Standard又是一个能够展现Silverlight强大功能的操作系统平台。这一点,对于嵌入式开发来说,是具有非常大的吸引力的。

       这里只是一个起点,至于大家可以使用Windows Embedded Standard开发出怎样的嵌入式产品来,我无法想象,但是却乐观其成。