对于WindowMobile 上面的程序,微软有一个很详细的要求文件“Designed for WindowsMobile™ Software Application Handbook for Smartphone”。
这份文件大体来说还是很清楚的,里面把程序的方方面面都说得很清楚,但是有关参数NoUninstall地方是非常费解的。
首先根据:
Required: Packages Must Have Setup XML (Smartphone WAP Provisioning)
The Setup XML is generated automatically by CABWizSP. If you wish to create your CAB
manually, you will also have to create this Setup XML manually.
我们可以通过CABWizSP和自己写的一个inf文件生成一个cab文件。
命令如:cabwizsp d:\gbcab\fordopod.inf /dest d:\gbcab /cpu ARM4
inf文件的格式可以参照:
http://msdn.microsoft.com/library/en-us/wcesetup/html/_wcesdk_Creating_an_inf_File_for_the_CAB_Wizard.asp?frame=true
但是一看第二个要求:
Required: Provisioning XML File Must Include Install CSP XML with NoUninstall
The provisioning XML file should include an Install CSP section at the start of the
document, just below the <wap-provisioningdoc> element. This Install CSP XML should
also include the NoUninstall parm.
麻烦了!
CABWizSP生成的cab文件中没有NoUninstall参数!
从微软的资料来看,NoUninstall参数是为了使应用程序在安装的时候不生成任何卸载相关的信息而设置的,如果cab文件的_setup.xml中如果没有这个参数的话,则默认是生成卸载信息的,如果_setup.xml中有该参数,而且值为1的话,那么安装包安装之后则不回生成任何的卸载信息,那么在设置的“删除程序”里面是找不到你的安装的cab。
查资料后,你会发现CABWizSP是可以带一个参数/nouninstall, 不过使用过这个参数后你会发现,加入这个参数CABWizSP是可以生成一个带NoUninstall参数的_setup.xml,但是实际上,这个参数的值为1,导致你的应用程序不能卸载!
不能卸载的程序显然不能通过测试!
因为微软有这样的要求:
Required: Application Must Install/Uninstall Correctly
最后只好把CABWizSP生成的cab文件的内容解出来(windows自己就可以解压,当然你也可以使用winrar)。把里面_setup.xml文件修改好(在<characteristic type="Install">后面加入如下:<parm name="NoUninstall" value="0" />),然后在使用makecab来重新打包文件,当然可能你还需要cabsigner来对你的cab文件进行签名。
使用makecab之前,你需要生成一个有以下内容的ddf文件:
.Set Cabinet=ON
.Set Compress=OFF
.Set CabinetFileCountThreshold=0 ; no files per cabinet threshold
.Set FolderFileCountThreshold=0 ; no files per folder threshold
.Set FolderSizeThreshold=0 ; no folder size threshold
.Set MaxCabinetSize=0 ; no max size for the cabinet
.Set MaxDiskFileCount=0
.Set MaxDiskSize=0
.Set ReservePerCabinetSize=6144 ; for web signing
.Set ReservePerDataBlockSize=0
.Set ReservePerFolderSize=0
.Set UniqueFiles=OFF
.Set DiskDirectory1=d:\gbcab
.Set DiskLabel1=Setup
;
; to be filled out by the CABWIZ.exe program
;.Set InfFileName=
;.Set RptFileName=
;.Set CabinetName1=
;
; followed by the list of files
.Set InfFileName=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\wiz4EC.tmp
.Set RptFileName=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\wiz4ED.tmp
.Set CabinetName1=yourtarget.cab
.Set ReservePerFolderSize=32
.Set Compress=on
;这下面是_setup.xml文件的路径和setup文件的路径
;格式为: 源文件全路径 _setup.xml里面对应的文件名
d:\gbcab\_setup.xml _setup.xml
D:\gbcab\Setup.dll 000Setup.999
.New Folder
;这下面是你的文件的列表
;格式为: 源文件全路径 _setup.xml里面对应的文件名
D:\gbcab\eb_en.ebd 000eb_en.004
D:\gbcab\eb_sc.ebd 000eb_sc.003
然后使用命令:
makecab /F d:\gbcab\your.ddf
你就可以生成yourtarget.cab;然后就可以使用cabsigner对你自己的cab进行签名。
Designed for WindowsMobile™ Software Application Handbook for Smartphone 还对其他的方面提出了要求,我感觉我们还需要注意的是:
1. Dll文件只能放入到\storage\windows目录或者程序本身的目录下(当然我只是针对非rom程序)。
2. \storage\windows和\windows目录只能放置dll。
3. 程序的目录必须在\storage\program file下面。
4. 程序必须能够正常安装卸载,请注意:如果你的程序总是保持一个或者多个你通过cab文件安装上去的文件的可写句柄或者FILE *,你的程序是不能够正常卸载的,但是只读的没有问题。
5. 程序卸载之后应该能够自动清除所有文件(包括程序安装之后才产生的文件)和注册表项。
6. 界面上必须遵循Smartphone的风格,如右键菜单,spinner控件等等。
7. 任何程序都不能阻止用户接电话。
其它部分就不多说了,大家仔细对照Designed for WindowsMobile™ Software Application Handbook for Smartphone就是了。