Entwickler-Ecke

Dateizugriff - Problem mit Installsheeld file ausführen


Cyrus - Mo 06.10.03 09:26
Titel: Problem mit Installsheeld file ausführen
Hallo Leute

Ich arbeite gerade an einem Setup welches andere Setups ausführt. Das setup an welchem ich arbeite ist in Delphi Programmiert und die Setups die ich ausfürhenlassen möchte sind mit InstallSheeld gemacht. Da ich mehere Installsheeld Setups nacheinander installieren will habe ich folgende Funktion verwendet:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
function StartAssociatedExe(FileName: stringvar ErrorCode: Cardinal): Boolean; 
var 
  Prg: string
  ProcessInfo: TProcessInformation; 
  StartupInfo: TStartupInfo; 
begin 
  SetLength(Prg, MAX_PATH); 
  Result := False; 
  ErrorCode := FindExecutable(PChar(FileName), nil, PChar(Prg)); 
  if ErrorCode >= 32 then 
  begin 
    SetLength(Prg, StrLen(PChar(Prg))); 
    FillChar(StartupInfo, SizeOf(TStartupInfo), 0); 
    with StartupInfo do 
    begin 
      cb := SizeOf(TStartupInfo); 
      wShowWindow := SW_SHOW; 
    end
    if CreateProcess(PChar(Prg), PChar(Format('%s %s', [Prg, FileName])), 
      nilnil, False, NORMAL_PRIORITY_CLASS, nilnil, StartupInfo, ProcessInfo) then 
    begin 
      WaitForSingleObject(ProcessInfo.hProcess, INFINITE); 
      GetExitCodeProcess(ProcessInfo.hProcess, ErrorCode); 
      CloseHandle(ProcessInfo.hProcess); 
      CloseHandle(ProcessInfo.hThread); 
      Result := True; 
    end 
    else 
      ErrorCode := GetLastError; 
  end
end;

Ich habe es mit anderen exe files versucht funktioniert einwandfrei nur mit exe files welche mit installsheeld gemacht wurden geht es nicht ich erhalte folgende Fehlermeldung:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Parameter der Befehlszeile: 
/L Sprach-ID 
/S Blenden Sie das Initialisierungsdialogfeld aus. Für die Verwendung im Silent Mode: /S /v/qn. 
/V Parameter für MsiExec.exe 
/UA<url to InstMsiA.exe> 
/UW<url to InstMsiW.exe> 
/UM<url to msi package> 
/US<url to IsScript.msi>

Kann mir jemand sagen was ich machen muss damit es funktioniert?

Danke für eure Hilfe

Greetz Cyrus

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


Delete - Di 07.10.03 09:04
Titel: Re: Problem mit Installsheeld file ausführen
Cyrus hat folgendes geschrieben:
Hallo Leute

Ich arbeite gerade an einem Setup welches andere Setups ausführt. Das setup an welchem ich arbeite ist in Delphi Programmiert und die Setups die ich ausfürhenlassen möchte sind mit InstallSheeld gemacht. Da ich mehere Installsheeld Setups nacheinander installieren will habe ich folgende Funktion verwendet:

[...]

Ich habe es mit anderen exe files versucht funktioniert einwandfrei nur mit exe files welche mit installsheeld gemacht wurden geht es nicht ich erhalte folgende Fehlermeldung:

[...]

Mich würde mal eine Anweisung im Klartext interessieren. Hast du eigentlich mal versucht, dieses InstallShield-Paket von Hand zu starten, so wie es dein Programm versucht. Die Fehlermeldung deutet nämlich darauf hin, dass der MsiExec-Starter Parameter bekommt, mit denen er nichts anfangen kann.
Ich würde dich also mal bitten, dass du dir eins dieser Setup nimmst und mal versuchst, das was deine Funktion macht, per Hand zu probieren. Dann kommst du vielleicht hinter die Ursache.

