wince 自启动程序设置.docx

上传人:b****1 文档编号:1403232 上传时间:2023-04-30 格式:DOCX 页数:19 大小:23.09KB
下载 相关 举报
wince 自启动程序设置.docx_第1页
第1页 / 共19页
wince 自启动程序设置.docx_第2页
第2页 / 共19页
wince 自启动程序设置.docx_第3页
第3页 / 共19页
wince 自启动程序设置.docx_第4页
第4页 / 共19页
wince 自启动程序设置.docx_第5页
第5页 / 共19页
wince 自启动程序设置.docx_第6页
第6页 / 共19页
wince 自启动程序设置.docx_第7页
第7页 / 共19页
wince 自启动程序设置.docx_第8页
第8页 / 共19页
wince 自启动程序设置.docx_第9页
第9页 / 共19页
wince 自启动程序设置.docx_第10页
第10页 / 共19页
wince 自启动程序设置.docx_第11页
第11页 / 共19页
wince 自启动程序设置.docx_第12页
第12页 / 共19页
wince 自启动程序设置.docx_第13页
第13页 / 共19页
wince 自启动程序设置.docx_第14页
第14页 / 共19页
wince 自启动程序设置.docx_第15页
第15页 / 共19页
wince 自启动程序设置.docx_第16页
第16页 / 共19页
wince 自启动程序设置.docx_第17页
第17页 / 共19页
wince 自启动程序设置.docx_第18页
第18页 / 共19页
wince 自启动程序设置.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

wince 自启动程序设置.docx

《wince 自启动程序设置.docx》由会员分享,可在线阅读,更多相关《wince 自启动程序设置.docx(19页珍藏版)》请在冰点文库上搜索。

wince 自启动程序设置.docx

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);

       

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2