让程序在Windows CE系统启动时自动运行

时间:2021-03-06 05:59:00
让程序在 Windows CE 系统启动时自动运行(方法一)
1. 假定 Windows CE.NET 目标工程目录为 E:/ SMDK2440 ,并且工程已经 Build 成功,
假定 Windows CE.NET 的应用程序为 MyApp.exe 并存放在本地硬盘 E 盘下;
2. 修改 MyWinCE 工程的 project.bib 文件,在 MODULES 添加如下内容:
MyApp.exe  E /MyApp.exe  NK  H 
3. 创建快捷方式文件 MyApp.lnk ,文件内容如下:
10#/Windows/MyApp.exe
MyApp.lnk 文件也放入 E:/ 目录下;
4. 修改 MyWinCE 工程的 project.bib 文件,在 FILES  添加如下内容:
MyApp.lnk E /MyApp.lnk  NK  H 
5. 修改 MyWinCE 工程的 project.dat 文件,添加如下内容: 
Directory("/Windows/Startup"):-File("MyApp.lnk","/Windows/MyApp.lnk") 
8. Platform Builder IDE :【 Build -> Make Image 】(记得千万不要 Build 或者 Rebuild
9. 成功后,得到的 NK.bin (或 NK.nb0 )就包含了应用程序 MyApp.exe MyApp.lnk ,当把相应的内核烧入开发板 MyApp 程序就会在系统启动时自动运行。
  关于系统程序的启动顺序(自启动方法二)
采用这种方法的前提是你要启动的应用程序已经编译进了 NK.nb0 或者 NK.bin 中了。具体方法及说明如下:
platform.reg 或者 common.reg ,在 [HKEY_LOCAL_MACHINE/init] 段添加如下类似内容 :    
  "LaunchXX"="<
你的程序 >"
  "DependXX"=hex:YY,ZZ,...
  其中 XX 是十进制的数字,表示 < 你的程序 > 的启动顺序标识; YY,ZZ Least   Significant 的十六进制数字,表示 < 你的程序 > 所依赖(先于 < 你的程序 > 运行)的程序的启动顺序标识。
来看两个系统的例子:
[HKEY_LOCAL_MACHINE/init]
; @CESYSGEN IF CE_MODULES_SHELL
        "Launch10"="shell.exe"
; @CESYSGEN ENDIF
IF IMGTINY !
; @CESYSGEN IF CE_MODULES_DEVICE
        "Launch20"="device.exe"
; @CESYSGEN ENDIF
; @CESYSGEN IF CE_MODULES_GWES
IF NOGUI !
        "Launch30"="gwes.exe"
        "Depend30"=hex:14,00
ENDIF
Launch10 Launch20 Launch30 表示了系统在启动时会先加载“ shell.exe , 然后再加载“ device.exe ”和 ”gwes.exe”, 而且可以看到 ”gwes.exe” 的启动还有依赖“ device.exe , 即只有在“ device.exe ”完全启动后“ gwes.exe ”才能启动。如果我们要在系统启动时候也启动自己的程序可以像如下设置:
  例如 :
  "Launch80"="MyApp.exe"
  "Depend80"=hex:1E,00
  语意为程序 MyApp.exe 的启动顺序标识是 80 ,它依赖标识为 30 (即 001E )的程序。
  如果 < 你的程序 > 不依赖其他程序,那么不需要添加 "DependXX"=hex:YY,zz,... 指示;
  如果 < 你的程序 > 依赖多个程序,那么在 "DependXX" 指示中指明;
  eg.
  "Launch80"="MyApp.exe"
  "Depend80"=hex:0A,00,1E,00
  语意为 MyApp.exe 程序的启动依赖标识为 10 30 的程序。注意 Launch 后面的数值不能和系统默认的某个程序的值一样,不然在编译的时候就会报错。
修改完后只要 PlatformBuilder   IDE->Build->MakeImage ,生成新的 NK.bin 就可以了,不用重新编译。
去掉系统启动 explorer
Windows CE.NET 的桌面确实漂亮,但是如果我们的嵌入式系统使用微软的桌面,总让我感觉不伦不类。因此,要想个办法,让我们的程序开机启动,把微软的那个桌面给替换掉。其中使用 startup 的快捷方式再加上隐藏任务栏的方法,效果非常的好,但是每次启动的时候,总是微软的桌面先出来,再启动我们的程序,感觉还是不爽。
有一种方法如下:
1) 首先新建工程,把你的应用程序放到内核里面去(前面介绍了如何做);
2) 编译平台;
3) 修改 E:/SMDK2440/RelDir/SAMSUNG_SMDK2440_ARMV4IRelease/shell.reg 的文件 
在文件中有这样一行:
[HKEY_LOCAL_MACHINE/init]
"Launch50"="explorer.exe"
"Depend50"=hex:14,00, 1e,00
把这个 explorer.exe 改成你的应用程序(比如: MyApp.exe )就可以了;
4) Platform Builder IDE :【 Build -> Make Image 】(记得千万不要 Build 或者 Rebuild )否则就前功尽弃了。
5) 成功后,得到的 NK.bin (或 NK.nb0 )就包含了应用程序 MyApp.exe MyApp.lnk ,当把相应的内核烧入开发板 MyApp 程序就会在系统启动时自动运行。
 
至此 , 随心所欲的让自己的程序在 Windows CE 系统启动时自动运行了。
  原理说明:  
1.将自定义的文件打包进NK.bin中的方法有两种 
  一种是编辑 project.bib 文件。
FILES   Section 描述文件的名称,源文件的路径,文件在目标系统中的属性。在上面,
  MyApp.exe   $(_FLATRELEASEDIR)/MyApp.exe   NK   H  
表示将你所建工程如: E:/SMDK2440/RelDir/SAMSUNG_SMDK2440_ARMV4IRelease 目录下的文件 MyApp.exe 文件打包进 NK.bin ,并且此文件将处在 Kernel 内存区,文件属性类型为隐藏。 
第二种方法是添加 User   Feature
PlatformBuilder   IDE->FeatureView-> "MyWinCE   Features" Right   Click 鼠标 ->Insert   User   Feature-> 指向想打包的文件。
无论采用哪种打包方法,在启动的 Windows   CE 系统中,文件都在 /Windows 目录下。下一步就是根据需要重新组织文件系统的目录结构。
2.组织文件系统的目录结构的途径在于修改project.dat文件
添加文件目录结构的描述。描述的语法如下:
root:-Directory("< 目录名 >")   表示在 root 目录( / )下创建目录
Directory("/< 目录名 >"):-Directory("< 子目录名 >")   表示在指定目录下创建子目录
Directory("/("< 目录名 >/< 子目录名 >"):-File("< 文件名 >.< 扩展名 >","/Windows/< 文件名 >.< 扩展名 >")   表示在指定目录下创建 /Windows 目录下文件的拷贝,显示名称是 < 文件名 >.< 扩展名 >
3.应用程序并不一定需要打包进NK.bin
  假定程序在硬盘的某个位置,如 / 硬盘 /MyApp/MyApp.exe ,那么只需创建快捷方式文件,链接指向 / 硬盘 /MyApp/MyApp.exe 就是了。
  整个过程简单来说就是,想清楚应用程序将会出现在哪个目录下,创建正确的快捷方式文件,修改目标系统目录组织配置,最后将应用程序和相应的快捷方式文件打包进 NK.bin