1. 程式人生 > >WinCE 應用程式開機自動執行

WinCE 應用程式開機自動執行

一、開機自執行常規方法[轉載]

 

近日在開發過程中遇到WinCE應用程式開機自動執行的問題,在網上找了找,發現大概有以下三種方法:

1、 將應用程式和應用程式快捷方式新增到映像裡,再將快捷方式新增到StartUp目錄下,這樣當系統執行後應用程式就能自動執行;

2、 直接替換Wince的SHELL,即修改登錄檔:



把這個explorer.exe改成你的應用程式(比如:MyApp.exe);

3、 把應用程式加入到映像,修改登錄檔:



可以設定啟動順序和依賴程式,這個是設定啟動順序,launch後面的數字越大的越是後啟動,Depend80後面的指定依賴項,為16進位制,上面的語句表明依賴項為launch20 定義的device.exe和launch30中定義的gwes.exe, 注意Launch後面的數字範圍為0到99 ,此範圍之外的將不會有效果。

以上方法都可行,但是都存在一個問題,就是應用程式是整合到NK裡面的,也就是說每次升級應用程式都要重新編譯下載核心,很麻煩,尤其在程式除錯階段,大家都希望把應用程式放在SD卡上,這樣更新起來比較容易;

據說通過第三種方法可以實現,即修改"Launch80"="MyApp.exe"

為"Launch80"="/STDCard/MyApp.exe"( STDCard為SD卡目錄),

但是我試了一下沒有成功,因為Launch80執行時SD卡的檔案驅動還沒有載入,

找不到MyApp.exe檔案。同樣, 採用快捷方式載入SD卡里的應用程式也不可行。


所以我採用了另一種方法,自己編了一個小程式,比如叫ShellExe.exe,將此程式加入到映像裡,通過StartUp快捷方式呼叫ShellExe,ShellExe再去呼叫SD卡里的應用程式,具體實現步驟如下:
1、 在eVC下編譯如下程式碼:



  生成ShellExe.exe的可執行檔案,此段程式碼主要功能是查詢指定的應用程式,然後執行;下面這段程式碼可以保證在SD卡檔案系統正確載入後才去執行應用程式;


 


檔案的名稱和路徑由命令列引數指定:


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不用每次都重新編譯,只要根據應用程式路徑修改Autorun.lnk即可,可以載入Flash、U盤、SD卡里的應用程式。除錯及升級應用程式就不用重新燒寫核心了。

 

二、開機執行MFC程式

 

WinCE開機即執行定製的Shell是很多系統的基本要求,有時還需要遮蔽WinCE自帶的ShellWinCE中程式的自啟動,一般有兩個實現方法,修改登錄檔和新增自啟動快捷方式。修改登錄檔比較方便,如下:

 

 

      只要將MyApp.exe打包到NK,並在platform.reg中加入上面的登錄檔資訊,這樣WinCE啟動時便會自動執行該程式。但這時WinCE自帶的Shell總是先出來,然後才執行MyApp.exe,為了避免這種情況,我們可以將登錄檔設定修改如下:

 

 

      即將原來啟動explorer.exe的值換為MyApp.exe。這樣WinCE啟動時直接進入定製的Shell,而不啟動explorer.exe。但這時有可能引入了新問題,如果定製的Shell是基於MFC編寫的,並且其中用到了如CFileDialog等類庫時,就會出現意想不到的情況,如下圖所示:

 

 

  圖是在不啟動Explorer.exe時,嘗試匯入登錄檔檔案出現的狀況截圖,而在啟動explorer.exe時是沒有問題的。這說明CFileDialog在某種程度上依賴於explorer.exe,具體細節沒研究。但說明不啟動explorer.exe,基於MFCShell執行時就可能會出問題。所以explorer.exe必須啟動,但又不能出現WinCE介面。要解決這個問題自然就想到修改explorer.exe了。WinCE5.0WinCE6.0中,這一部分的程式碼都是公開的,在WinCE6.0Shell的相關程式碼在C:/WINCE600/PUBLIC/SHELL/OAK/HPC/EXPLORER/MAIN目錄下。

     大致看了一下這一部分的程式碼,發現只需修改如下兩個檔案,就應該能實現需求。

 

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

 

 

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

 

 

修改完這兩處後,先編譯該目錄,然後再重新編譯整個系統(執行Sysgen)應該就可以了。Explorer.exe依然啟動,依然可以聽到WinCE啟動的聲音,但WinCE的介面已經遮蔽掉了。此時,基於MFCShell也能正常工作,如下圖所示:

 

在實際操作時,我沒有通過修改原始碼編譯來完成這個測試。因為在編譯C:/WINCE600/PUBLIC/SHELL/OAK/HPC/EXPLORER/MAIN目錄時,發現它只生成了explorer.lib。考慮到重新編譯整個系統的時間太長,所以直接修改了工程目錄下的explorer.exe的檔案,MakeImg後測試的。這裡應該有快速編譯的方法,但目前不知怎麼弄。

      修改後,在WinCE6.0的模擬器中測試,達到了預想的效果。這樣就大概解決了基於MFCShellExplorer.exe之間的矛盾,是不是有隱患還不清楚,目前看來沒問題。

  另外需要注意,修改publicprivate目錄下的檔案時,一定先做好備份,以免後患。