MSI ausführen

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Boneless
Beiträge: 52
Registriert: So 1. Dez 2013, 14:15
OS, Lazarus, FPC: Windows 7 (L 1.0.14 - FPC 2.6.0)
CPU-Target: 64Bit
Wohnort: Ostsee

MSI ausführen

Beitrag von Boneless »

Hallo liebes Forum,

ich bin auf ein Problem gestoßen, was mich etwas wundert.. Nämlich:
Wenn ich ein Befehl in einem ButtonClick-Event namens

Code: Alles auswählen

SysUtils.ExecuteProcess( UTF8ToSys( 'MSInstaller.msi'), '''' , []);
 
eingebe, ich das Programm dann kompiliere und ausführe, erscheint die Meldung "Failed to Execute" (das Übliche). Diese msi-Datei ist 100%ig im selben Ordner.
Gibt es also für MSI's ein anderen Befehl / andere Befehle ?

LG Boneless

Code: Alles auswählen

program Boneless;
 
 {$mode Einsteiger}{H+}

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: MSI ausführen

Beitrag von theo »

Boneless hat geschrieben: Gibt es also für MSI's ein anderen Befehl / andere Befehle ?
Google fagen! Das hat ja nichts mit Lazarus zu tun.
https://www.google.ch/search?q=execute+msi+file

P.S. Alternativ geht es vllt. auch mit ShellExecute unter Windows.

Boneless
Beiträge: 52
Registriert: So 1. Dez 2013, 14:15
OS, Lazarus, FPC: Windows 7 (L 1.0.14 - FPC 2.6.0)
CPU-Target: 64Bit
Wohnort: Ostsee

Re: MSI ausführen

Beitrag von Boneless »

Habs mit ShellExecute ausprobiert.

Passiert rein gar nichts :D

Code: Alles auswählen

ShellExecute(0,'open',PChar('MSInstaller.msi'),nil,nil,sw_show);
Oder ist dort was falsch??

Code: Alles auswählen

program Boneless;
 
 {$mode Einsteiger}{H+}

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: MSI ausführen

Beitrag von theo »

Und die Links in Google hast du gelesen? Was hast du damit gemacht?

Boneless
Beiträge: 52
Registriert: So 1. Dez 2013, 14:15
OS, Lazarus, FPC: Windows 7 (L 1.0.14 - FPC 2.6.0)
CPU-Target: 64Bit
Wohnort: Ostsee

Re: MSI ausführen

Beitrag von Boneless »

Ja, habe ich. Habe auch noch nach weiterem gesucht.
Aber die msi datei kann ich so auch ganz normal öffnen, per Doppelklick, als Administrator usw. Das ist alles in Ordnung. Meine Frage ist nur, kann ich dies auch irgendwie über Lazarus öffnen, in dem Programm, was ich schreibe?

Code: Alles auswählen

program Boneless;
 
 {$mode Einsteiger}{H+}

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: MSI ausführen

Beitrag von theo »

Boneless hat geschrieben:Ja, habe ich.
Wenn du den ersten Link liest, fällt dir wirklich nichts auf?
Ich habe davon keine Ahnung, habe nur mal für dich gegoogelt.
Dort steht doch eindeutig, dass man nicht das ".msi ausführt sondern die Anwendung msiexec.exe mit dem Parameter des msi Dateinamens startet.
Siehst du das denn nicht?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: MSI ausführen

Beitrag von Michl »

Geht schon zu starten, aber nicht direkt von einem TProcess aus.

Eine Möglichkeit wäre z.B. eine "Start.bat" zu erstellen, die einfach den Inhalt "MSInstaller.msi" hat und diese per Process starten (funktioniert, eben probiert!).

Nächste Möglichkeit wäre über starten von "cmd":

Code: Alles auswählen

uses ..., Process;
...
procedure TForm1.Button1Click(Sender: TObject);
var
  P:TProcess;
begin
  P:=TProcess.Create(Nil);
//  P.Executable:='Start.bat';
  P.Executable:='cmd';
  P.Parameters.Add('/C');                 //Parameter /C bedeutet dass cmd die nachfolgende Codezeile ausführen soll
  P.Parameters.Add('MSInstaller.msi');    //auszuführende Codezeile
//  P.Parameters.Add('/k');               //Falls nicht gestartet wird bleibt mit /k das Konsolefenster sichtbar
  P.Execute;
  P.Free;
end;  
Achtung: Immer Ärger machen Leerzeichen im Pfad, man kann probieren ob Hochklammern helfen...

Teste noch die anderen Möglichkeiten...
Zuletzt geändert von Michl am Mi 25. Dez 2013, 20:35, insgesamt 2-mal geändert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: MSI ausführen

Beitrag von m.fuchs »

Und da die *.msi mit der Anwendung verknüpft ist unter Windows, hilft dir sicherlich die Prozedur OpenDocument aus der Unit LCLIntf. Damit ist das Ganze dann gaaaanz einfach. :)

Frohe Weihnachten
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: MSI ausführen

Beitrag von theo »

m.fuchs hat geschrieben:Und da die *.msi mit der Anwendung verknüpft ist unter Windows, hilft dir sicherlich die Prozedur OpenDocument aus der Unit LCLIntf. Damit ist das Ganze dann gaaaanz einfach. :)
Dann müsste aber mMn ShellExecute auch funzen unter Win, oder nicht?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: MSI ausführen

Beitrag von Michl »

Ja die kürzeste und einfachste Möglichkeit ist wohl die von M.Fuchs:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  OpenDocument('MSInstaller.msi');
end; 
funktioniert auch :)

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: MSI ausführen

Beitrag von Michl »

theo hat geschrieben:Dann müsste aber mMn ShellExecute auch funzen unter Win, oder nicht?
Ja funktioniert ebenfalls! Ich tippe auf Leerzeichen im Pfad, die machen immer Ärger!!!

Mein persönlicher Favorit ist immer noch TProcess und cmd siehe oben, da hat man immer noch die Chance mit /k zu erfahren, warum die Ausführung scheitert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: MSI ausführen

Beitrag von theo »

Michl hat geschrieben: Mein persönlicher Favorit ist immer noch TProcess und cmd siehe oben, da hat man immer noch die Chance mit /k zu erfahren, warum die Ausführung scheitert.
Wenn du schon am Varianten durchtesten bist (habe momentan kein Windows zur Hand), warum geht's so in der Art nicht, mit ExecuteProcess oder TProcess?

Code: Alles auswählen

C:\Windows\System32\msiexec.exe -i C:\<pfad>\<filename>.msi

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: MSI ausführen

Beitrag von Michl »

Hab ja nicht behauptet, dass das so nicht gänge (nur eben nicht *.msi direkt), eben getestet:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  P:TProcess;
begin
  P:=TProcess.Create(Nil);
  P.Executable:='C:\Windows\System32\msiexec.exe';
  P.Parameters.Add('-i');       
  P.Parameters.Add('MSInstaller.msi'); 
  P.Execute;
  P.Free;
end;
funktioniert ebenfalls :)

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: MSI ausführen

Beitrag von theo »

Michl hat geschrieben:funktioniert ebenfalls :)
Siehste. :D
Auf diese Lösung wollte ich Boneless eigentlich bringen, nachdem er sagte ShellExecute läuft nicht.
Das benötigt die Umleitung über cmd nicht, aber man müsste natürlich die Exe finden. Muss ja nicht auf C: sein. Pfad wird benötigt, oder?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: MSI ausführen

Beitrag von Michl »

Nö, sollte immer schon im Win-System-Pfad (bei mir der 1.Eintrag) vorhanden sein (cmd . exe ist ja im selben Verzeichnis)!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antworten