查看: 1605|回复: 0
打印 上一主题 下一主题

WINCE实用技巧 之 系统启动直接运行定制的程序

[复制链接]
跳转到指定楼层
沙发
发表于 2015-3-30 12:28:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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.exe和MyApp.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.exe和MyApp.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 应用程序开机自动运行的又一种方法

关键字: 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被正确执行。




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

快速回复 返回顶部 返回列表