使用 CAB Wizard 创建 Pocket PC 应用程序安装包 - 1
4.77/5 (37投票s)
一篇初学者文章,介绍如何使用 CAB 向导应用程序创建 Pocket PC 应用程序安装包。
引言
当我开发我的第一个 Pocket PC 应用程序时,在创建应用程序的安装包方面我经历了一次噩梦般的体验。我当时正在使用 EVB。为了创建安装包,我使用了 EVB 自带的应用程序安装向导。但当我被要求自定义安装包,例如将我的公司名称替换为普通的“我的公司”时,我知道我遇到了麻烦。我一直使用这个向导,也没有去了解它内部是如何工作的。现在我了解了一些关于创建 Pocket PC 安装包的知识,特别是使用一个名为 CabWiz.exe 的命令行工具,该工具随 Embedded Visual Tools 一起提供,我想与正在进入 Pocket PC 开发世界的各位分享这些知识。
目标
阅读完本文,您将了解
- 什么是 cab 文件?
- 什么是 CabWizard 工具?
- CabWizard 如何生成应用程序安装 cab 文件?
- 如何使用 CabWiz.exe 生成一个简单的 Pocket PC 安装包?
什么是 Windows CE .cab 文件?
- 通过压缩应用程序文件、依赖项(如动态链接库)、图像、注册表项等来创建。
- 由 Pocket PC 模拟器/设备 \windows 目录中一个名为 wceload.exe 的可执行文件处理。
什么是 CabWizard 工具
- 一个名为 CabWiz.exe 的可执行文件。
- 用于生成 Windows CE .cab 文件格式的应用程序安装包。
- 作为 Embedded Visual Tools 3.0 和 Visual Studio .NET 2003 智能设备扩展的一部分提供。
- 由 Embedded Visual Basic 3.0 和 Visual Studio .NET 2003 智能设备扩展使用,用于生成应用程序安装包。
CabWizard 在生成 .cab 文件时需要哪些输入?
- 应用程序的版本详细信息以及其他信息,如应用程序名称、公司名称等。
- 目标硬件平台(MIPS、X86、ARM、SH3)。
- 桌面计算机上应用程序文件和依赖项的源路径。
- 要从给定源路径中提取的应用程序文件和依赖项的名称。
- 在 Pocket PC 模拟器/设备上复制应用程序文件和依赖项的目标路径。
- 如果需要,为设备上的应用程序文件设置的文件属性或操作标志。
- 在 Pocket PC 模拟器/设备上为应用程序创建的快捷方式(如果有)。
- 应用程序安装/卸载时要执行的启动和清理操作(如果有)。
- 应用程序使用的注册表项(如果有)。
- 要在 Pocket PC 模拟器/设备上注册的 COM 对象。
以上指定的这些输入以 .inf 文件的形式被 CabWizard 工具接收,并利用这些输入,为目标硬件平台生成 Windows CE .cab 文件。CabWizard 工具的命令行语法是:
cabwiz.exe <INF_FILE> [destination dirs of .cab files] 
     [error log] [/cpu target_platform1 [target_platform2]]
