wince 自启动程序设置_第1页
wince 自启动程序设置_第2页
wince 自启动程序设置_第3页
wince 自启动程序设置_第4页
wince 自启动程序设置_第5页
已阅读5页,还剩13页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为Word版,下载可任意编辑——wince自启动程序设置wince自动启动程序设置

修改注册表[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

如何让应用程序随wince操作系统自启动

如何让应用程序随wince操作系统自启动呢?我探寻了一下,网上有不少方法,但有时也会有疏漏的地方,寻常一点小小的错误也会导致整个环节不能进行下去。在此,我想跟大家共同探讨一下,欢迎大家指正。

首先,假设你的应用程序为:MyApp.exe。

方法一:主要思想:将应用程序及其快捷方式也添加到映像里,再将快捷方式添加到StartUp目录下,这样当系统运行后应用程序就能自动运行。

步骤:

1先保证原工程文件是可以编译成功的。假设编译好的nk.bin文件所在文件夹为xxx_Relase。

2创立快捷方式文件MyApp.lnk,文件内容如下:10#〞\\Windows\\MyApp.exe〞(注意引号)

3在pb中修改project.bib文件,在FILESSection添加:MyApp.exe$(_FLATRELEASEDIR)\\MyApp.exeNKHMyApp.lnk$(_FLATRELEASEDIR)\\MyApp.lnkNKH

(注:$(_FLATRELEASEDIR)表示xxx_Relase文件夹;NK后面的H说明参与到nk.bin中的文件为隐蔽属性)

4把快捷方式添加到StartUp目录下,具体为:修改工程的project.dat文件,添加如下内容:

Directory(\nk\

5从道理上讲,假使这时把MyApp.exe和MyApp.lnk拷贝到xxx_Relase文件夹下,然后Build->MakeImag的话就会把你的应用程序添加到NK里,但实际

状况并非如此,经我试验,先要把工程文件全部rebuild一下,我这儿是sysgen了一下,假使你设置了在编译完后MakeImage的话,会有错误提醒你未在你的磁盘上找到MyApp.exe。不用管它。把MyApp.exe和MyApp.lnk文件拷贝到xxx_Relase文件夹下,然后MakeImage一下(记住此时千万不能再rebuild了,否则会前功尽弃),把生成的NK.bin烧写到flash里,这样就可以看到你的应用程序MyApp.exe自启动了.

方法二:主要思想:将应用程序添加到映像里,然后用你的应用程序直接替换Wince的桌面程序。

步骤:

1.像方法一一样把你的应用程序添加到映象里。

提醒:要查看添加映象是否成功,可以在操作系统启动后,看一下windows目录下是否有你的应用程序MyApp.exe(先要设置为可以查看系统文件和隐蔽文件)。

2.修改shell.reg(若在pb里找不到,可以到xxx_Relase文件夹下找):[HKEY_LOCAL_MACHINE\\init]\\

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

3.MakeImage一下(还是记住不能再build了),把生成的NK.bin烧写到flash里,这样就可以看到你的应用程序MyApp.exe自启动了.

这样做的好处是启动的时候wince的桌面程序都不会启动了,害处是当你把应用程序关闭的时候由于原wince桌面程序的丢失而会使机器死机。

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

步骤跟方法二是一样的,只是其次步稍有不同:

在shell.reg文件中[HKEY_LOCAL_MACHINE\\init]之下添加如下语句:\\

说明:\用来设置启动顺序和依靠程序,若你的应用程序不依靠于其它程序,这句可以不加。

另外,应用程序也不一定就要加载到映象文件里,可以直接从u盘,硬盘,sd卡等加载,但是要先保证你的应用程序自启动时系统已能正确识别挂接的u盘,硬盘,sd卡等。

有两个地方启动程序:

1.在注册表HKLM\\Init上参与键值:Launch99=\你的程序名(可以是绝对路径)\,假使你的程序要依靠别的程序,还要参与:Depend99=依靠程序的启动序号(可以看看Init下其它程序的启动顺序)

2.好像是在HKLM下有个WBT,里面有个地方也可以参与启动程序,每次注销都会重新启动一遍,而Init只有在重新开机时才启动。

你要启动的程序,可以放在你的flash卡上(Init需要参与绝对路径),或者参与bib文件,编译进内核。

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

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

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

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

[HKEY_LOCAL_MACHINE\\init]\\

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

3、把应用程序参与到映像,修改注册表:[HKEY_LOCAL_MACHINE\\init]\\

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

以上方法都可行,但是都存在一个问题,就是应用程序是集成到NK里面的,也就是说每次升级应用程序都要重新编译下载内核,很麻烦,特别在程序调试阶段,大家都希望把应用程序放在SD卡上,这样更新起来比较简单;据说通过第三种方法可以实现,即修改\为

\为SD卡目录),但是我试了一下没有成功,由于Launch80运行时SD卡的文件驱动还没有加载,找不到MyApp.exe文件。同样,采用快捷方式加载SD卡里的应用程序也不可行。所以我采用了另一种方法,自己编了一个小程序,譬如叫ShellExe.exe,将此程序参与到映像里,通过StartUp快捷方式调用ShellExe,ShellExe再去调用SD卡里的应用程序,具体实现步骤如下:1、在eVC下编译如下代码:

intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPTSTRlpCmdLine,intnCmdShow){

WIN32_FIND_DATAfd;

HANDLEhd=INVALID_HANDLE_VALUE;intiCount=20;while(iCount--){

hd=::FindFirstFile(lpCmdLine,Sleep(500);

if(INVALID_HANDLE_VALUE!=hd)break;}

if(0==iCount)return0;FindClose(hd);

SHELLEXECUTEINFOShExeInfo={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(return0;}

生成ShellExe.exe的可执行文件,此段代码主要功能是查找指定的应用程序,然后执行;下面这段代码可以保证在SD卡文件系统正确加载后才去执行应用程序;

while(iCount--){

hd=::FindFirstFile(lpCmdLine,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.exef:\\WINCE420\\PBWORKSPACES\\LioetEnTer\\RelDir\\ShellExe.exeNKS

Autorun.lnkf:\\WINCE420\\PBWORKSPACES\\LioetEnTer\\RelDir\\Autorun.lnkNKS注意:ShellExe.exe的属性不能带H(隐蔽).

4、在project.dat里参与如下内容:

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

总结

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

WinCE自启动Shell的问题

WinCE开机即运行定制的Shell是好多系统的基本要求,有时还需要屏蔽WinCE自带的Shell。WinCE中程序的自启动,一般有两个实现方法,修改注册表和添加自启动快捷方式。修改注册表比较便利,如下:

[HKEY_LOCAL_MACHINE\\init]\\

只要将MyApp.exe打包到NK,并在platform.reg中参与上面的注册表信息,这样WinCE启动时便会自动运行该程序。但这时WinCE自带的Shell总是先出来,然后才运行MyApp.exe,为了避免这种状况,我们可以将注册表设置修改如下:

[HKEY_LOCAL_MACHINE\\init]\\

即将原来启动explorer.exe的值换为MyApp.exe。这样WinCE启动时直接进入定制的Shell,而不启动explorer.exe。但这时有可能引入了新问题,假使定制的Shell是基于MFC编写的,并且其中用到了如CFileDialog等类库时,就会出现意想不到的状况,如下图所示:

上图是在不启动Explorer.exe时,尝试导入注册表文件出现的状况截图,而在启动explorer.exe时是没有问题的。这说明CFileDialog在某种程度上依靠于explorer.exe,具体细节没研究。但说明不启动explorer.exe,基于MFC的Shell运行时就可能会出问题。所以explorer.exe必需启动,但又不能出现WinCE界面。要解决这个问题自然就想到修改explorer.exe了。WinCE5.0和WinCE6.0中,这一部分的代码都是公开的,在WinCE6.0中Shell的相关代码在C:\\WINCE600\\PUBLIC\\SHELL\\OAK\\HPC\\EXPLORER\\MAIN目录下。

大致看了一下这一部分的代码,发现只需修改如下两个文件,就应当能实现需求。

C:\\WINCE600\\PUBLIC\\SHELL\\OAK\\HPC\\EXPLORER\\MAIN\\desktop.cpp

+expandsourceviewplaincopytoclipboardprint?

·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150boolCDesktopWnd::Create(){

IShellFolder*pSHF;FOLDERSETTINGSfs;RECTrc;

HRESULThr=E_FAIL;

//Getashellfolderforthedesktophr=SHGetDesktopFolder(if(hr||!pSHF)gotoCleanup;

//createashellviewforit

hr=pSHF->CreateViewObject(NULL,IID_IShellView,(LPVOID*)if(hr||!_psv)gotoCleanup;

fs.ViewMode=FVM_ICON;

fs.fFlags=FWF_DESKTOP|FWF_ALIGNLEFT|FWF_NOSCROLL;

//++changedbyhjb

//将Desktop的窗口大小设为0

//SetRect(SetRect(//--changedbyhjb

//createthedesktop'sviewwindow(noneedtoAddRefsinceCreateViewWindowdoesit)

hr=_psv->CreateViewWindow(NULL,if(hr||!_hWnd){

Release();gotoCleanup;}

RegisterDesktop(_hWnd);Cleanup:if(pSHF)

pSHF->Release();

return(hr==S_OK);}

boolCDesktopWnd::Create(){

IShellFolder*pSHF;FOLDERSETTINGSfs;RECTrc;

HRESULThr=E_FAIL;

//Getashellfolderforthedesktophr=SHGetDesktopFolder(if(hr||!pSHF)gotoCleanup;

//createashellviewforit

hr=pSHF->CreateViewObject(NULL,IID_IShellView,(LPVOID*)if(hr||!_psv)gotoCleanup;

fs.ViewMode=FVM_ICON;

fs.fFlags=FWF_DESKTOP|FWF_ALIGNLEFT|FWF_NOSCROLL;

//++changedbyhjb

//将Desktop的窗口大小设为0

//SetRect(SetRect(//--changedbyhjb

//createthedesktop'sviewwindow(noneedtoAddRefsinceCreateViewWindowdoesit)

hr=_psv->CreateViewWindow(NULL,if(hr||!_hWnd){

Release();gotoCleanup;}

RegisterDesktop(_hWnd);Cleanup:if(pSHF)

pSHF->Release();

return(hr==S_OK);}

C:\\WINCE600\\PUBLIC\\SHELL\\OAK\\HPC\\EXPLORER\\MAIN\\explorer.cpp

+expandsourceviewplaincopytoclipboardprint?

·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150DWORDWINAPICreateTaskBar(LPVOIDpEvent){

HANDLEhSyncEvent=*((HANDLE*)pEvent);CTaskBar*pTaskBar=NULL;HWNDhwndTB=NULL;

pTaskBar=newCTaskBar;

//++addedbyhjb

//在创立任务栏时强制终止if(pTaskBar){

deletepTaskBar;SetEvent(hSyncEvent);return0;}

//--addedbyhjb

if(!pTaskBar){

SetEvent(hSyncEvent);return0;}

g_TaskBar=pTaskBar;

if(!pTaskBar->Register(g_hInstance)){

g_TaskBar=NULL;

deletepTaskBar;SetEvent(hSyncEvent);return0;}

RegisterTaskBar(pTaskBar->GetWindow());SetEvent(hSyncEvent);

DWORDdwRet=pTaskBar->MessageLoop();

deletepTaskBar;

returndwRet;}

DWORDWINAPICreateTaskBar(LPVOIDpEvent){

HANDLEhSyncEvent=*((HANDLE*)pEvent);CTaskBar*pTaskBar=NULL;HWNDhwndTB=NULL;

pTaskBar=newCTaskBar;

//++addedbyhjb

//在创立任务栏时强制终止if(pTaskBar){

deletepTaskBar;SetEvent(hSyncEvent);return0;}

//--addedbyhjb

if(!pTaskBar){

SetEvent(hSyncEvent);

return0;}

g_TaskBar=pTaskBar;

if(!pTaskBar->Register(g_hInstance)){

g_TaskBar=NULL;deletepTaskBar;SetEvent(hSyncEvent);return0;}

RegisterTaskBar(pTaskBar->GetWindow());SetEvent(hSyncEvent);

DWORDdwRet=pTaskBar->MessageLoop();

deletepTaskBar;

returndwRet;}

修改完这两处后,先编译该目录,然后再重新编译整个系统(执行Sysgen)应当就可以了。Explorer.exe仍旧启动,仍旧可以听到WinCE启动的声音,但WinCE的界面已经屏蔽掉了。此时,基于MFC的Shell也能正常工作,如下图所示:

在实际操作时,我没有通过修改源代码编译来完成这个测试。由于在编译C:\\WINCE600\\PUBLIC\\SHELL\\OAK\\HPC\\EXPLORER\\MAIN目录时,发现它只生成了explorer.lib。考虑到重新编译整个系统的时间太长,所以直接修改了工程目录下的explorer.exe的文件,MakeImg后测试的。这里应当有快速编译的方法,但目前不知怎么弄。

修改后,在WinCE6.0的模拟器中测试,达到了预想的效果。这样就大约解决了基于MFC的Shell和Explorer.exe之间的矛盾,是不是有隐患还不明白,目前看来没问题。

另外需要注意,修改public和private目录下的文件时,一定先做好备份,以免后患。

修改后的WinCE6.0的explorer.exe及演示视频的下载地址:

/we-hjb/WinCE_Shell.rar

引用网址:http://./we-hjb/archive/2023/12/28/1364070.html

HKEY_LOCAL_MACHINE\\init\\Launch80=\

[PB操作使用技巧]WinCE下直接启动应用程序的方法

其实让一个程序在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#\

3编辑好lnk文件内容后在pb中修改project.bib。在files段后面添加下面一行:(和添加别的文件到image中类似,见我的《WinCE中如何向image中添加文件》,也要在pb的flatform菜单的setting下添加build语句,不再赘述)test.lnk$(_FLATRELEASEDIR)\

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论