转载几个关于"Wince下定制开机自启动程序"的文章

ARM开发板自启动实现
采用在启动文件夹添加快捷方式的方式失败

因为该文件夹在内存镜像里面开机后就消失了
采用注册表设置开机启动成功
但是现在由于要使用SD卡进行启动,发现该方式也失败了
查找原因,因为注册表设置的开机启动程序,在SD驱动加载之前,也就全部给执行过启动命令,但是却找不到SD盘符的应用程序,导致无法驱动
经过探索,找到这些原因之后,就采取了如下方式:
1,用于引导的启动程序放在固有存储器
2,注册表设置开机启动程序,启动用于引导的启动程序
3,引导启动程序每间隔一秒就启动一次应用程序,直到启动成功。

以下是转发的内容


上网查了一下,发现相关的贴子还真是不少. 最近因公司的项目需要,我做了个简单的程序则试该功能. 用网上的很多方法发现是行不通的, 估计最初应该是可以用的, 然后大家都是互相转载, 转来转去有些东西漏了或转错了,因为很少有人真正去测试过,看到就直接转. 我在这里根据自己的实际测试,整理出整个过程,并对一些步骤的原理做了解释

假设应用程序为:

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

步骤:

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

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

3在pb中修改文件,在FILES Section添加(FILES区哉可以包含不是就地执行的可执行文件):       $(_FLATRELEASEDIR)\ NK H       $(_FLATRELEASEDIR)\  NK H (注:$(_FLATRELEASEDIR)表示xxx_Relase文件夹;NK后面的H表明加入到中的文件为隐藏属性)

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桌面程序的丢失而会使机器死机。

方法三:主要思想:将应用程序添加到映像里,然后修改注册表,让应用程序自启动。这回不替换wince的桌面程序,而是让wince像加载桌面一样加载你的应用程序,效果跟方法一是一样的。

跟方法二是一样的,稍有不同:在文件中[HKEY_LOCAL_MACHINE\init]之下添加如下语句:"Launch80"="" "Depend80"=hex:1E,00跟方法2的区别是没有换掉.

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


WinCE开机自动启动程序

首先讨论WinCE镜像配置过程中常用的三种文件: .reg .bib .dat。.reg文件是注册表文件,冷启动时filesys.exe用它建立一个默认的注册表。.bib是构造文件,也就是定义模块和文件如何被包含到一个操作系统镜像中。.dat文件是在冷启动时指定如何初始化RAM文件系统的。
       要想让自己的程序在系统启动时自动运行,那么就要做到两点:
将自己的文件包含到镜像中;
将文件信息写入启动信息中。
我尝试过两种方法来完成这项任务,一种是直接修改bib和dat文件。另一种是创建自己的cec特性文件。两者在本质上是一样的。下面介绍之(假设程序名字为hello.exe):
1.直接修改bib文件和dat
bib: 在FILES域添加自己的文件信息.这样文件就编入内核中了,启动后将进入\windows目录
文件名称           文件位置                             内存位置   属性
hello.exe   $(_FLATRELEASEDIR)\hello.exe        NK              H
hello.lnk    $(_FLATRELEASEDIR)\hello.lnk          NK              H
dat:    添加到启动目录
Directory("\windows\startup"):-File("hello.lnk","\windows\hello.lnk")
其中hello.lnk为hello.exe的快捷方式。因为所有的ROM文件已经在\windows\目录下了,所以就不用再复制hello.exe了,所以复制了快捷方式来引用它。make image 之后就可以自动启动了
2.创建自己的cec文件
当为内核添加自己的特性,比如驱动,bsp等时直接修改配置文件非常麻烦,微软提供了特性文件来方便操作。这里我们的目的是添加bib和reg文件。
在系统启动最后,会自动运行注册表[HKEY_LOCAL_MACHINE\init]下的内容,这样我们可以把程序的信息写到这里来
;hello.reg
[HKEY_LOCAL_MACHINE\init]
"Launch50"="hello.exe"

platform builder中提供了cec编辑器。tools->cec editor:
添加特性insert feature.
name: MyGroup
group: MyFeature
然后创建构造方法insert build method
stepWinCE开机自动启动程序ostBuildRel
CPU:emulator
action: copy  $(_FLATRELEASEDIR)\hello.reg ->$(_FLATRELEASEDIR)
然后添加bib:insert bib file,选择hello.exe
保存为hello.cec
然后在PB中,将我们的cec文件添加到工程file->manage catalog features
刷新后我们可以看到在右边的catalog栏中出现了我们的特性,点反键添加到工程就可以了。makeImage之后我们的程序就可以自动运行了