Nummer #2 ist: Offenbar handelt es sich um die "InstallShield for MSI"-Version. (Die Fehlermeldung bezüglich "MsiExec" deutet darauf hin.) Wenn es sich bei deinem Setup also um eine MSI-Datei handelt, dann gibt es passende Funktionen aus der MSI-API, mit denen du solche Setups starten kannst.

ZuguterLetztlesensichSätzeohneKommaechtbeschissen.UmdirdaszuzeigenhabeichhiermalaufLeerzeichenverzichtet.Denkmaldarübernach!

Gruß.


Tino - Di 07.10.03 09:42
Titel: Re: Problem mit Installsheeld file ausführen
Hallo!

MathiasSimmack hat folgendes geschrieben:
Nummer #2 ist: Offenbar handelt es sich um die "InstallShield for MSI"-Version. (Die Fehlermeldung bezüglich "MsiExec" deutet darauf hin.) Wenn es sich bei deinem Setup also um eine MSI-Datei handelt, dann gibt es passende Funktionen aus der MSI-API, mit denen du solche Setups starten kannst.

Ich glaube in diesem Fall kann er die MSI-API aber nicht benutzen da die Fehlermeldung darauf schließen läßt das sich das MSI-File in einer Setup.exe ähnlichen Datei befindet.

Gruß
Tino


Delete - Di 07.10.03 10:37

Das ist nicht gesagt, Tino. Wenn du mal in die Registry schaust, dann siehst du, dass zum Installieren einer MSI-Datei der Parameter "/i" zusätzlich erforderlich ist. Der Aufruf von

Quelltext
1:
msiexec MSI-Datei                    

erzeugt bei mir ebenfalls eine Fehlermeldung bezüglich ungültiger Parameter. Aber abgesehen davon: niemand außer Cyrus weiß hier, um was für Dateien es sich handelt. Und darum sagte ich ja auch, er soll den Aufruf mal per Hand probieren. Was passiert, wenn eine lauffähige EXE versucht, das für sie zuständige Programm zu finden?

Delphi-Quelltext
1:
ErrorCode := FindExecutable(PChar(FileName), nil, PChar(Prg));                    

Meine Vermutung wäre, dass der Name der EXE selbst zurückgeliefert wird. Ich hab´s nicht probiert. Aber wen dem so ist, dann würde das bedeuten, das Programm startet mit sich selbst als Parameter:

Delphi-Quelltext
1:
if CreateProcess(PChar(Prg), PChar(Format('%s %s', [Prg, FileName])), { ...}                    

Dieser Vermutung widerspricht allerdings das folgende Zitat:
Cyrus hat folgendes geschrieben:
Ich habe es mit anderen exe files versucht funktioniert einwandfrei nur mit exe files welche mit installsheeld gemacht wurden geht es nicht

:?


Tino - Mi 08.10.03 08:36

Ich gehe davon aus das er die MSI API nicht nutzen kann da sich die MSI Datei in einer EXE Datei als Resource oder so befindet und somit nicht direkt ansprechbar ist.

Gruß
Tino


Cyrus - Mi 22.10.03 09:23

sorry für die späte antwort ich war eben in den Ferien!

es handelt sich nicht um msi files sondern um exe files welche man mit IS generieren kann. Diese kann man auch starten z.b. mit shellexecute oder winexec. Somit kann man auch die MSI API nicht nutzen da es sich ja nicht um msi files handelt

Greetz Cyrus


Delete - Mi 22.10.03 10:05

Ich wiederhole mich noch mal:
MathiasSimmack hat folgendes geschrieben:
Was passiert, wenn eine lauffähige EXE versucht, das für sie zuständige Programm zu finden?

Delphi-Quelltext
1:
ErrorCode := FindExecutable(PChar(FileName), nil, PChar(Prg));                    

Meine Vermutung wäre, dass der Name der EXE selbst zurückgeliefert wird. Ich hab´s nicht probiert. Aber wen dem so ist, dann würde das bedeuten, das Programm startet mit sich selbst als Parameter:

Delphi-Quelltext
1:
if CreateProcess(PChar(Prg), PChar(Format('%s %s', [Prg, FileName])), { ...}