- inf_file- 包含应用程序安装详细信息的 .inf 文件。 
- destination dirs of .cab files- .cab 文件的目标目录。如果未指定目录,则 .cab 文件将在 - inf_file目录中生成。
- error_log- 用于记录编译过程中遇到的错误和警告的文件。如果未指定文件,则错误和警告将显示在消息框中。 
- target_platform- 为指定的每个平台标签创建一个 .cab 文件。给定的标签应与 .inf 文件中使用的标签相同。 
例如,
cabwiz.exe "c:\myfile.inf" /err myfile.err /cpu sh3 mips
什么是 .inf 文件
- .inf 文件类似于 .ini 文件,包含各种节、键和值,其中包含 CabWizard 工具生成 cab 文件所需的信息。
- .inf 文件中某些节的存在是强制性的。有关节的更多详细信息,请参阅 此处。
以下是 .inf 文件中存在的各种节:
- 版本- 包含应用程序创建者和版本详细信息。 
- CEStrings- 包含应用程序和目录名称的字符串常量,供其他节使用。 
- 字符串- 包含供其他节使用的一个或多个字符串的字符串常量。 
- CEDevice- 应用程序所针对的平台。 
- DefaultInstall- 指定单个安装任务,如安装快捷方式、将常用文件复制到 \windows 目录、将应用程序文件复制到应用程序目录等。 
- SourceDisksNames- 指定桌面计算机上应用程序文件及其依赖项的目录。CabWizard 使用此信息检索应用程序文件和依赖项以生成 .cab 文件。 
- SourceDisksFiles- 指定应用程序文件和依赖项。CabWizard 使用 - SourceDisksNames和- SourceDisksFiles节来检索应用程序文件和依赖项以生成 .cab 文件。
- CopyFiles- 复制设备上文件的指令。 
- AddReg- 包含应用程序使用的注册表项(如果有)。 
- CEShortCuts- 要在 Windows CE 设备上为应用程序创建的快捷方式(如果有)。 
一个简单的例子:
理解概念的最佳方式是动手实践。因此,我们将尝试一个小型示例来更好地理解这个概念。为了方便理解,我将这个示例保持得尽可能简单。
我们将编写一个简单的 EVC 应用程序,并尝试为其编写安装包。EVC?是的,您没听错。但别担心,这是一个非常简单的程序。
也许在完成本文后,您可以创建一个小型 EVB 项目,并尝试使用 EVB 应用程序向导为您的 EVB 应用程序生成安装包。同时,您可以查看生成的 .inf 文件以更好地了解该过程。如果您知道如何修改 EVB 应用程序向导生成的 .inf 文件,您也可以修改它并将其用于 EVC 应用程序。
好的。让我们开始吧。我们先使用 EVC 3.0。为了方便理解,我假设我们的示例应用程序的路径是 C:\。
创建 WIN32 API 应用程序
- 启动 EVC 3.0,
- 选择 文件 = > 新建 = > WCE Pocket PC 2002 应用程序。
- 将项目名称设置为 test2002install。
- 在步骤 1 中,选择“空项目”,然后单击 Finish。
- 创建了一个空项目。选择 文件 = > 新建 = > C++ 源文件。
- 给源文件命名,然后单击 OK 按钮。此时会打开一个 .cpp 文件。
在文件中键入以下行:
#include <windows.h> 
int WINAPI WinMain(HINSTANCE hinstance, 
   HINSTANCE hprevinstance,LPTSTR lpcmdline,int nshowcmd)
{
    MessageBox(0,TEXT("test 2002 installation"),0,0);
    return 0;
}
应用程序做什么?
该应用程序显示一个带有文本“test 2002 installation”的消息框。
编译应用程序
- 选择 生成 => 设置活动配置。
- 选择 Win32[WCE x86 Release]。按 OK。(为 X86 平台编译应用程序)
- 按 F7 键或选择 生成 => 生成 test2002install.exe 来编译项目。
- 再次选择 生成 => 设置活动配置。选择 Win32[WCE ARM Release]。按 OK。(为 ARM 平台编译应用程序)
- 按 F7 键或选择 生成 => 生成 test2002install.exe 来编译项目。
希望您的项目能够成功编译。对于 EVC 新手来说,我们刚刚为 ARM 和 X86 平台编译了程序。但为什么编译两次?因为我们现在处理的是原生代码,所以我们必须为不同的目标平台编译程序,这与 EVB 和 .NET Compact Framework 不同。
在本例中,我们将目标平台设为 ARM 和 X86。因此,此应用程序只能在运行 ARM 处理器的 Pocket PC 模拟器和 Pocket PC 设备上运行。
要在模拟器中运行程序,请确保构建配置为 Win32[WCE x86 Release],方法是转到 生成 => 设置活动配置,然后选择 Win32[WCE x86 Release] 选项。通过选择 生成 => 生成 test2002install.exe 来构建程序。通过选择 生成 => 执行 test2002install.exe 来运行程序。
好的。我们的 EVC 应用程序已准备就绪。现在,我们转到 EVC 应用程序目录,即 C:\test2002install。在那里我们可以看到 ARMDbg、ARMRel、X86Rel 等目录。这些是我们应用程序已编译的平台的目录。以 Dbg 结尾的目录名称包含应用程序的调试版本,而 Rel 包含发布版本。在本例中,我们将考虑 X86Rel 和 ARMRel。
生成 .inf 文件
启动 记事本。打开一个新文档。
首先,我们将设置将在其他节中使用的应用程序名称和应用程序安装目录的字符串常量。为此,我们需要将 [CEStrings] 节设置为如下:
[CEStrings]
InstallDir=%CE1%\%AppName%
AppName="test2002install"
%CE1% 是 \Program Files 的预定义目录常量。预定义目录常量的列表,请参阅 此处。
除了 InstallDir 和 Appname 之外,如果我们使用任何其他字符串常量,我们可以在 [Strings] 节下定义它们。
[Strings]
CompanyName="ABC company"
这样,我们就设置了我们所需的所有字符串常量。接下来,我们将设置应用程序的版本信息,为此我们将使用 [Version] 节。此节有 3 个必需的键 - Signature、CESignature 和 Provider。CESignature 和 Signature 的值分别为 "$Windows CE$" 和 "$Chicago$"。对于 Provider 键,我们分配上面定义的 CompanyName 字符串常量。
[Version]
Signature="$Chicago$"
CESignature="$Windows CE$"
Provider=%CompanyName%
接下来,我们将添加应用程序的快捷方式。我们将它们添加到 [Shortcuts] 节下。条目格式如下:
[Shortcut_Section]
Shortcut_name,Shortcut_type,Target_file,Standard_destination_path
- Shortcut_Section- 节的名称。我们使用 - Shortcuts作为名称。
- Shortcut_name- 快捷方式文件的名称。 
- Shortcut_type- 数字值,指示快捷方式是到文件夹还是到文件。零或空表示快捷方式是到文件。任何非零值都表示快捷方式是到文件夹。 
- target_file- 快捷方式指向的文件/路径。 
- Standard_destination_path- 可选的字符串值,指定快捷方式文件将被创建的路径。如果为空,则使用 - [DestinationDirs]节中给出的路径。
在本例中,我们需要在开始菜单中为应用程序创建一个快捷方式。我们不会提供 standard_destination_path。
[Shortcuts]
%AppName%,0,"test2002install.exe"
%AppName% 是预定义的字符串常量,包含应用程序的名称。
接下来,我们将给出 CabWizard 可以从中检索文件进行处理的桌面计算机上应用程序文件和依赖项的源路径。为此,我们将使用 [SourceDiskNames] 节。说到应用程序文件和依赖项,所有 .exe 和 .dll 文件都是平台特定的,而图像、注册表项、配置文件等是非平台特定的文件。
在 [SourceDisksNames] 节下提供源路径时,我们可以采用两种方法:
- 第一种方法是在一个 [SourceDisksNames]节下提供所有源路径。
- 第二种方法是使用多个 [SourceDisksNames]节来指定平台特定文件和非平台特定文件的源路径。
当应用程序文件和依赖项数量很多时,第二种方法更具模块化。在本例中,我们将采用第二种方法。在提供平台特定文件的源路径时,我们可以指定其平台的标签,例如 [SourceDisksNames.Arm]、[SourceDisksNames.X86] 以供参考。标签方面,只要在整个 .inf 文件和 CabWizard 工具的 /cpu 参数中保持一致即可。
以下是 [SourceDisksNames] 节条目的格式:
[SourceDisksNames]
path_id=,<description> ,,<desktop_path> 
[SourceDisksNames.XXX]
path_id=,<description> ,,<desktop_path>
- path_id- 源路径的唯一标识符。 
- description- 路径的描述。 
- desktop_path- 应用程序文件/依赖项存储在桌面计算机上的路径。可以是绝对路径或相对路径。 
- XXX- 特定平台(如 ARM、X86 等)的标签。 
在本例中,我们没有平台无关的文件,因为可执行文件是平台特定的文件。因此,我们将 ArmRel 和 X86Rel 目录的路径放在 [SourceDisksNames.Arm] 和 [SourceDisksNames.X86] 下,如下所示:
[SourceDisksNames.Arm]
1=,"arm files",,c:\test2002install\ArmREL
[SourceDisksNames.X86]
2=,"X86 FILES",,c:\test2002install\X86Rel
接下来,我们将给出 CabWizard 使用 [SourceDisksNames] 中提供的源路径来提取的应用程序文件的名称。为此,我们将使用 [SourceDisksFiles] 节。就像我们为 [SourceDisksNames] 所做的那样,我们将非平台特定应用程序文件的名称包含在 [SourceDisksFiles] 节中,并将平台特定应用程序文件的名称包含在相应平台对应的 [SourceDisksFiles.XXX] 节下,其中 XXX 是相应平台(如 ARM、X86、SH3 等)的标签。条目格式如下:
[SourceDiskFiles]
filename=path_id,sub_directory
[SourceDiskFiles.XXX]
filename=path_id,sub_directory
- 文件名- 应用程序文件或依赖项的名称。 
- path_id- 在相应的 - [SourceDisksNames]节中使用的- path_id。
- sub_directory- 文件的子目录路径。此值是可选的。 
- XXX- 特定平台(如 ARM、X86 等)的标签。 
在本例中,我们只需要包含为 ARM 和 X86 平台编译的应用程序可执行文件。
[SourceDisksFiles.X86]
test2002install.exe=2
[SourceDisksFiles.Arm]
test2002install.exe=1
到目前为止,我们在 .inf 文件中提供了以下输入:
- 桌面计算机上应用程序文件和依赖项的源路径。
- 应用程序文件和依赖项的名称。
- 应用程序的版本信息。
现在,我们将在 .inf 文件中提供以下输入:
- 将文件复制到设备时要为应用程序文件和依赖项设置的文件属性或操作标志。
- 应用程序文件和依赖项的目标路径。
- 要执行的安装任务。
要设置文件属性,我们可以将所有应用程序文件放在一个节下,并指定要应用的属性。但为了模块化,特别是当有多个应用程序文件和依赖项时,我们可以根据其平台特定性将它们分类到不同的节下,如 [Files.Common]、[Files.Arm]、[Files.X86] 等。用于指示各种平台的标签必须在整个 .inf 文件中保持一致。条目格式如下:
[File_Section_1]
Destination_Filename,Source_Filename,,Action_Flags
[File_Section_2]
Destination_Filename,Source_Filename,,Action_Flags
- Destination_Filename- 特定设备上文件的名称。 
- Source_Filename- 源文件的可选名称。 
- Action_Flags- 复制到设备时要设置的文件属性或操作标志。Windows CE 支持的操作标志或文件属性,请参阅 此处。 
如果目标文件名和源文件名相同,则可以省略 Source_Filename。在本例中,我们只有为 ARM 和 X86 平台编译的应用程序可执行文件,我们将它们分别分类到 [Files.ARM] 和 [Files.X86] 节下。
[Files.ARM]
test2002install.exe
[Files.X86]
test2002install.exe
为了简单起见,我们不会为应用程序文件指定任何文件属性或操作标志。如果没有操作标志,文件将以默认属性或标志复制到设备。
现在,我们需要给出应用程序文件将被复制到设备上的目标目录。为此,我们将使用 [DestinationDirs] 节。条目格式如下:
[DestinationDirs]
File_Section1=0,<Destination_Path>
File_Section2=0,<Destination_Path>
[DefaultDestDir=0,<Destination_Path>]
在本例中,我们不会提供 DefaultDestDir 条目。其他条目将如下所示:
[DestinationDirs]
Shortcuts=,%CE2%\Start Menu
Files.Arm=,%InstallDir%
Files.X86=,%InstallDir%
在这里,我们指定:
- 将快捷方式复制到 \windows\start menu 文件夹。
- 将 [Files.Arm]和[Files.X86]节下的文件复制到应用程序安装目录。
%CE2% 是 \windows 目录的预定义目录常量。预定义目录常量的列表,请参阅 此处。
我们已经给出了应用程序文件和依赖项的目标目录路径。我们定义的所有节就像在程序中定义子例程一样。仅定义子例程,程序不会调用它们。就像那样,就安装程序而言,我们将编写主例程。
[DefaultInstall] 节指定安装任务给 CabWizard,就安装程序而言,这是主例程。在这里,所有定义的节都被整合。这些节的内容被用作输入,以便在设备上安装应用程序。同样,为了模块化,我们可以根据应用程序文件的平台特定性将安装任务分类到各种 [DefaultInstall] 节中。条目格式如下:
[DefaultInstall]
Copyfiles=FileSection_1,FileSection_2
AddReg=Registry_Entry_Section1,Registry_Entry_Section2
CEShortcuts=Shortcut_Section1,Shortcut_Section2
[DefaultInstall.XXX]
Copyfiles=FileSection_1,FileSection_2
CEShortcuts=Shortcut_Section1,Shortcut_Section2
CESetupDLL=setup_dll
CESelfRegister=DLL_Filename1,DLL_filename2
- CopyFiles- 分配给列出应用程序文件的节的名称。在执行期间,会获取文件节下列出的文件,并将其复制到 - [DestinationDirs]节中为该节名称指定的路径。复制时,如果指定了文件属性或操作标志,则会应用于相应的文件。
- AddReg- 分配给包含应用程序使用的注册表项的注册表节。 
- CEShortcuts- 分配给包含应用程序快捷方式的节的名称。 
- CESetupDLL- 分配给 Windows CE 在应用程序安装/卸载期间调用的某些符号的 WIN32 DLL 的名称。 
- CESelfRegister- 分配给应用程序需要在设备上注册的 COM DLL 的名称。 
应用程序的非平台特定文件(如图像、注册表项、快捷方式)可以包含在 [DefaultInstall] 节下,而应用程序的平台特定文件(如可执行文件、COM DLL、应用程序安装 DLL)可以包含在相应的 [DefaultInstall.XXX] 节下,其中 XXX 是平台的标签,如 ARM、X86、SH3 等。我们将在本文的后续部分讨论 CESetupDLL 和 CESelfRegister 键,暂时忽略它们。在本例中,条目将如下所示:
[DefaultInstall]
CEShortcuts=Shortcuts
[DefaultInstall.X86]
CopyFiles=Files.X86
[DefaultInstall.Arm]
CopyFiles=Files.Arm
就是这样。我们已经创建了 .inf 文件。
此处是为供您参考而创建的文件:
[CEStrings]
InstallDir=%CE1%\%AppName%
AppName="test2002install"
[Strings]
CompanyName="ABC Company"    
[Version]
Signature="$Chicago$"
CESignature="$Windows CE$"
Provider=%CompanyName%
[Shortcuts]
%AppName%,0,"test2002install.exe"
[SourceDisksNames.Arm]
1=,"ARM FILES",,c:\test2002install\ArmREL
[SourceDisksNames.X86]
2=,"X86 FILES",,c:\test2002install\X86Rel
[SourceDisksFiles.X86]
test2002install.exe=2
[SourceDisksFiles.Arm]
test2002install.exe=1
[Files.X86]
test2002install.exe
[Files.Arm]
test2002install.exe
[DefaultInstall]
CEShortcuts=Shortcuts
[DefaultInstall.X86]
CopyFiles=Files.X86
[DefaultInstall.Arm]
CopyFiles=Files.Arm
[DestinationDirs]
Shortcuts=,%CE2%\Start Menu
Files.Arm=,%InstallDir%
Files.X86=,%InstallDir%
生成 cab 文件
现在我们将调用 CabWizard 工具,并将 .inf 文件的路径作为参数。由于我们在整个 .inf 文件中将“Arm”和“X86”用作相应平台的标签,因此我们将在 CabWizard 工具的 /cpu 参数中使用相同的标签。假设 Embedded Visual Tools 已安装在 D:\program files 目录中,以下是命令行:
"D:\Program Files\Microsoft eMbedded Tools\EVB\cabwiz.exe" 
    "c:\test2002install\test2002install.inf" /cpu "X86" "Arm".
如果一切执行正确,我们应该能在 c:\test2002install 目录中看到 2 个 cab 文件 - test2002install.Arm.cab 和 test2002install.X86.cab。
测试 .cab 文件
我们可以尝试在 Pocket PC 模拟器或设备上安装 .cab 文件。对于 Pocket PC 模拟器,我们应该使用为 X86 平台生成的 .cab 文件。对于运行 ARM 处理器的 Pocket PC 设备,我们可以使用为 ARM 平台生成的 .cab 文件。要安装 .cab 文件,只需将适当的 .cab 文件复制到模拟器或设备中,然后单击它。要卸载设备上的应用程序,请转到 开始 => 设置 => 系统 => 删除程序,选择 ABC Company test2002install,然后单击 Remove 按钮。我已经成功地用 Pocket PC 2002 和 2003 模拟器测试了 .cab 文件。
结论
尽管使用 CabWizard 工具生成应用程序安装包的整个过程可能看起来有点复杂,但如果您知道如何使用它,就可以在安装包中实现许多功能,例如自定义操作等。希望本文能帮助您更好地理解 CabWizard 的功能。请对本文提供您宝贵的建议(无论正面还是负面)。
