代码之家  ›  专栏  ›  技术社区  ›  Daren Thomas

如何使用VBScript更改*.msi中包含的文件的内容

  •  0
  • Daren Thomas  · 技术社区  · 15 年前

    给定一个用VS2010安装项目生成的安装程序,我想在不更改名称的情况下用另一个替换掉一个.netdll。

    我已经在修改 msi this question ,交换“二进制”表中条目的内容。

    我已经用奥卡找到了有问题的文件。它位于唯一的cabinet文件中。我在“媒体”表中找到了这个文件柜。我不确定如何更改这个cabinet文件(API),我怀疑我也必须更改MSI数据库中的一些信息(“msisassemblyname”表中程序集的“ProcessorArchitecture”记录)。

    理论基础: 我正在为Autodesk Revit 2011插件制作安装程序。它们是使用程序集注册的 RevitAddinUtility.dll

    2 回复  |  直到 8 年前
        1
  •  1
  •   Christopher Painter    15 年前

    查看本文,了解实现目标的更简单方法:

    RevitAddInUtility for 32 and 64 Bit Systems

        2
  •  0
  •   Daren Thomas    15 年前

    • 添加两个文件,其中一个名为 RevitAddinUtility.dll 其他的 RevitAddinUtility64.dll
    • 在PostBuild事件中,询问用户安装项目是否应为64位。
    • 如果是,则更改文件名:

      If 6 = MsgBox("Build for 64bit?", 4, "Setup PostBuild event for DesignPerformanceViewer") Then
          Dim installer : Set installer = Wscript.CreateObject("WindowsInstaller.Installer")
          Dim database : Set database = installer.OpenDatabase(PATH_TO_MSI, msiOpenDatabaseModeTransact)
          Dim sqlQuery : sqlQuery = "SELECT `FileName`, `Component_` FROM File"
          Dim view : Set view = database.OpenView(sqlQuery)
          view.Execute
          Dim record : Set record = view.Fetch
          While Not record Is Nothing        
              If InStr(record.StringData(1), "RevitAddInUtility.dll") Then  
                  record.StringData(1) = "REVITA~2.DLL|RevitAddInUtility32.dll"
                  view.Modify msiViewModifyUpdate, record    
              ElseIf InStr(record.StringData(1), "RevitAddInUtility64.dll") Then    
                  record.StringData(1) = "REVITA~1.DLL|RevitAddInUtility.dll"
                  view.Modify msiViewModifyUpdate, record    
              End If    
              Set record = view.Fetch
          Wend
          database.Commit   
      End If