首先需要学习如何将应用程序打包进nk.bin文件中。大概步骤如下
首先,假设你的应用程序为:Embest_Draw.exe。
方法一:主要思想:将应用程序及其快捷方式也添加到映像里,再将快捷方式添加到StartUp目录下,这样当系统运行后应用程序就能自动运行。
步骤:
1先保证原工程文件是可以编译成功的。假设编译好的nk.bin文件所在文件夹为xxx_Relase。
2创建快捷方式文件Embest_Draw.lnk,文件内容如下:
27#"\Windows\Embest_Draw.exe"(注意引号)
3在pb中修改project.bib文件,在FILES Section添加:
Embest_Draw.exe $(_FLATRELEASEDIR)\Embest_Draw.exe NK H
Embest_Draw.lnk $(_FLATRELEASEDIR)\Embest_Draw.lnk NK H
(注:$(_FLATRELEASEDIR)表示xxx_Relase文件夹;NK后面的H表明加入到nk.bin中的文件为隐藏属性)
4 把快捷方式添加到StartUp目录下,具体为:
修改工程的project.dat文件,添加如下内容:
Directory("\Windows\Startup"):-File("Embest_Draw.lnk","\Windows\Embest_Draw.lnk")
5从道理上讲,如果这时把Embest_Draw.exe和Embest_Draw.lnk拷贝到xxx_Relase文件夹下,然后Build->MakeImag的话就会把你的应用程序添加到NK里,但实际情况并非如此,经我实验,先要把工程文件全部rebuild一下,我这儿是sysgen了一下,如果你设置了在编译完后MakeImage 的话,会有错误提示你未在你的磁盘上找到Embest_Draw.exe。不用管它。把Embest_Draw.exe和Embest_Draw.lnk文件拷贝到xxx_Relase文件夹下,然后MakeImage一下(记住此时千万不能再rebuild了,否则会前功尽弃),把生成的NK.bin烧写到flash里,这样就可以看到你的应用程序Embest_Draw.exe自启动了
方法二:主要思想:将应用程序添加到映像里,然后用你的应用程序直接替换Wince的桌面程序。
步骤:
1. 像方法一一样把你的应用程序添加到映象里。
提示:要查看添加映象是否成功,可以在操作系统启动后,看一下windows目录下是否有你的应用程序Embest_Draw.exe(先要设置为可以查看系统文件和隐藏文件)。
2.修改shell.reg(若在pb里找不到,可以到xxx_Relase文件夹下找):不是project.reg,也不是platform.reg,而是工程的保存路径下的xxx_Relase文件夹
[HKEY_LOCAL_MACHINE\init]
"Launch50"="explorer.exe"
"Depend50"=hex:14,00, 1e,00
把这个explorer.exe改成你的应用程序(比如:Embest_Draw.exe),依赖的文件根据自己的应用程序调整。
3. MakeImage一下(还是记住不能再build了),把生成的NK.bin烧写到flash里,这样就可以看到你的应用程序MyApp.exe自启动了.
这样做的好处是启动的时候wince的桌面程序都不会启动了,坏处是当你把应用程序关闭的时候由于原wince桌面程序的丢失而会使机器死机。
方法三:主要思想:将应用程序添加到映像里,然后修改注册表,让应用程序自启动。这回不替换wince的桌面程序,而是让wince像加载桌面一样加载你的应用程序,效果跟方法一是一样的。
在shell.reg文件中[HKEY_LOCAL_MACHINE\init]之下添加如下语句:
"Launch80"="Embest_Draw.exe"
"Depend80"=hex:1E,00
说明:"Depend80"=hex:1E,00用来设置启动顺序和依赖程序,若你的应用程序不依赖于其它程序,这句可以不加
以上方法都可行,但是都存在一个问题,就是应用程序是集成到NK里面的,也就是说每次升级应用程序都要重新编译下载内核,很麻烦,尤其在程序调试阶段,大家都希望把应用程序放在SD卡上,这样更新起来比较容易;据说通过第三种方法可以实现,即修改"Launch80"="MyApp.exe"为"Launch80"="\STDCard\MyApp.exe"( STDCard为SD卡目录),但是我试了一下没有成功,因为Launch80运行时SD卡的文件驱动还没有加载,找不到MyApp.exe文件。同样,采用快捷方式加载SD卡里的应用程序也不可行。
所以采用了另一种方法,自己编了一个小程序,比如叫autoRun.exe,将此程序加入到映像里,通过StartUp快捷方式调用autoRun.exe,autoRun.exe再去调用SD卡里的应用程序,具体实现步骤如下:
在VS2005中编译通过的,选择新建项目,选中Visual C++中的"智能设备(smart device)"中的"Win32 智能设备项目(win32 smart device project)”,然后输入工程名字autoRun和选择保存路径,点击OK,弹出对话框选择next,然后在选择对应的UT2416_SDK,并移除Pocket PC 2003 ,点击next,选择windows application 完成新项目的创建。
将项目中autoRun.cpp中的WinMain函数用下面的函数代替。
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
PROCESS_INFORMATION processinfo;
WIN32_FIND_DATA fd;
HANDLE hd=INVALID_HANDLE_VALUE;
lpCmdLine =_T("\\Storage Card\\ARMV4\\KV_FTP_Server.exe");//根据相应要启动的程序修改此路径
int iCount = 20;//这个值要设得足够大,否则可能等不到SD卡的加载
//等待SD卡文件系统加载完成
while(iCount--)
{
hd=::FindFirstFile(lpCmdLine,&fd);
Sleep(500);
if(INVALID_HANDLE_VALUE!=hd) break;
}
if(0==iCount)
{
CreateProcess(L"\\Windows\\explorer.exe",NULL,NULL,NULL,NULL,CREATE_NEW_CONSOLE,NULL,NULL,NULL,&processinfo);
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;
}
保存并编译文件,然后按照上面讲述的方法将autoRun.exe打包进NK文件中,让其开机运行,这样lpCmdLine =_T("\\Storage Card\\ARMV4\\KV_FTP_Server.exe");路径下指定的文件就会被运行了。