Wince下定制开机自启动程序

近日在开发过程中遇到WinCE应用程序开机自动运行的问题,在网上找了找,发现大概有以下三种方法: 

1、将应用程序和应用程序快捷方式添加到映像里,再将快捷方式添加到StartUp目录下,这样当系统运行后应用程序就能自动运行; 

2、直接替换Wince的SHELL,即修改注册表: 

[HKEY_LOCAL_MACHINE\init]
"Launch50"="explorer.exe" 

"Depend50"=hex:14,00, 1e,00
把这个explorer.exe改成你的应用程序(比如:MyApp.exe); 

3、 应用程序太大没加入到映像,只是编译好内核后再部署到ResidentFlash目录,修改注册表:
[HKEY_LOCAL_MACHINE\init]
"Launch70"="ResidentFlash\\surveymain\\SurveyMain.exe"
"Depend70"=hex:14,00, 1e,00

设置过程中有几个值是不能使用的,如下:

    Launch20:device.exe;

    Launch30:gwes.exe;

    Launch60:services.exe;

    这都是系统必要的程序,不能替换。


方法一:主要思想:将应用程序及其快捷方式也添加到映像里,再将快捷方式添加到StartUp目录下,这样当系统运行后应用程序就能自动运行。这种方法不能覆盖wince的桌面, 只是开机的时候加载一个应用程序启动.

步骤:

1先保证原工程文件是可以编译成功的。 并且内核映像是可以运行的.

2创建快捷方式文件,文件内容如下: 42#"\ResidentFlash\surveymain\SurveyMain.exe"(注意引号一定要) 其中数字42表示#后所有字符的个数,包括引号, 要根据自己的应用程序的名字修改. (试过这个数字即使不是#后的字符的个数也可以正常启动, 这个我就搞不懂了)把该文件复制到xxx_Relase所在的目录。

3在pb中修改文件,在FILES Section添加(FILES区哉可以包含不是就地执行的可执行文件):SurveyMain.lnk  $(_FLATRELEASEDIR)\SurveyMain.lnk  NK   (注:$(_FLATRELEASEDIR)表示xxx_Relase文件夹)

4 把快捷方式添加到StartUp目录下,具体为:修改工程的文件,添加如下内容: Directory("\Windows\Startup"):-File("","\Windows\") 由于wince ROM 映像默认将所有文件放到windows目录下, 某些文件在系统引导时必须被移动到特定的位置, .dat文件可以实现移动的功能. 比如上面就是把位于windows下的移动到windows\startup下面. Startup目录决定了程序可以自启动.

5进入build os 菜单, 选择build and sysgen(clean before buiding要打勾),编译完成,会有错误提示你未在你的磁盘上找到(因为我们在编译的时候选择了clean before building,原来放在xxx_Relase目录下的文件都被clean了) . 这时把和文件重新拷贝到xxx_Relase文件夹下,然后MakeImage一下. 这样就把应用程序写进了内核(会在windows目录下). 把生成的或烧写到flash里,这样就可以看到你的应用程序自启动了. 到这里可能有人会问, 既然和编译的时候会被clean掉,第二步不就可以不用先复制,而到第五步时再复制过来? 这个问题我也想过,但实际测试发现这样的话并没有把和两个文件写进内核(系统启动后,windows下找不到). Bib文件和dat文件都是在make image阶段在用到的,没理由会出现这个问题. 这个问题一直想不通,希望高手解答.

方法二:将应用程序添加到映像里,然后用你的应用程序直接替换Wince的桌面程序,这种方法其实就是自己的应用程序做为wince的shell

步骤:

1. 首先执行方法一的1~3步把应用程序烧进内核.

2. 进入build os 菜单, 选择build and sysgen(clean before buiding要打勾,这里不打勾有时会出现编译的内核不能运行),编译完成,会有错误提示你未在你的磁盘上找到(因为我们在编译的时候选择了clean before building,原来放在xxx_Relase目录下的文件都被clean了) . 这时把和文件重新拷贝到xxx_Relase文件夹下, 然后修改(若在pb里找不到,可以到xxx_Relase文件夹下找):[HKEY_LOCAL_MACHINE\init]"Launch50"="""Depend50"=hex:14,00, 1e,00把这个改成你的应用程序(比如:)。当wince系统启动时, 它会顺序执行launchxx, xx是一个十进制数, dependxx指出在当前应用程序运行之前launch20(十六进制是14),lanuch30(十六进制是1e)必须先运行. 打开可以看到. Lanuch20对应的是, launch30对应的是. 我们自己的shell应该在这两个进程加载完成之后才能正常运行. 另外,wince帮助文档里有一段话: This function must be called by all applications that the kernel starts at startup through the HKEY_LOCAL_MACHINE\Init registry key.

看来我们的源程序里应该加上signalStarted函数了. 对于mfc的程序我们可以在initinstance的return 以前. 加上这行代码SignalStarted(_wtol(GetCommandLine())); 其实如果一个应用程序要从init里加载,那么肯定有一个unicode字符串作为命令行参数,这个参数被转化为整型后传给signalStarted函数. 通过这种方式通知操作系统它本身运行完毕. 建议任何通过init启动的应用程序都应该加上signalStarted函数.

3. MakeImage一下, 把生成的烧写到flash里,这样就可以看到你的应用程序自启动了.  而且wince的桌面程序都不会启动了,你的程序就是wince的shell,但有个问题,就是当你把应用程序关闭的时候由于原wince桌面程序的丢失而会使机器死机。

方法三:主要思想:将应用程序太大没有添加到映像里,只是部署在ResidentFlash\surveymain\目录下,然后修改注册表,让应用程序自启动。这回不替换wince的桌面程序,而是让wince像加载桌面一样加载你的应用程序,效果跟前两种方法一样。在platform.reg中添加

[HKEY_LOCAL_MACHINE\init]
"Launch70"="ResidentFlash\\surveymain\\SurveyMain.exe"
"Depend70"=hex:14,00, 1e,00

这里要注意,路径里 要双斜杠 如"ResidentFlash\\surveymain\\SurveyMain.exe" ,刚开始是单斜杠不行,我也不知道什么原因,换成双斜杠就可以了。

当然,前面三个方法的前提肯定是你的这个程序,在当前的PB工程编译的内核里有可以正常运行的. 这一句看起来是废话,其实很重要. 我这在调试的时候,一度程序不能启动, 我一直认为是注册表或bib文件出错了, 调了很久都不行. 最后才发现,我这个应用程序是在之前的SDK下编译的, 在当前的系统一根本不能运行. 于是我又在可用的系统下重新编译了一个新的SDK, 问题解决.

本文是转载,非常感谢原创,在此贴出原网址:http://www.cnblogs.com/xilentz/archive/2010/04/22/1717848.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值