[译]:WiX Toolset入门——创建自定义引导应用

标签: WiX Toolset, Bootstrapper, 官方教程, 中文翻译

博客分类: 官方教程

返回目录索引
本文内容为官方文档多部分整合:
原文链接:

译文链接:WiX Toolset入门——创建自定义引导应用

本文内容只做相应操作的了解,不涉及具体实现。

构建自定义bootstrapper应用程序

Burn可以是一个引导程序、一个下载程序,也可以是一个链接器和一个引擎。作为引导程序时,Burn负责以尽可能少的依赖关系来启动安装程序。而作为下载器时,Burn负责从源媒体(如CD)、独立下载或者网络上来缓存文件。作为链接器时,Burn又负责在一个连续的事务中,安装多个安装包。作为引擎时,Burn将这里的所有功能以接口的方式提供给托管的bootstrapper应用程序。

bootstrapper应用(BA)是一个由Burn引擎加载的dll。此引擎为BA提供了一个名为IBootstrapperEngine的接口来控制引擎。而引擎可以通过IBootstrapperApplication接口从BA获取进度相关信息。

引擎要使用IBootstrapperApplication接口,则需要调用BootstrapperApplicationCreate方法,而此方法必须通过导入BA的DLL获得。此方法如下所示:

extern "C" HRESULT WINAPI BootstrapperApplicationCreate(
    __in IBootstrapperEngine* pEngine,
    __in const BOOTSTRAPPER_COMMAND* pCommand,
    __out IBootstrapperApplication** ppApplication
    )

BOOTSTRAPPER_COMMAND结构体由引擎提供,并且包含从命令行读取的信息。如果方法执行成功,BA会返回它的IBootstrapperApplication接口。当引擎调用IBootstrapperApplication::OnStartup时,BA DLL会提供IBootstrapperEngine接口。

BA DLL还提供了一个可选导出功能(BootstrapperApplicationDestroy),用于在引擎卸载BA DLL之前调用。大多数清理操作都应该在IBootstrapperApplication::OnShutdown中处理,但是有时候,资源是在BootstrapperApplicationCreate中创建的,那它需要在BootstrapperApplicationDestroy中进行处理。方法入口如下:

extern "C" void WINAPI BootstrapperApplicationDestroy()

注意:在WiX Toolset中,升级较小(minor)版本时,必须重新编译bootstrapper应用程序。较小(minor)版本中可以保持源代码的兼容性,但不能保证二进制的兼容性。

bootstrapper应用程序接口

引擎通过回调IBootstrapperApplication接口与bootstrapper应用进行通信。引擎首先要调用的应该是IBootstrapperApplication::OnStartup():

// IBootstrapperApplication::OnStartup
STDMETHOD(OnStartup)() = 0;

通常情况下,BA使用此回调启动一个新的线程并显示用户界面。在BA从OnStartup返回后,引擎就会进入循环等待状态,等待BA通过IBootstrapperEngine传递来的命令。

BA首先要做的是检测,它通过调用IBootstrapperEngine::Detect方法检测:

// IBootstrapperEngine::Detect
STDMETHOD(Detect)() = 0;

检测完后,BA就应该确定了用户要进行什么操作。和以前一样,这里使用向导序列,提示用户选择安装位置功能等。在做完选择决定后,BA会调用IBootstrapperEngine::Plan来执行对应的计划:

// IBootstrapperEngine::Plan
STDMETHOD(Plan)(
    __in BOOTSTRAPPER_ACTION action
    ) = 0;

BOOTSTRAPPER_ACTION是一个枚举类型,用于指定整体的操作。其中最常用的操作为安装,卸载和修复。在计划执行完成后,BA会调用IBootstrapperEngine::Apply来应用更改:

// IBootstrapperEngine::Apply
STDMETHOD(Apply)(
    __in_opt HWND hwndParent
    ) = 0;

BA需要提供一个窗体句柄,以此保证它可以激活并显示在相关窗体上面。此处BA大部分的处理时间将用于处理来自Apply操作的回调。

当BA完成后,需要调用IBootstrapperEngine::Shutdown来通知引擎:

// IBootstrapperEngine::Shutdown
STDMETHOD(Shutdown)(
    __in DWORD dwExitCode,
    __in BOOL fRestart
    ) = 0;

然后引擎会在最后通过IBootstrapperApplication::OnShutdown调用BA:

// IBootstrapperApplication::OnShutdown
STDMETHOD_(void, OnShutdown)() = 0;

译:奇葩史

没有评论