在windows mobile开发嵌入式软件,不论是j2me,还是其它语言写的什么程序,最后都可以用cabwiz.exe这个打包安装的工具来制作打包安装程序。笔者最近通过开发一个项目对它的体会是:不仅小巧,而且强大。
刚完成在hp 4700 pda下的一个j2me的项目,使用了IBM的J9虚拟机,另外使用了db2 everyplace 嵌入式数据库。最后用cabwiz对整个软件进行打包。点滴经验与大家分享。闲话少说,希望我得到的这点经验能为你打开方便之门。
关键字:cabwiz.exe , cab, j2me ,windows mobile 2003 , windows CE,
二、基本过程:
其实过程很简单:
一,首先,把自己的程序准备好一份,做好安装计划,包括这些文件的目标路径,注册操作都要心中有算。
二,制作打包安装程序的最键部分是要做出一份安装的文件清单,这是一个以.inf为后缀的文件。
三,执行cabwiz.exe生成后缀为.cab的安装包文件
哪最关键的就是怎么写这个.inf文件了,这就是本文的主题了。这里先给出一个完整的例子
三、范文 app.inf
[Version]
Signature = "$Windows NT$"
Provider = "[email protected]"
CESignature = "$Windows CE$"
[CEStrings]
CompanyName="XXX公司"
AppName =移动数据中心
InstallDir=%CE2%/bjtzst
[CEDevice]
[DefaultInstall]
CopyFiles = Files.Application,database,picture,urllink
CEShortcuts = Shortcuts
[SourceDisksNames]
1= ,"txt",,.
2=,"ShortCut",,.
3=,"LIB",,.
4=,"db",,./bjtzdb
5=,"url",,.
[database]
DB2e_LOCK ,,,0x00000001
DSY_DATEINFO ,,,0x00000001
……
……
DSY_UNIT ,,,0x00000001
isyncprefs ,,,0x00000001
[Files.Application]
"tz.jar" ,,,0x00000001
"atz.lnk" ,,,0x00000001
[picture]
"stwater.gif" ,,,0x00000001
[urllink]
"移动数据中心(pda).url" ,,,0x00000001
[Shortcuts]
%AppName%,0,atz.lnk ,%CE17%
.inf文件是是由一系列段落片段组成,每个片段的名字定义都在在方括号中 ([ ]),名字并不区分大小写,相信你也不会取一个超过255个字节的节名,因为哪是不充许的。每一个片段描述了文件的目标地址,快捷方式,注册设置等信息,这些都会被写入 .cab文件中。在安装时发挥作用。虽然这些带片段可以随意排放次序,安装进程只会按照按每段的名字确定这段在inf文件中的次序,但最好还是按照样例子的次序,以提高可读性。
1、内置宏字串
首先要了解的是inf文件中内置了几个固定的宏字串,这些宏字串都是指向windows mobile系统中的固定目录的。在这里两个%及中间的字被视为宏,它们指向的目录都非常的直观,也常用,给后面的配置带来了方便。
%CE1% Program Files
%CE2% Windows
%CE4% Windows/StartUp
%CE5% My Documents
%CE8% Program Files/Games
%CE11% Windows/Start Menu/Programs
%CE14% Windows/Start Menu/Programs/Games
%CE15% Windows/Fonts
%CE17% Windows/Start Menu
2、典型节介绍
下表列出了设备的 Windows CE 信息 (.inf) 文件中出现的典型节。
每节均包含特定的项,其中有些项以预定义的关键字(如 AppName)或指向其他节的指令开头。下表列出了 .inf 文件中的典型指令。
附加 .inf 文件节
对某些节(例如 DefaultInstall),您可以创建附加节以列出安装进程中所用的文件。但是,对这些节必须使用指定的语法。例如,节 DefaultInstall 中的 CopyFiles 指令指向下列多个名为 Files.Application,database,picture,urllink 的编写器命名节,该节列出了默认安装期间使用的目标文件名、源文件名和标志。
[DefaultInstall]
CopyFiles = Files.Application,database,picture,urllink
[Files.Application]
"tz.jar" ,,,0x00000001
"atz.lnk" ,,,0x00000001
……
五、 典型节实例详解
1、Version
[Version] 是必需的,可以指定应用程序的创建者和版本
[Version]
Signature = "$Windows NT$" ; 必选项。用于指定 .inf 文件对哪个操作系统有效的字符串
Provider = "[email protected]" ;在这里填上作者的大名
CESignature = "$Windows CE$"
要注意的是CESignature = "$Windows CE$"是不可以改的。
2、CEStrings
[CEStrings]必选项。它指定应用程序名和默认安装目录的字符串替换或字符串关键字。
[CEStrings]
CompanyName="XXX公司" ;字义字串要注意的是:如果有字串有空格、引号,必得在外
AppName =移动数据中心 ;加””, 如果没有这些情况,字串也可以不加””;
InstallDir=%CE2%/bjtzst ; 也可以在字串中引用宏
3、Strings
[Strings] 可选项。它用于定义一个或多个字符串关键字,
其实就是定义自己的宏字串的地方,如果项目中有用到的话,可以加上。
4、CEDevice
[CEDevice]可选项。指定应用程序支持或不支持的平台。CEDevice 包含如 Windows CE 版本号、处理器类型值和不支持的平台的名称之类的信息。如果使用本机组件,则应包括为那些组件共同支持的每个处理器建立的子节,以便只将为每个处理器生成的 CAB 文件安装到使用相应处理器的设备上。
例如:
[CEDevice]
UnsupportedPlatforms = "HPC" ;您可以在 Winnt.h 头文件中找到受
;Windows CE 支持的处理器及其类型值的列表
但是我开发的是j2me软件,这一选项,就没有什么作用了,把烦人的各种cpu 类型都交给Java虚拟机吧。我得专心投入开发了!不过在一个inf文件中为多种不同cpu类型生成多各种安装打包,是本话题的一个高级话题了。
5、DefaultInstall
[DefaultInstall]必选项。指定有关应用程序的默认安装的信息。其中只需要 Copyfiles 和 AddReg 两项。可选 CEShortcuts 项指向一个通常称为 Shortcuts 的节并且指定在默认安装期间在设备上创建的快捷方式。
[DefaultInstall]
CopyFiles = Files.Application,database,picture,urllink
CEShortcuts = Shortcuts
在这里因为安装的文件多,我创建了许多附加节,以让安装过程更清晰。Files.Application负责安装程序文件,database负责安装数据库,picture处理附加图片,urllink给浏器加一个收藏。
Shortcuts负责安装默认的程序快捷方式。因为做我做的是j2me开发,所以没用到AddReg项。
6、CopyFiles 定义的附加节,语法上要特别注意
例如
[Files.Application]
"tz.jar" ,,,0x00000001
"atz.lnk" ,,,0x00000001
语法:”目标文件名”,” 源文件名”,,标志
如果,源文件名与目标文件名同名的话,则可以省去了源文件名,要注意的是标志前的两个”,,,”号是不能少的,
最后的标志数是一个重要的参数,可以直接用数值表示
7、DestinationDirs
[DestinationDirs] 必选项。指定磁盘上的目标目录的名称和路径,
[DestinationDirs]
Files.Application = 0,%InstallDir%
Shortcuts = 0,%InstallDir%
database = 0,.
picture = 0,%CE5%/个人
urllink = 0,%CE2%/收藏夹
语法: 附加片段名=0,”目标目录”
从上面例子中可以看出,如果你要把文件放在几个不同的目录中,则要按目录生成不同的copyfiles附加节。copyfiles附加节只指定要操作的文件,却不指定目录,指定目录的工作在DestinationDirs中实现,是分别对不同的copyfiles附加节进行指定目录。
8、SourceDisksNames
[SourceDisksNames] 必选项。指定应用程序所驻留的源磁盘上的名称和路径。可以指定多个源磁盘。
[SourceDisksNames]
1= ,"txt",,.
2=,"ShortCut",,.
3=,"LIB",,.
4=,"db",,./bjtzdb
5=,"url",,.
语法: 数字=,” 标签”,,路径
其中数字要按约定从1开始,标签可以描述一下文件的类型。在这里为了方便我的安装文件都在当前目录下,./bjtzdb是当前目录的一个子目录。你也可以用C:/myapp/newfolder,这样的绝对路径。 要注意这里逗号的古怪用法,一个也不能少哟。
9、SourceDisksFiles
[SourceDisksFiles]必选项。在应用程序所驻留的源磁盘上指定应用程序文件的名称和路径。您可指定任意多的项,每个对应于源盘上的一个文件。
[SourceDisksFiles]
移动数据中心(pda).url =5
tz.jar =3
stwater.gif =1
atz.lnk =2
DB2e_LOCK =4
DSY_DATEINFO =4
DSY_DATE_TYPE =4
在这里就是要把每一个要安装的文件它所在的源文件目标简洁的表达出来,利用SourceDisksNames片段中定义的源文件目录, 这样就可以把所有文件所在的源盘及路径简单表示出来。
10、CEShortcuts
[CEShortcuts] 可选项,出现在 DefaultInstall 节中,用于指定安装进程在设备上创建的快捷方式,面前定义的CEShortcuts = Shortcuts附加节中。我们要完成为程序加入一个快捷方式的工作。
[Shortcuts]
%AppName%,0,atz.lnk ,%CE17%
语法: “菜单名”,标志数,目标文件,目标目录
在这里我们用到了前面定义的宏字串,及系统默认的宏,这样把我们做的atz.lnk快捷方式,加入到Windows/Start Menu目录下,并在菜单中命名为“移动数据中心”。其中标志数,是必选项。用于指定快捷方式是指向文件还是文件夹的整数。零或空值表示指向文件的快捷方式,非零值则表示指向文件夹的快捷方式。
六、执行cabwiz.exe语法
讲完了编写inf文件要注意的事项,接下来就是用cabwiz来打包,生成安装文件了。
语法:
cabwiz.exe "inf_file_and_path" [/dest dest_Directory] [/err error_file] [/cpu cpu_type [cpu_type]]
inf_file_and_path 必选项。用于为 .inf 文件指定完整路径和文件名的字符串。
dest_directory 可选项。用于为 CAB 指定目标目录的参数。如果不指定目录,Cabwiz.exe 将在 .inf 文件驻留的目录创建 CAB 文件。
error_file 可选项。用于为日志文件指定文件名的参数,创建该日志文件的目的是为了包含编译 CAB 文件时生成的所有错误和警告。如果使用文件名,则 Cabwiz.exe 显示消息时不出现用户界面,这对自动生成很有用。如果不指定文件名,Cabwiz.exe 会在消息框中显示警告和错误。
cpu_type 可选项。用于指定要为其创建 CAB 文件的每个处理器的参数。/cpu 参数在命令行上必须作为最后的参数出现,后面跟随多个 cpu_type 值。
我的这个最简单,不管cpu的类别,把cabwiz.exe和它的相关程序都放在我的当前目录下,
把inf文件命名为 app.inf ,我的简单例子如下
cabwiz "app.inf" /err log.txt
如果打包出现问题,log.txt会记录下来所有的信息。有时它也发出一些可以略过的信息,比如告诉你你定义的宏没有使用到之类的信息
七,写在最后
最后,最容易出问题的地方就是标点符号。我最怕麻烦了,我认为最明智的做法就是不用下面提到的特殊用法,如果你实在是避不开的话,就要小心了。
1. 在 .inf 文件中,使用分号 (;) 开始每个注释行。.inf 文件分析器会跳过与分号同处一行并出现在分号后面的任何字符,除非分号出现由引号 (") 或百分比符号 (%) 括起的字符串中,例如,"stri;ng" 或 %stri;ng%。
2. 使用字符串替换或字符串关键字(如 AppName)时,请用百分比符号 (%) 将它们括起来。用两个相邻的百分比符号 (%%) 表示字符串关键字名称中的 % 字符。
3. 在需要断开项的地方插入反斜杠 (/) 可在下一行继续编写该项。 但是,如果项或指令指定了一个以反斜杠结束的值(如目录路径),请将字符串或反斜杠用引号括起来。例如,用 /Programs/MyTestApps"/" 或 "/Programs/MyTestApps/" 可将反斜杠重新解释为行继续符。
4. 用逗号 (,) 将节项中提供的值分开。在值列表中间省略某个可选值时,必须保留逗号。但是,在用于 Windows NT操作系统的 .inf 文件中可以省略后缀逗号。
5. 用下划线 (_) 表示字符串关键字名称中的空格。