按照《Windows CE实用开发技术》一书的9.9节,开始WinCE shell定制的学习。
问题1:
建立New Platform的时候,编译通过,但是运行模拟器仿真时,模拟器居然黑屏了……换了以前的程序,明明下午还好用的模拟器,居然都黑了脸!郁闷了一小个晚上~~实验室该关门,无奈等到第二天再尝试下,居然又奇迹般的恢复了!
原因:
不知道……
难道是我的电脑自我修复了?!#@¥%—+……
问题2:
模拟器算是可用了,开始建立IESHELL的测试工程。不过按照书上的陈诉,编译出错。提示的错误是找不到一些头文件(fatal error C1083: Cannot open include file: 'exdisp.h': No such file or directory)。
尝试把缺少的文件复制到工程文件夹下,但是又出现了新的错误,就是这个缺少文件中包含的文件又找不到了……
查看的编译的过程,估计是路径设置的问题,才导致了这些文件的缺失。可是哪个文件是记录编译路径的啊?晕了~~
无奈之下查看了IESIMPLE目录下的文件,发现了obj文件夹,会不会也要把这个文件夹中的内容也复制过去呢?(书上只说要复制.cpp.h.rc文件)。试试吧~~居然成功了……我运气还真不错(*^__^*) 嘻嘻……
原因:
回头查查obj文件夹都是干嘛的去!!!
查到的资料如下:
bin是放最终代码的目录、obj就放中间代码的目录
obj目录是用来保存每个模块的编译结果,在.NET中,编译是分模块进行的,编译整个完成后会合并为一个.DLL或.EXE保存到bin目录下。因为每次编译时默认都是采用增量编译,即只重新编译改变了的模块,obj保存每个模块的编译结果,用来加快编译速度。是否采用增量编译,可以通过:项目属性—>配置属性—>高级—>增量编译来设置。
修改编译的路径方法:
tools-->options -->Directories -->Include files
tools-->options -->Directories -->library files
问题3:
继续修改,设置IEShell为目标设备的Shell,编译,又出现了fatal error C1083: Cannot open include file: 'exdisp.h': No such file or directory这样的错误!貌似和obj文件夹没有关系了……为什么呢?看来路径的选择和这个obj文件夹没有直接的关系
但是发现,其实是在PARAMETER目录下加了个文件(还不可识别),所以书上说的位置一定有问题。无奈我对此一窍不通啊,都不知道这些语句是干嘛的,查查网上大侠的总结。见WINCE SOURCES文件详解,大致推断出这两句话应该是INCLUDES包含的内容吧。
加上,编译……
于是,问题4出现了……
问题4:
加入INCLUDES=$(INCLUDES);$(_WINCEROOT)/PUBLIC/IE/SDK/INC;$(_WINCEROOT)/PUBLIC/COMMON/OAK/INC;语句后,编译报错:
cl : Command line error D2004 : '/I' requires an argument
后来参照http://blog.youkuaiyun.com/Ricky_hu/archive/2009/01/10/3747621.aspx的方法做了修改,总结如下:
INCLUDES= /
$(_WINCEROOT)/PUBLIC/IE/SDK/INC; /
$(_WINCEROOT)/PUBLIC/COMMON/OAK/INC; /
或者INCLUDES=$(_WINCEROOT)/PUBLIC/IE/SDK/INC;$(_WINCEROOT)/PUBLIC/COMMON/OAK/INC;
或者INCLUDES=$(_WINCEROOT)/PUBLIC/IE/SDK/INC
INCLUDES=$(INCLUDES);$(_WINCEROOT)/PUBLIC/COMMON/OAK/INC
这几种方式都可以。这里注意INCLUDES的格式:
分行写的一定要加上“/”并且带“;”(第一种形式)
第二种和第三种格式实质上相同$(INCLUDES)其实就是上边的$(_WINCEROOT)/PUBLIC/IE/SDK/INC
编译,终于通过了!!!O(∩_∩)O~
问题5:
关于obj文件夹对包含路径的影响问题。
前面问题2中提到过,加入了从IE文件中拷贝来的obj文件夹后,编译通过了。但是做了些修改,又不好用的情况。在做问题4的实验的时候,也出现了类似的情况。我猜想是拷贝来的obj文件中(放中间代码的目录)恰好包含了正确的编译路径方面的信息,而编译时是先查看obj文件夹中的这些东西,如果有,就不再重新编译。所以即使源文件的路径不正确,但是编译器先看了以前编译的信息,没有对源文件(错误的)再编译,所以恰好通过了。
不知道猜想对不对,有机会请明白人验证吧~~~
问题6:
继续……
说是在IESHELL.EXE入口下添加下列注册表入口
FILES
BKG.jpg $(PBWORKSPACEROOT)/IESHELL/ShellFiles/BKG.jpg NK U
Button0.jpg $(PBWORKSPACEROOT)/IESHELL/ShellFiles/Button0.jpg NK U
Button1.jpg $(PBWORKSPACEROOT)/IESHELL/ShellFiles/Button1.jpg NK U
Button2.jpg $(PBWORKSPACEROOT)/IESHELL/ShellFiles/Button2.jpg NK U
Button3.jpg $(PBWORKSPACEROOT)/IESHELL/ShellFiles/Button3.jpg NK U
Button4.jpg $(PBWORKSPACEROOT)/IESHELL/ShellFiles/Button4.jpg NK U
Button5.jpg $(PBWORKSPACEROOT)/IESHELL/ShellFiles/Button5.jpg NK U
Button6.jpg $(PBWORKSPACEROOT)/IESHELL/ShellFiles/Button6.jpg NK U
Button7.jpg $(PBWORKSPACEROOT)/IESHELL/ShellFiles/Button7.jpg NK U
Button8.jpg $(PBWORKSPACEROOT)/IESHELL/ShellFiles/Button8.jpg NK U
Button9.jpg $(PBWORKSPACEROOT)/IESHELL/ShellFiles/Button9.jpg NK U
ButtonPOUND.jpg $(PBWORKSPACEROOT)/IESHELL/ShellFiles/ButtonPOUND.jpg NK U
ButtonSTAR.jpg $(PBWORKSPACEROOT)/IESHELL/ShellFiles/ButtonSTAR.jpg NK U
default.htm $(PBWORKSPACEROOT)/IESHELL/ShellFiles/default.htm NK U
homelogo.gif $(PBWORKSPACEROOT)/IESHELL/ShellFiles/homelogo.gif NK U
Shell.htm $(PBWORKSPACEROOT)/IESHELL/ShellFiles/Shell.htm NK U
但是填写完后,运行,发现原来的shell没有显示,但是新的shell是一片空白。
估计修改有误吧。又查了网上关于注册表的内容,发现其实这些内容并不是写在.reg文件中的……哎,书中的描述实在是有问题,再加上自己一点都不懂~~误会误会了……原来是要填写在.bib文件中的。
注意“BKG.jpg $(PBWORKSPACEROOT)/IESHELL/ShellFiles/BKG.jpg NK U”中间一定要有空格,否则编译会出错。
编译,终于大功告成了!!!
定制自己的shell界面
上面的shell定制式参照《Windows CE实用开发技术》一书,是基于IEshell的定制过程。只是当做学习shell定制的入门,并不符合自己的实际需要。又从网上查阅了相关的介绍,开始了自己的shell界面定制学习~
问题1:
定制的过程中发现,做了某些修改之后,尽管重新Sysgen了系统,但是显示的内容并没有改变。比如说修改桌面上的“Microsoft Windows CE……”这行字,去掉了相关的语句,试了好几次都没有变化。后来Sysgen and Build了下,才好用。
总结:
需要查查用pb编译操作系统这几个操作具体都是干嘛用的。
Sysgen
Build and Sysgen
Build and Sysgen Current BSP
Make Run-Time Image
在WinCE5.0中,在"Build OS”菜单中,我们会看到不同的编译选项:
"Sysgen","Build and Sysgen"和"Build and Sysgen current BSP"
Sysgen:不用多说,当你在"Catalog"中添加或删除了新的item的时候,就用这个吧。
Build and Sysgen:当你更新了public目录下的源代码的时候,你就需要用这个了。一般比如在打patch以后,可能就需要进行Build and Sysgen了。
Build and Sysgen current BSP:当你只改变了你的BSP部分的代码,就可以用这个选项。据说,当你改变了platform目录下的代码,也可以用这个,具体没有试过。
在WinCE6.0中,在VS2005的"Build"菜单中,有一个“Advanced Build Commands”,其中有很多编译选项:
"Sysgen":相当于执行命令"blddemo -q”,一般第一次编译或者是改变了"Catalog"中的item的时候,就用这个了。
"Clean Sysgen":相当于执行命令"blddemo clean -q",按照文档上的说明,当修改了 %_WINCEROOT%PublicCEBASEOAKMiscCesysgen.bat的时候,或者改变了以SYSGEN,BSP为前缀的环境变量的时候,需要使用这个来编译。
在此我说一下我个人的经验,一般只有第一次创建完工程的时候,我会用"Sysgen"命令,以后只要是改变了SYSGEN为前缀的环境变量的设置或者是"Catalog"中的item,我就会使用"Clean Sysgen",而改变了以BSP为前缀的环境变量要看具体情况,也不一定就要用"Clean Sysgen"。继续...
"Build and Sysgen":相当于执行命令"blddemo",当改变了public目录下的代码,比如你打了WinCE的patch,你就需要用这个了。
"Rebuild and Sysgen Clean":相当于执行命令"blddemo clean cleanplat -c",相当于清除上一次编译生成的文件,然后重新编译public目录和你的工程。
"Build and Sysgen Current BSP":相当于执行命令"blddemo -qbsp",仅编译platform目录下的代码。所以当改变了platform目录下的代码的时候或者说改变了BSP的代码的时候,可以用这个来编译。
"Rebuild and Clean Sysgen Current BSP":相当于执行命令"blddemo -qbsp -c",相当于完全重新编译platform目录下要编译的代码。
原文网址:http://www.fengfly.com/plus/view-68139-1.html
问题2:
想修改桌面背景图片,按照下面方法试了下,但是发现Sysgen后,修改的内容又变回来了……
windowsce.bmp $(_FLATRELEASEDIR)/windowsce_qvgap.bmp NK S
改为:
windowsce.bmp $(_FLATRELEASEDIR)/Wallpaper_800x600.bmp NK S
无奈之下采用了另外一种办法,就是把自己要替换的桌面图片重新命名为windowsce_qvgap.bmp,替换原来的图片,效果是一样的~~
问题3:
修改桌面上程序的快捷方式。
目录在D:/WINCE500/PBWorkspaces/Emulator/WINCE500/Emulator_x86/cesysgen/oak/files
这个路径下 保存着众多的bib文件 在这里你可以屏蔽掉对应的bib中的lnk文件对应的脚本,然后只仅仅makeimg一下即可。
例如:WordViewor则在viewers.bib文件中的
docviewer.lnk $(_FLATRELEASEDIR)/Docviewer.lnk NK
前加上“;”即可
同样的道理My Documents在wceappsfe.bib文件中,位置为
mydocs.lnk $(_FLATRELEASEDIR)/mydocs.lnk NK SH
前面加上“;”即可。
问题4:
针对sky2440定制shell,进行了上述修改后发现,还有一些快捷方式没有去掉。主要是开发板上提供的应用程序。
在D:/WINCE500/PBWorkspaces/MyWork/RelDir/smdk2440_ARMV4I_Release目录下找到platform.bib文件,将其中的.lnk文件注释掉
usbcnect.lnk $(_FLATRELEASEDIR)/usbcnect.lnk NK U
EmbedSky.lnk $(_FLATRELEASEDIR)/EmbedSky.lnk NK U
; SerialPort.lnk $(_FLATRELEASEDIR)/SerialPort.lnk NK U
; SKY2440_LCD_change.lnk $(_FLATRELEASEDIR)/SKY2440_LCD_change.lnk NK U
这样注释了的结果是,快捷方式没有打包到操作系统中,但是应用程序还是在原来的位置,在windows目录下就可以找到。
问题5:
想修改有些快捷方式的名字,拿SKY2440_LCD_change为例。将这个快捷方式的名称重命名为LCD_change:
1、将D:/WINCE500/PLATFORM/SMDK2440/FILES目录(这个是开发板BSP包的目录,和上面不同)的platform.bib文件中
SKY2440_LCD_change.lnk $(_FLATRELEASEDIR)/SKY2440_LCD_change.lnk NK U
修改为
LCD_change.lnk $(_FLATRELEASEDIR)/LCD_change.lnk NK U
2、SKY2440_LCD_change.lnk文件名,修改为LCD_change.lnk,文件里面的内容不变
3、将D:/WINCE500/PLATFORM/SMDK2440/FILES目录下的platform.dat文件内容修改如下:
Directory("/windows/桌面"):-File("LCD_change.lnk","/windows/LCD_change.lnk")
大概是因为修改了bsp包的内容,所以这里需要Sysgen重新编译操作系统(如果只是Make Image会出错),完成~
查到有人说(无论是Windows CE还是Windows Mobile环境,编译各个Driver使用的build.dat使用的是同一个文件,如果发现自己编译的目录下生成了新的build.dat文件,说明现在的dirs文件存在问题,现在的目录没有被加入到dirs中,需要的头文件路径等信息也没有被正常加载)估计是包含文件的路径确实有问题。
重新检查了一遍操作的各个步骤,在sources文件中发现了问题:越看$(_WINCEROOT)/PUBLIC/IE/SDK/INC;$(_WINCEROOT)/PUBLIC/COMMON/OAK/INC;这两条语句越不对~书上说把这两句加到sources文件的末尾,也就是这样
FILE_VIEW_PARAMETER_FOLDER= /
IEShell.bib /
IEShell.reg /
IEShell.dat /
IEShell.db /
ProjSysgen.bat /
$(_WINCEROOT)/PUBLIC/IE/SDK/INC;$(_WINCEROOT)/PUBLIC/COMMON/OAK/INC;
在编译的记录中发现了Build.dat有关,这个文件是不是记录了编译的路径呢?