WINCE系统启动直接运行自己的程序

来源:互联网 发布:人大网络教育学费 编辑:程序博客网 时间:2024/05/17 22:44
WINCE系统启动直接运行自己的程序
2007-07-27 23:26
1.        假定Windows CE.NET目标工程目录为D:/WINCE420/PUBLIC/MyWinCE,并且工程已经Build成功,假定Windows CE.NET的应用程序为MyApp.exe
2.        
MyApp.exe复制到D:/WINCE420/PUBLIC/MyWinCE/SAMSUNG_SMDK2410_ARMV4Release目录下;
3.        
修改MyWinCE工程的project.bib文件,在FILES Section添加如下内容:

MyApp.exe $(_FLATRELEASEDIR)/MyApp.exe NK H
4.        
创建快捷方式文件MyApp.lnk,文件内容如下:
10#/Windows/MyApp.exe
MyApp.lnk
文件也放入D:/WINCE420/PUBLIC/MyWinCE/SAMSUNG_SMDK2410_ARMV4Release目录下;
5.        
修改MyWinCE工程的project.bib文件,在FILES Section添加如下内容:
MyApp.lnk $(_FLATRELEASEDIR)/MyApp.lnk NK H
6.        
修改MyWinCE工程的project.dat文件,添加如下内容:
Directory("/Windows/Startup"):-File("MyApp.lnk","/Windows/MyApp.lnk")
7.        
修改MyWinCE工程的platform.bib文件,在FILES Section添加如下内容:

MyApp.exe                 $(_FLATRELEASEDIR)/MyApp.exe                                 NK         H
MyApp.lnk                 $(_FLATRELEASEDIR)/MyApp.lnk                                 NK         H
8.         Platform Builder IDE
:【Build->Make Image】(记得千万不要Build或者Rebuild

9.        
成功后,得到的NK.bin(或NK.nb0)就包含了应用程序MyApp.exeMyApp.lnk,当把相应的内核烧入开发板MyApp程序就会在系统启动时自动运行。
     虽然MyApp可以自己启动了,但每次启动的时候,总是微软的桌面先出来,再启动我们的程序,感觉还是不伦不类。对此,我们可以使用startup的快捷方式再加上隐藏任务栏的方法,效果非常的好,具体操作是:1)        首先新建工程,把你的应用程序放到内核里面去(前面介绍了如何做);

2)        
编译平台;
3)        
修改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.exeMyApp.lnk,当把相应的内核烧入开发板MyApp程序就会在系统启动时自动运行。


增加一篇参考文章:
其实让一个程序在wince里启动和windows里差不多,直接设置其为启动项,这个有几个方法。一个就是制作一个快捷方式,指向我们的应用程序如app.exe,然后将快捷方式放到/windows/startup下面。
     步骤如下:(假设app.exe已经拷贝到windows下面)
     1 在pb中创建一个文件,文件类型选txt,然后命名为.lnk后缀,假设名字为test.lnk
     2 编辑其内容为: 16#/windows/app.exe。备注:前面的16是# 后面所有字符的总和,包括空格。Wince的帮助文档上说这么定义就行,但是我尝试后,最后down到目标机上面时提示找不到文件,在wince里查看这么创建的test.lnk的属性,发现其指向/windows/app.exe后面还有两个方框,因此不对,我的解决方法是修改test.lnk的内容为16#"/Windows/app.exe"
     3 编辑好lnk文件内容后在pb中修改project.bib。在files段后面添加下面一行:(和添加别的文件到image中类似,见我的《WinCE中如何向image中添加文件》,也要在pb的flatform菜单的setting下添加build语句,不再赘述)
         test.lnk $(_FLATRELEASEDIR)/test.lnk NK S
     在project.dat中增加下面一行:
          Directory("/Windows/startup"):-File("test.lnk","/Windows/test.lnk")
     这样后系统启动后就会自动启动我们的程序了。
    
     另外一种方法是编辑注册表:在project.reg中添加如下内容
         [HKEY_LOCAL_MACHINE/init]
         "Launch80"="app.exe"
         "Depend80"=hex:14,00,1e,00
     这个是设定启动顺序,launch后面的数字越大的越是后启动,Depend80后面的指定依赖项,为16进制,上面的语句表明依赖项为launch20定义的device.exe和launch30中定义的gwes.exe, 注意Launch后面的数字范围为0到99 ,此范围之外的将不会有效果。
     这样两种方法的效果都是系统都是系统先启动资源管理器explorer.exe(就是看到的默认桌面),然后启动我们的程序,(如果利用taskman shell然后去掉任务栏那么效果更好)但是这样还不够,我们如何不显示桌面,直接显示我们的程序呢?
     网上有人介绍的方法是去掉standard shell,但是我编译总是报错。我采用的方法是替换注册表中lauch50中的explorer.exe为我的app.exe,即搞定。
     修改注册表的方法:先把带KITL的系统跑起来,在PB的TOOLS->Remote registry editor里修改,验证有效后,再去修改platfrom.reg, 或者自己写个REG文件,然后在platform.reg里INCLUDE进来 SYSGEN后确认PBWORKSPACE里相关项目的REL目录里reginit.ini文件里包含了自己做的修改后make image然后DOWNLOAD下去就OK了。
     值得补充的是,我们前面介绍的步骤中那个修改平台setting,添加语句的,是因为我每次都是重新sysgen和build,如果只是简单的make image的话(都是pb中的build OS菜单下的命令),那么将直接用release中的内容,因此也可以直接将文件放到release文件夹,然后改project.bib等实现往image中添加文件。 同样,也可以直接修改release中的shell.reg中的launch50值为我们自己的程序(或者类似修改reginit.ini文件,reginit.ini文件存放有所有wince的静态注册表,来达到去掉桌面,直接启动我们程序的效果)。
注意,这么启动的程序,如果点击关闭,就会死机的,因为没有窗口运行了。实际运用中,当然不会让用户关闭我们的程序,除非他一起关闭系统。
如果也需要build的话,可以通过往image中添加文件的方法将我们改好的shell.reg添加到release目录。



另一参考文章:

WinCE 应用程序开机自动运行的又一种方法

北京电子部11所
王鑫

关键字: 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、 把应用程序加入到映像,修改注册表:
[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 SAutorun.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卡里的应用程序。调试及升级应用程序就不用重新烧写内核了。
原创粉丝点击