Buchempfehlung
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
"Der" Petzold, das über 1000 Seiten starke Standardwerk zum Win32-API - besonders nützlich u. a. bei der GUI-Programmierung in FreeBASIC! [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Code-Beispiel

Code-Beispiele » Dateien und Laufwerke

MSI-Dateien entpacken

Lizenz:Erster Autor:Letzte Bearbeitung:
k. A.Mitgliedhhr 22.06.2020

Windows Installer-Dateien (*.msi) lassen sich mit
msiexec /a Quelldatei /qn TARGETDIR=Zielordner
entpacken.

Die Anzeigeoption /qn verhindert, dass Informationen angezeigt werden. Für mehr Informationen kann /qn durch /qb ersetzt werden.

Das folgende Programm erzeugt die Zeichenketten für Quelldatei und Zielordner und führt obige Anweisung aus.

Weil manche msiexec-Versionen Leerzeichen im Namen des Zielordners eigenwillig behandeln, werden solche Leerzeichen durch Unterstriche ersetzt.

Im Hauptverzeichnis der Partition, in der sich die zu entpackende MSI-Datei befindet, wird ein Ordner TempMsi angelegt, in dem der Zielordner erzeugt wird.

Ein Symbol für eine Verknüpfung befindet sich in %SystemRoot%\System32\msiexec.exe

Erstellt unter Windows 7 mit FreeBASIC 1.06.0

Quellen:
https://www.batboard.net/index.php/Thread/9899-Wie-kann-man-eine-MSI-Datei-entpacken
https://www.freebasic-portal.de/freebasic-faq/dos-fenster-im-hintergrund-beseitigen-2.html
https://www.freebasic-portal.de/code-beispiele/dateien-laufwerke/dialog-datei-oeffnen-speichern-24.html
https://www.freebasic-portal.de/porticula/messagebox-in-freebasic-683.html
https://www.freebasic-portal.de/code-beispiele/windows-gui/messagebox-17.html
https://docs.microsoft.com/en-us/windows/desktop/api/commdlg/ns-commdlg-tagofna
https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-messagebox
https://docs.microsoft.com/en-us/windows/desktop/msi/error-codes

' extractmsi.bas - zu kompilieren mit -s gui (Windows GUI)

Dim As String caption = "ExtractMSI"

Dim As String explorerpath = Environ("windir") & "\explorer.exe"
Dim As String msiexecpath = Environ("windir") & "\System32\msiexec.exe"

' Informationen zu msiexec.exe anzeigen:
'Chain(msiexecpath)

#Include Once "WINDOWS.BI"
#Include Once "win\COMMDLG.BI"

Dim As String strTitle = caption & Space(1) & "-" & Space(1) & "MSI-Datei wählen"
Dim As String strFilter = "Windows Installer-Datei (*.msi)" & Chr(0) & "*.msi" & Chr(0, 0)
Dim As String*MAX_PATH strFile
Dim tagOFN As OPENFILENAME
With tagOFN
   .lStructSize = Len(tagOFN)
   .lpstrTitle = Strptr(strTitle)
   .lpstrFilter = Strptr(strFilter)
   .lpstrFile = Strptr(strFile)
   .nMaxFile = Len(strFile)
   .flags = OFN_HIDEREADONLY Or OFN_FILEMUSTEXIST Or OFN_DONTADDTORECENT
End With

If GetOpenFileName(@tagOFN) Then

   Dim As String destdir, argument

   ' Namen für den Zielordner entnehmen:
   destdir = Mid(strFile, Instrrev(strFile, "\"), Instrrev(strFile, ".") - Instrrev(strFile, "\"))

   ' Nicht erlaubte Zeichen am Ende des Ordnernamens entfernen:
   destdir = Rtrim(destdir, Any Space(1) & ".")

   ' Leerzeichen durch Unterstriche ersetzen:
   Dim As Ushort start = Instr(destdir, Space(1))
   While start
      Mid(destdir, start) = "_"
      start = Instr(start + 1, destdir, Space(1))
   Wend

   ' Zielpfad zusammenstellen:
   destdir = Left(strFile, 3) & "TempMsi" & destdir

   ' Freien Namen für das Zielverzeichnis suchen.
   ' Wenn eine Datei oder ein Ordner dieses Namens vorhanden ist,
   ' wird eine Nummer an den Namen des zu erzeugenden Ordners gefügt:
   Dim As Ushort label = 1
   Dim As String tempdir = destdir
   While Len(Dir(destdir, &hFF))
      label += 1
      destdir = tempdir & "_(" & Str(label) & ")"
   Wend

   ' msifile, strFile - Kodierungszeichen anfügen:
   Dim As String msifile = Chr(34) & strFile & Chr(34)

   ' Parameterzeile zusammenstellen:
   argument = "/a" & Space(1) & msifile & Space(1) & "/qn" & Space(1) & "TARGETDIR=" & destdir

   ' Ausführen:
   Err = Exec(msiexecpath, argument)

   ' Auswerten des Rückgabewertes:
   Dim As String text = Dir(strFile, &hFF) & !"\n\n"
   Dim As Ulong uType

   Select Case Err
   Case -1
      text = "Msiexec.exe konnte nicht gefunden werden:"
      text &= !"\n"
      text &= msiexecpath
      uType = MB_OK Or MB_ICONEXCLAMATION

   Case ERROR_SUCCESS ' Value 0
      If Len(Dir(destdir, &hFF)) Then
         text &= "Die Dateien wurden im Ordner" & Space(1) & destdir & Space(1) & "gespeichert."
         text &= !"\n"
         text &= "Soll der Ordner geöffnet werden?"
         uType = MB_YESNO Or MB_ICONEXCLAMATION
      Else
         text &= "Dieses Installationspaket kann mit diesem Programm nicht entpackt werden."
         text &= !"\n"
         text &= "Error value:" & Space(1) & Str(Err)
         uType = MB_OK Or MB_ICONEXCLAMATION
      End If

   Case ERROR_INSTALL_USEREXIT ' Value 1602
      text &= "Das Kopieren der Dateien wurde abgebrochen."
      uType = MB_OK Or MB_ICONEXCLAMATION

   Case ERROR_INSTALL_PACKAGE_INVALID ' Value 1620
      text &= "Dieses Installationspaket konnte nicht geöffnet werden."
      text &= !"\n"
      text &= "Error value:" & Space(1) & Str(Err)
      uType = MB_OK Or MB_ICONEXCLAMATION

   Case ERROR_INSTALL_PLATFORM_UNSUPPORTED ' Value 1633
      text &= "Dieses Installationspaket wird auf dieser Plattform nicht unterstützt."
      text &= !"\n"
      text &= "Error value:" & Space(1) & Str(Err)
      uType = MB_OK Or MB_ICONEXCLAMATION

   Case Else
      text &= "Es ist ein unbestimmter Fehler aufgetreten."
      text &= !"\n"
      text &= "Error value:" & Space(1) & Str(Err)
      uType = MB_OK Or MB_ICONEXCLAMATION
   End Select

   If MessageBox(0, text, caption, uType) = IDYES Then
      Err = Exec(explorerpath, destdir)
      If Err <> 1 Then
         text = "Explorer.exe konnte nicht gefunden werden:"
         text &= !"\n"
         text &= explorerpath
         uType = MB_OK Or MB_ICONEXCLAMATION
         MessageBox(0, text, caption, uType)
      End If
   End If
End If
End ' extractmsi.bas
'

Zusätzliche Informationen und Funktionen
  • Das Code-Beispiel wurde am 17.02.2019 von Mitgliedhhr angelegt.
  • Die aktuellste Version wurde am 22.06.2020 von Mitgliedhhr gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen