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

转自:http://blog.mcuol.com/User/iwillbeback008/Article/10903_1.htm

 

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程序就会在系统启动时自动运行。

注:你编译进去的文件是隐藏了的............请在文件的选项里面去了第一个隐藏选项就看得到了........你试下...点查看----->选项--------
弹出对话框..文件夹选项..去了那"不显示隐藏文件和文件夹"..在Windows 文件夹下面看得到的..


还有一个自启动的问题:由于pb中存在一个小buger,导致wince的中文界面中会有两个“启动”,一个是中文的启动,一个是“startup”。usbconnt在中文的启动中,而系统默认从startup启动。所以需要在WINCE420\PUBLIC\COMMON\OAK\FILES\INTLTRNS\0804的common.str中修改“\\Windows\\StartUp”为“\\Windows\\启动”。然后再编译工程。

只是参考









增加一篇参考文章:
其实让一个程序在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不用每次都重新编译,只要根据应用程序路径修

你可能感兴趣的:(WinCE)