wince 自启动程序设置.docx
《wince 自启动程序设置.docx》由会员分享,可在线阅读,更多相关《wince 自启动程序设置.docx(19页珍藏版)》请在冰点文库上搜索。
![wince 自启动程序设置.docx](https://file1.bingdoc.com/fileroot1/2023-4/30/5a91092a-e85e-4660-9062-ff10ceccd753/5a91092a-e85e-4660-9062-ff10ceccd7531.gif)
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.exeNKH
MyApp.lnk $(_FLATRELEASEDIR)\MyApp.lnk NKH
(注:
$(_FLATRELEASEDIR)表示xxx_Relase文件夹;NK后面的H表明加入到nk.bin中的文件为隐藏属性)
4 把快捷方式添加到StartUp目录下,具体为:
修改工程的project.dat文件,添加如下内容:
Directory("\Windows\Startup"):
-File("MyApp.lnk","\Windows\MyApp.lnk")
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]
"Launch50"="explorer.exe"
"Depend50"=hex:
14,00,1e,00
把这个explorer.exe改成你的应用程序(比如:
MyApp.exe)。
3.MakeImage一下(还是记住不能再build了),把生成的NK.bin烧写到flash里,这样就可以看到你的应用程序MyApp.exe自启动了.
这样做的好处是启动的时候wince的桌面程序都不会启动了,坏处是当你把应用程序关闭的时候由于原wince桌面程序的丢失而会使机器死机。
方法三:
主要思想:
将应用程序添加到映像里,然后修改注册表,让应用程序自启动。
这回不替换wince的桌面程序,而是让wince像加载桌面一样加载你的应用程序,效果跟方法一是一样的。
步骤跟方法二是一样的,只是第二步稍有不同:
在shell.reg文件中[HKEY_LOCAL_MACHINE\init]之下添加如下语句:
"Launch80"="MyApp.exe"
"Depend80"=hex:
1E,00
说明:
"Depend80"=hex:
1E,00用来设置启动顺序和依赖程序,若你的应用程序不依赖于其它程序,这句可以不加。
另外,应用程序也不一定就要加载到映象文件里,可以直接从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]
"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下编译如下代码:
intWINAPIWinMain(HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
WIN32_FIND_DATAfd;
HANDLEhd=INVALID_HANDLE_VALUE;
intiCount=20;
while(iCount--)
{
hd=:
:
FindFirstFile(lpCmdLine,&fd);
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(&ShExeInfo);
return0;
}
生成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.exef:
\WINCE420\PBWORKSPACES\LioetEnTer\RelDir\ShellExe.exeNKS
Autorun.lnkf:
\WINCE420\PBWORKSPACES\LioetEnTer\RelDir\Autorun.lnkNKS注意:
ShellExe.exe的属性不能带H(隐藏).
4、 在project.dat里加入如下内容:
Directory("\Windows\Startup"):
-File("Autorun.lnk","\Windows\Autorun.lnk")5、 选择MakeImage生成映像(当然Build也可以,就是慢点儿),烧到FLASH里,开机运行,可以看到SD卡里的MyApp.exe被正确执行。
总结
这种方法用起来比较方便,ShellExe.exe不用每次都重新编译,只要根据应用程序路径修改Autorun.lnk即可,可以加载Flash、U盘、SD卡里的应用程序。
调试及升级应用程序就不用重新烧写内核了。
WinCE自启动Shell的问题
WinCE开机即运行定制的Shell是很多系统的基本要求,有时还需要屏蔽WinCE自带的Shell。
WinCE中程序的自启动,一般有两个实现方法,修改注册表和添加自启动快捷方式。
修改注册表比较方便,如下:
[HKEY_LOCAL_MACHINE\init]
"Launch70"="MyApp.exe"
"Depend70"=hex:
14,00,1e,00
只要将MyApp.exe打包到NK,并在platform.reg中加入上面的注册表信息,这样WinCE启动时便会自动运行该程序。
但这时WinCE自带的Shell总是先出来,然后才运行MyApp.exe,为了避免这种情况,我们可以将注册表设置修改如下:
[HKEY_LOCAL_MACHINE\init]
"Launch50"="MyApp.exe"
"Depend50"=hex:
14,00,1e,00
即将原来启动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·······150
boolCDesktopWnd:
:
Create()
{
IShellFolder *pSHF;
FOLDERSETTINGSfs;
RECTrc;
HRESULThr=E_FAIL;
//Getashellfolderforthedesktop
hr=SHGetDesktopFolder(&pSHF);
if(hr||!
pSHF)
gotoCleanup;
//createashellviewforit
hr=pSHF->CreateViewObject(NULL,IID_IShellView,(LPVOID*)&_psv);
if(hr||!
_psv)
gotoCleanup;
fs.ViewMode=FVM_ICON;
fs.fFlags=FWF_DESKTOP|FWF_ALIGNLEFT|FWF_NOSCROLL;
//++changedbyhjb
//将Desktop的窗口大小设为0
//SetRect(&rc,0,0,GetSystemMetrics(SM_CXVIRTUALSCREEN),GetSystemMetrics(SM_CYVIRTUALSCREEN));
SetRect(&rc,0,0,0,0);
//--changedbyhjb
//createthedesktop'sviewwindow(noneedtoAddRefsinceCreateViewWindowdoesit)
hr=_psv->CreateViewWindow(NULL, &fs,(IShellBrowser*)this,&rc,&_hWnd);
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;
//Getashellfolderforthedesktop
hr=SHGetDesktopFolder(&pSHF);
if(hr||!
pSHF)
gotoCleanup;
//createashellviewforit
hr=pSHF->CreateViewObject(NULL,IID_IShellView,(LPVOID*)&_psv);
if(hr||!
_psv)
gotoCleanup;
fs.ViewMode=FVM_ICON;
fs.fFlags=FWF_DESKTOP|FWF_ALIGNLEFT|FWF_NOSCROLL;
//++changedbyhjb
//将Desktop的窗口大小设为0
//SetRect(&rc,0,0,GetSystemMetrics(SM_CXVIRTUALSCREEN),GetSystemMetrics(SM_CYVIRTUALSCREEN));
SetRect(&rc,0,0,0,0);
//--changedbyhjb
//createthedesktop'sviewwindow(noneedtoAddRefsinceCreateViewWindowdoesit)
hr=_psv->CreateViewWindow(NULL, &fs,(IShellBrowser*)this,&rc,&_hWnd);
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·······150
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;
}
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);