Comment modifier le contenu d'un fichier inclus dans un * .msi avec VBScript
-
30-09-2019 - |
Question
Étant donné un installateur généré avec une DLL .NET projet d'installation VS2010, je voudrais échanger avec un autre sans changer le nom.
Je suis en train de modifier le fichier déjà msi
selon cette question , échanger le contenu d'une entrée dans la table "binaire".
Je trouve le fichier en question à l'aide Orca. Il réside dans le seul fichier CAB. Je trouve ce fichier CAB dans la table « médias ». Je ne sais pas comment changer ce fichier CAB (API) et je pense que je dois changer certaines informations dans la base de données MSI aussi (l'enregistrement « ProcessorArchitecture » pour l'ensemble dans la table « MsiAssemblyName »).
Justification: Je fais un programme d'installation d'un plug-in Autodesk Revit 2011. Ceux-ci sont enregistrés à l'aide d'un RevitAddinUtility.dll
de montage qui doit être livré avec l'installateur. Cet ensemble se décline en deux saveurs, un pour 32 bits et un pour les installations 64 bits. Je dois échanger dans la version correcte lors de la création du programme d'installation, pour éviter d'écrire plus d'un installateur.
La solution 2
Voici une solution que je utilise dans l'intervalle:
- ajouter les deux fichiers, un autre nom
RevitAddinUtility.dll
RevitAddinUtility64.dll
- dans le Postbuild-Event, demander à l'utilisateur si le projet d'installation devrait être pour 64bit.
-
si oui, changer les noms des fichiers:
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
Autres conseils
Commander cet article pour des moyens plus faciles à atteindre votre objectif: