0

在安装过程中,我的应用程序将:

步骤 A,查找C:\WebService目录。如果找到,请执行以下操作:

copy *.bat      --> C:\WebService\
copy boost*.dll --> C:\WebService\libs\
copy myApp.dll  --> C:\WebService\plugins\

步骤 B,如果找不到,请执行以下操作:

copy *.bat --> [LocalAppData]\myApp\bin\
copy *.dll --> [LocalAppData]\myApp\libs\

我怎样才能做到这一点?

编辑:

我通过以下方式完成了第 2 步:

  1. 创建源目录:

    src\bin
    src\libs

  2. 将文件复制到这些子目录

  3. 用于heat扫描 src 目录并将组生成到 wxs 文件中。

这里的问题是,看起来对于步骤 A,我必须再次做同样的事情。但是有大量的 *.dll,将它们再次复制到另一个目录看起来不是一个好主意。

4

2 回答 2

3

您对问题的表述方式表明您对 Windows Installer 的理解存在巨大差距。MSI / WiX 不是脚本语言。您需要了解 AppSearch、功能、目录、组件和条件如何工作。基本上,您需要将文件分组到组件中,并使用 AppSearch 来检测目录是否存在。然后使用条件中的搜索结果来决定安装哪些文件。

于 2012-08-15T11:11:06.630 回答
0

好的,终于搞定了。

简而言之,我通过编写一个 C++ 程序来提供帮助。

详情如下。。

我的 wxs 开头如下:

<Directory Id='TARGETDIR' Name='SourceDir'>
  <Directory Id='WebDir'>
      <Directory Id='INSTALLDIR' Name='$(var.ProductName)'/>
  </Directory>
  <Directory Id='DefaultDir'/>
</Directory>

现在使用heat收获我的源目录来生成另一个 wxs 文件candlelight链接

然后是我的 C++ 程序,它的设计目的是

  1. 扫描整个生成的 wxs 文件以创建另一个目录结构。
  2. 替换目录、组件和文件的所有 ID 以使其唯一。
  3. 为所有新组件生成新的 GUID。
  4. 收集所有新组件 ID 以创建新组件组。

这个新的组件组可以有条件地引用安装,取决于是否有注册表项,或者是否找到目录,在我的情况下是:

  <Feature Id='RuntimeChrome' Level='1'>
    <Condition Level='0'>NOT INSTALLDIR_REGCU AND NOT INSTALLDIR_REGLM</Condition>
    <ComponentGroupRef Id='WebGroup' />
  </Feature>
  <Feature Id='RuntimeDefault' Level='1'>
    <ComponentGroupRef Id='DefaultGroup' />
  </Feature>

有了这些wxs文件,就可以在不同的场景下将包安装到不同的地方。

于 2012-08-18T08:07:13.813 回答