語言選擇: 中文簡體 ∷  中文繁體

公司新聞

WinCE應用程序開發之程序自動運行的解決辦法

  WinCE應用程序開發之程序自動運行的解決辦法
  WinCE應用程序的開發是WinCE開發中很重要的一個環節。本文將簡單介紹一些WinCE應用程序開發的基本概念。
  先說開發工具,目前用得比較多的開發工具有EVC4(SP4)、VS2005、VS2008和Platform Builder。
  其中Platform Builder主要是用來定制操作系統的,雖然也支持編寫應用程序,但用得相對較少。記得沒錯的話,它還得先編譯系統,才能新建應用程序的工程。
  VS2005和VS2008是微軟的集大成開發工具,PB6.0就是作為VS2005的插件安裝的(PB6.0目前應該是不支持VS2008)。在VS2005中,你可以編譯WinCE6.0的操作系統,也可以編譯設備上的應用程序,省去了切換開發環境的麻煩。
  EVC4(SP4)即嵌入式的VC,使用起來基本跟VC6.0一致。
  WinCE應用程序的開發相對桌面Windows應用程序的開發有一些特點,如下:
  1. UNICODE編碼。WinCE中的應用程序只能使用UNICODE編碼,桌面系統則支持UNICODE和ANSI碼。在移植PC端程序到設備上時需要注意這一點。
   2.SDK。SDK即軟件開發支持包,軟件開發都少不了這個,但在WinCE應用程序的開發中尤為重要。因為WinCE系統本身是一個非標的操作系統, 它的組件特性和可裁剪性決定了不同的系統支持的API是不同的。而桌面系統相對標準,SDK的作用就弱化了。WinCE中的SDK由系統開發人員在編譯完 系統后,通過Platform Builder導出。應用程序的開發人員安裝此SDK,并編寫應用程序,最終將應用程序下載到目標平臺上運行測試。一般來說,SDK是應用程序和操作系統 之間的紐帶,但他們之間也并不是完全一一對應的。譬如,在硬件和操作系統都沒調試好時,我們可以先用標準的SDK或者自己定制一個模擬器的SDK進行應用 程序的開發,等硬件和系統調試完成后再做聯調。應用程序基于新的SDK編譯一下,甚至無需重新編譯也可運行。當然,一個應用程序在別的設備上跑得很好,但 到另外一個設備上卻不能工作也是很正常的。就像很多WM上的應用程序在WinCE中不能跑一樣,雖然內核相同,但系統不同,支持的API也是不同的。
  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 S
  Autorun.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被正確執行。

聯系我們

地址:廣東省廣州市黃埔區永和街田園路84號新莊工業園B座

銷售電話:188-1886-3411

企業QQ: 2850909123

E-mail: qxlcd_gz@163.com

用手機掃描二維碼關閉
二維碼
亚盈体育