Wince下定制开机自启动程序
来源:互联网 发布:软件测试考核指标 编辑:程序博客网 时间:2024/05/21 09:35
网上相关的资料还真是不少. 因公司的项目需要,我做了个简单的程序则试该功能. 发现网上的很多方法发现是行不通的, 估计最初应该是可以用的, 然后大家都是互相转载, 转来转去有些东西漏了或转错了,因为很少有人真正去测试过,看到就直接转. 我在这里根据自己的实际测试,整理出整个过程,并做了解释
假设应用程序为:MyApp.exe
方法一
主要思想:将应用程序及其快捷方式也添加到映像里,再将快捷方式添加到StartUp目录下,这样当系统运行后应用程序就能自动运行。这种方法不能覆盖wince的桌面, 只是开机的时候加载一个应用程序启动.
步骤:
1 准备一个工程文件是可以编译成功的。 并且内核映像是可以运行的.
2 创建快捷方式文件MyApp.lnk,文件内容如下: 10#”/Windows/MyApp.exe”(注意引号一定要) 其中10表示#后所有字符的个数,包括引号, 要根据自己的应用程序的名字修改. (试过这个数字即使不是#后的字符的个数也可以正常启动, 这个我就搞不懂了)把该文件和复制到xxx_Relase所在的目录(nk.bin所在目录).
3在pb中修改project.bib文件,在FILES Section添加(FILES区哉可以包含不是就地执行的可执行文件):
MyApp.exe $(_FLATRELEASEDIR)/MyApp.exe NK HMyApp.lnk $(_FLATRELEASEDIR)/MyApp.lnk NK H
注:$(_FLATRELEASEDIR)表示xxx_Relase文件夹;NK后面的H表明加入到nk.bin中的文件为隐藏属性
4 把快捷方式添加到StartUp目录下,具体为:修改工程的project.dat文件,添加如下内容:
Directory("/Windows/Startup"):-File("MyApp.lnk","/Windows/MyApp.lnk")
由于wince ROM 映像默认将所有文件放到windows目录下, 某些文件在系统引导时必须被移动到特定的位置, .dat文件可以实现移动的功能. 比如上面就是把位于windows下的myApp.lnk移动到windows/startup下面. Startup目录决定了程序可以自启动.
5 编译工程. 编译完成,会有错误提示未在你的磁盘上找到MyApp.exe(因为我们在编译的时候选择了clean before building,原来放在xxx_Relase目录下的文件都被clean了) . 这时把MyApp.exe和MyApp.lnk文件重新拷贝到xxx_Relase文件夹下,然后MakeImage一下. 这样就把应用程序写进了内核(会在windows目录下). 把生成的NK.bin或nk.nb0烧写到flash里,这样就可以看到你的应用程序MyApp.exe自启动了.
到这里可能有人会问, 既然MyApp.exe和MyApp.lnk编译的时候会被clean掉,第二步不就可以不用先复制,而到第五步时再复制过来? 这个问题我也想过,但实际测试发现这样的话并没有把MyApp.exe和MyApp.ln两个文件写进内核(系统启动后,windows下找不到). Bib文件和dat文件都是在make image阶段在用到的,没理由会出现这个问题. 这个问题一直想不通,希望高手解答.
方法二
将应用程序添加到映像里,然后用你的应用程序直接替换Wince的桌面程序,这种方法其实就是自己的应用程序做为wince的桌面shell
步骤:
1. 首先执行方法一的1~3步把应用程序烧进内核.
2. 进入build os 菜单, 选择build and sysgen(clean before buiding要打勾,这里不打勾有时会出现编译的内核不能运行),编译完成,会有错误提示你未在你的磁盘上找不到MyApp.exe(因为我们在编译的时候选择了clean before building,原来放在xxx_Relase目录下的文件都被clean了) . 这时把MyApp.exe和MyApp.lnk文件重新拷贝到xxx_Relase文件夹下.
然后修改shell.reg(若在pb里找不到,可以到xxx_Relase文件夹下找):[HKEY_LOCAL_MACHINE/init]"Launch50"="explorer.exe""Depend50"=hex:14,00, 1e,00把这个explorer.exe改成你的应用程序(比如:MyApp.exe)。当wince系统启动时, 它会顺序执行launchxx, xx是一个十进制数, dependxx指出在当前应用程序运行之前launch20(十六进制是14),lanuch30(十六进制是1e)必须先运行. 打开common.reg可以看到. Lanuch20对应的是device.exe, launch30对应的是gwes.exe. 我们自己的shell应该在这两个进程加载完成之后才能正常运行. 另外,wince帮助文档里有一段话: This function must be called by all applications that the kernel starts at startup through the HKEY_LOCAL_MACHINE/Init registry key.
看来我们的MyApp.exe源程序里应该加上signalStarted函数了. 对于mfc的程序我们可以在initinstance的return 以前. 加上这行代码SignalStarted(_wtol(GetCommandLine())); 其实如果一个应用程序要从init里加载,那么肯定有一个unicode字符串作为命令行参数,这个参数被转化为整型后传给signalStarted函数. 通过这种方式通知操作系统它本身运行完毕. 建议任何通过init启动的应用程序都应该加上signalStarted函数.
3. MakeImage一下, 把生成的NK.bin烧写到flash里,这样就可以看到你的应用程序MyApp.exe自启动了. 而且wince的桌面程序都不会启动了,你的程序就是wince的shell,但有个问题,就是可能出现死机的情况, 估计是mfc的程序会依赖explorer.exe,所以会出现死机的情况, 有两种方法可以解决, 一是不用MFC,二就是不去掉explorer.exe,而是修改它的源码,去掉任务栏等部分.具体可参考下面这篇文章:
http://www.cnblogs.com/we-hjb/archive/2008/12/28/1364070.html
方法三
主要思想:将应用程序添加到映像里,然后修改注册表,让应用程序自启动。这回不替换wince的桌面程序,而是让wince像加载桌面一样加载你的应用程序,效果跟方法一是一样的。
在shell.reg文件中[HKEY_LOCAL_MACHINE/init]之下添加如下语句:"Launch80"="MyApp.exe" "Depend80"=hex:1E,00跟方法2的区别是没有换掉explore.exe.
当然,前面三个方法的前提肯定是你的这个MyApp.exe程序,在当前的PB工程编译的内核里有可以正常运行的. 这一句看起来是废话,其实很重要. 我这在调试的时候,一度程序不能启动, 我一直认为是注册表或bib文件出错了, 调了很久都不行. 最后才发现,我这个应用程序是在之前的SDK下编译的, 在当前的系统一根本不能运行. 于是我又在一个确定可用的工程下重新编译了一个新的SDK, 问题解决.
- Wince下定制开机自启动程序
- Wince下定制开机自启动程序
- Wince下定制开机自启动程序
- 转载几个关于"Wince下定制开机自启动程序"的文章
- WinCE程序开机自启动
- WINCE开机程序定制
- WINCE开机程序定制
- Wince 开机画面/自启动程序
- WinCE下应用程序开机自启动
- Wince 开机自启动
- WinCE应用程序开机自启动
- WinCE开机自启动应用程序
- WinCE 开机自启动应用软件
- wince 6.0 开机自启动
- centos下设置程序开机自启动
- Android下开机自启动C程序
- Linux下程序开机自启动
- Linux下程序开机自启动方法
- 又是指针惹的祸
- web开发者必备的15个 Firefox插件
- FTPS和SFTP的区别
- Linux for s3c2440(3.4.1我已经封好包的)
- 在SQL 2005中用T-SQL插入中文数据时出现的问号或乱码的解决方案
- Wince下定制开机自启动程序
- XDoclet开发包下载网址
- Symbian程序隐藏(Program hide)
- Microsoft Office SharePoint Server 2007的文件目录结构
- Linux下看代码的好工具Kscope
- Vmware tools Install在linux的安装
- [S60]使用日志类RFileLogger输出调试信息
- 悟透JavaScript 原著:李战(leadzen)
- Writing Windows CE Display Drivers