最近在做基于Wince6.0的应用程序的开发,应用程序基本开发完毕,需要把程序烧写进内核。经过一段时间折腾,算是完成了任务,先总结如下:
wince6.0的应用程序烧写进内核方法与wince5.0修改的地方基本一致。这里需要说明,在\WINCE600\OSDesigns\S3C6410_DEM0\RelDir\Samsung_SMDK6410_Release里的操作前提是已经编译生成NK.bin。此时再修改增加新的应用程序,只需要Make Run-Time Image既可以把应用程序写进内核。不能sysgen,否则前功尽弃。
方法:
注:以下所有操作均在该路径下:\WINCE600\OSDesigns\S3C6410_DEMO\S3C6410_DEMO\RelDir\Samsung_SMDK6410_Release
1、将应用程序“ HelloWorld.exe ” 拷贝到该路径下:\WINCE600\OSDesigns\S3C6410_DEMO\S3C6410_DEMO\RelDir\Samsung_SMDK6410_Release
2、新建一个名为HelloWorld.txt 的文件里面填入以下内容:
10#\Windows\HelloWorld.exe
之后将该文件重命名为: HelloWorld.lnk
3、修改project.bib 文件,在FILE 下添加
HelloWorld .exe $(_FLATRELEASEDIR)\ HelloWorld .exe NK H
HelloWorld .lnk $(_FLATRELEASEDIR)\ HelloWorld .lnk NK H
4、修改project.dat 文件里添加
Directory("\Windows\Startup"):-File("HelloWorld.lnk","\Windows\HelloWorld.lnk")
5、修改shell.reg 在
[HKEY_LOCAL_MACHINE\init]
"Launch50"="explorer.exe"
"Depend50"=hex:14,00, 1e,00
后面添加
"Launch80"="HelloWorld.exe"
"Depend80"=hex:1e,00
6、以上操作, 即可在系统启动后, 自动运行“ HelloWorld.exe ” 了。
如果想不启动wince 桌面而直接运行应用程序的话。需要修改shell.reg 文件,将
[HKEY_LOCAL_MACHINE\init]
"Launch50"="explorer.exe"
"Depend50"=hex:14,00, 1e,00
修改为:
[HKEY_LOCAL_MACHINE\init]
"Launch80"="HelloWorld.exe"
"Depend50"=hex:14,00, 1e,00
经过以上步骤,打开VS2005,打开自己的wince6.0工程,make run-time image 即可生成 NK.bin。
以上步骤是借鉴,需要说明步骤5,修改注册表,
由于在应用程序中使用了多个对话框,并且利用 create()创建了多个子对话框,利用setwindowpos()设置对话框显示,在系统启动的时候出现问题:如果把程序设置成开机自启动,会出现debug assertion failed winocc.cpp 的错误;但是把程序放进内核,等待系统启动完毕,打开应用程序,发现没有问题。
经过分析开机自启动自己应用程序,可能是系统另一个程序没有启动,自己应用程序要依赖那个程序才能运行,所以导致错误。至今不太清楚需要哪个程序启动,但知道启动wince的ie界面后再启动程序 就没有问题。
所以修改注册表为:
修改shell.reg 在
[HKEY_LOCAL_MACHINE\init]
"Launch50"="explorer.exe"
"Depend50"=hex:14,00, 1e,00
后面添加
"Launch80"="HelloWorld.exe"
"Depend80"=hex:32,00
这样就可以开机自启动程序,没有问题。说明:"launch80" 中80代表系统启动应用程序的顺序,由小到大依次启动,越大越后启动,数值0~99。关键是“Depend80“他说明80程序启动需要后面的32程序,32是十六进制,十进制为50,所以说明80对应的helloworld.exe的启动需要50对应的程序explorer.exe启动完,才能启动。
原文如下:
[HKEY_LOCAL_MACHINE\init]
"Launch20"="device.exe"
"Launch30"="gwes.exe"
"Depend30"=hex:14,00
内核启动时执行device.exe和gwes.exe 。“LaunchXX”中的XX为序列数,内核依据这个序列数按由小到大的顺序来分别执行所有子键列出的应用程序。“DependXX”为 “LaunchXX”的附属键,此键键值表示“LaunchXX”指定的程序需要依靠哪个程序才能启动。
例如“Depend30”=hex:14,00 。十六进制数14等于十进制数20,即:gwes.exe需要device.exe先启动后才能启动。