WinCE 应用程序开机自启动方法

http://blog.csdn.net/91program/article/details/2415352

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

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

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

[HKEY_LOCAL_MACHINE/init]
"Launch50"="explorer.exe"
"Depend50"=hex:14,00, 1e,00

把这个explorer.exe改成你的应用程序(比如:MyApp.exe);

3、 把应用程序加入到映像,修改注册表:

[HKEY_LOCAL_MACHINE/init]
"Launch80"="MyApp.exe" 
"Depend80"=hex:1E,00

可以设置启动顺序和依赖程序;

以上方法都可行,但是都存在一个问题,就是应用程序是集成到NK里面的,也就是说每次升级应用程序都要重新编译下载内核,很麻烦,尤其在程序调试阶段,大家都希望把应用程序放在SD卡上,这样更新起来比较容易;据说通过第三种方法可以实现,即修改"Launch80"="MyApp.exe"为"Launch80"="/STDCard/MyApp.exe"( STDCard为SD卡目录),但是我试了一下没有成功,因为Launch80运行时SD卡的文件驱动还没有加载,找不到MyApp.exe文件。同样,采用快捷方式加载SD卡里的应用程序也不可行。
所以我采用了另一种方法,自己编了一个小程序,比如叫ShellExe.exe,将此程序加入到映像里,通过StartUp快捷方式调用ShellExe,ShellExe再去调用SD卡里的应用程序,具体实现步骤如下:
1、 在eVC下编译如下代码:

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR    lpCmdLine,
int       nCmdShow)
{
WIN32_FIND_DATA fd;
HANDLE hd=INVALID_HANDLE_VALUE;
int iCount = 20;
while(iCount--)
{
hd=::FindFirstFile(lpCmdLine,&fd);
Sleep(500);
if(INVALID_HANDLE_VALUE!=hd) break;
}
if(0==iCount) return 0;
FindClose(hd);
SHELLEXECUTEINFO ShExeInfo={0};
ShExeInfo.cbSize=sizeof(SHELLEXECUTEINFO);
ShExeInfo.fMask=SEE_MASK_NOCLOSEPROCESS;
ShExeInfo.hwnd=NULL;
ShExeInfo.lpVerb=NULL;
ShExeInfo.lpFile=lpCmdLine;
ShExeInfo.lpParameters=L"";
ShExeInfo.lpDirectory=NULL;
ShExeInfo.nShow=SW_SHOW;
ShExeInfo.hInstApp=NULL;
ShellExecuteEx(&ShExeInfo);
return 0;
}
  生成ShellExe.exe的可执行文件,此段代码主要功能是查找指定的应用程序,然后执行;下面这段代码可以保证在SD卡文件系统正确加载后才去执行应用程序;
while(iCount--)
{
hd=::FindFirstFile(lpCmdLine,&fd);
Sleep(500);
if(INVALID_HANDLE_VALUE!=hd) break;
}
文件的名称和路径由命令行参数指定:
ShExeInfo.lpFile=lpCmdLine;

2、 新建一个快捷方式,如Autorun.lnk,按如下方式编辑其内容:

21#/windows/shellexe.exe /stdcard/MyApp.exe

其中/stdcard/MyApp.exe应用程序的绝对路径;

3、 将MyApp.exe和Autorun.lnk添加到NK里,方法是在project.bib文件内加入如下内容:

ShellExe.exe f:/WINCE420/PBWORKSPACES/LioetEnTer/RelDir/ShellExe.exe NK S
Autorun.lnk f:/WINCE420/PBWORKSPACES/LioetEnTer/RelDir/Autorun.lnk NK S

注意:ShellExe.exe的属性不能带H(隐藏).

4、 在project.dat里加入如下内容:

Directory("/Windows/Startup"):-File("Autorun.lnk","/Windows/Autorun.lnk")

5、 选择Make Image生成映像(当然Build也可以,就是慢点儿),烧到FLASH里,开机运行,可以看到SD卡里的MyApp.exe被正确执行。

总结

  这种方法用起来比较方便,ShellExe.exe不用每次都重新编译,只要根据应用程序路径修改Autorun.lnk即可,可以加载Flash、U盘、SD卡里的应用程序。调试及升级应用程序就不用重新烧写内核了。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值