wince6.0下将应用程序放到指定存储设备下运行的方法

来源:互联网 发布:资金合作社软件 编辑:程序博客网 时间:2024/06/02 05:09

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

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

[cpp] view plaincopy
  1. [HKEY_LOCAL_MACHINE\init]  
  2. "Launch50"="explorer.exe"  
  3. "Depend50"=hex:14,00, 1e,00  

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

3、 把应用程序加入到映像,修改注册表:

[cpp] view plaincopy
  1. [HKEY_LOCAL_MACHINE\init]  
  2. "Launch80"="MyApp.exe"   
  3. "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下编译如下代码:

[cpp] view plaincopy
  1. int WINAPI WinMain(HINSTANCE hInstance,  
  2.         HINSTANCE hPrevInstance,  
  3.         LPTSTR    lpCmdLine,  
  4.         int       nCmdShow)  
  5. {  
  6.     WIN32_FIND_DATA fd;  
  7.     HANDLE hd=INVALID_HANDLE_VALUE;  
  8.     int iCount = 20;  
  9.     while(iCount--)  
  10.     {  
  11.         hd=::FindFirstFile(lpCmdLine,&fd);  
  12.         Sleep(500);  
  13.         if(INVALID_HANDLE_VALUE!=hd) break;  
  14.     }  
  15.     if(0==iCount) return 0;  
  16.     FindClose(hd);  
  17.     SHELLEXECUTEINFO ShExeInfo={0};  
  18.     ShExeInfo.cbSize=sizeof(SHELLEXECUTEINFO);  
  19.     ShExeInfo.fMask=SEE_MASK_NOCLOSEPROCESS;  
  20.     ShExeInfo.hwnd=NULL;  
  21.     ShExeInfo.lpVerb=NULL;  
  22.   
  23.     ShExeInfo.lpFile=lpCmdLine;  
  24.     ShExeInfo.lpParameters=L"";  
  25.     ShExeInfo.lpDirectory=NULL;  
  26.     ShExeInfo.nShow=SW_SHOW;  
  27.     ShExeInfo.hInstApp=NULL;  
  28.   
  29.     ShellExecuteEx(&ShExeInfo);  
  30.     return 0;  
  31. }  

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

[cpp] view plaincopy
  1. while(iCount--)  
  2. {  
  3.     hd=::FindFirstFile(lpCmdLine,&fd);  
  4.     Sleep(500);  
  5.     if(INVALID_HANDLE_VALUE!=hd) break;  
  6. }  

文件的名称和路径由命令行参数指定:

[cpp] view plaincopy
  1. ShExeInfo.lpFile=lpCmdLine;  

2、 新建一个快捷方式,如Autorun.lnk,按如下方式编辑其内容:

[cpp] view plaincopy
  1. 21#\windows\shellexe.exe \stdcard\MyApp.exe  

其中\stdcard\MyApp.exe应用程序的绝对路径;

3、 将MyApp.exe和Autorun.lnk添加到NK里,方法是在project.bib文件内加入如下内容:

[cpp] view plaincopy
  1. ShellExe.exe f:\WINCE420\PBWORKSPACES\LioetEnTer\RelDir\ShellExe.exe NK S  
  2. Autorun.lnk f:\WINCE420\PBWORKSPACES\LioetEnTer\RelDir\Autorun.lnk NK S  

注意:ShellExe.exe的属性不能带H(隐藏).

4、 在project.dat里加入如下内容:

[cpp] view plaincopy
  1. Directory("\Windows\Startup"):-File("Autorun.lnk","\Windows\Autorun.lnk")  

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

总结

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

 以上类容属于装载 ;转自:http://www.vckbase.com/index.php/wv/1457

一下类容是自己遇到的问题

Failed reading e32 pointer in module Autorun.lnk 编译出现这样的错误时 有可能是你的打包文件没有放到files下

0 0
原创粉丝点击