Zum Inhalt springen

Delphi 6: Anwendung starten und auf Beendigung warten - Aber zweimal hintereinander!


Gast King555

Empfohlene Beiträge

Ich habe folgende Funktion:


function WinExecAndWait32(Filename: String; Visibility: Word): Integer;

//*******************************************************************

// Startet die angegebene Anwendung und wartet auf deren Beendigung

// Rückgabewert: -1 bei Fehler, sonst den "ExitCode" der Anwendung

//*******************************************************************

var

  zAppName: array[0..512] of char;

  zCurDir : array[0..255] of char;

  WorkDir : string;

  StartupInfo: TStartupInfo;

  ProcessInfo: TProcessInformation;

  {$IFNDEF Delphi3Below}

    CardinalResult: cardinal;

  {$ENDIF}

begin

  StrPCopy(zAppName, FileName);

  GetDir(0, WorkDir);

  StrPCopy(zCurDir, WorkDir);

  FillChar(StartupInfo, Sizeof(StartupInfo), #0);

  StartupInfo.cb := Sizeof(StartupInfo);

  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;

  StartupInfo.wShowWindow := Visibility;

  if not CreateProcess(zAppName,

                       zAppName, { pointer to command line string }

                       nil, { pointer to process security attributes }

                       nil, { pointer to thread security attributes }

                       false, { handle inheritance flag }

                       CREATE_NEW_CONSOLE or { creation flags }

                       NORMAL_PRIORITY_CLASS,

                       nil, { pointer to new environment block }

                       nil, { pointer to current directory name }

                       StartupInfo, { pointer to STARTUPINFO }

                       ProcessInfo) then { pointer to PROCESS_INF }

    Result := -1

  else

    begin

      WaitforSingleObject(ProcessInfo.hProcess, INFINITE);

      {$IFNDEF Delphi3Below}

        GetExitCodeProcess(ProcessInfo.hProcess, CardinalResult);

        Result := CardinalResult;

      {$ELSE}

        GetExitCodeProcess(ProcessInfo.hProcess, Result);

      {$ENDIF}

      CloseHandle(ProcessInfo.hProcess);

      CloseHandle(ProcessInfo.hThread);

    end;

end; {WinExecAndWait32}

Nun möchte ich erst das Interbase Client Setup starten, dann das BDE Setup. Meine Delphi 6 Anwendung soll jeweils auf die Beendigung des Setups warten und erst dann weiter machen.

Das IB Client Setup startet, danach macht mein Programm auch weiter, aber dann bleibt meine Anwendung vor dem Starten des BDE Setups stehen. Wenn ich meine Anwendung mit dem Taskmanager abschieße, wird das BDE Setup erst gestartet.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe mittlerweile nach stundenlangem Testen und intensiver Fehlersuche herausgefunden, dass man das BDE Setup mit der angegebenen Funktion überhaupt nicht starten kann (ich weiß, das hätte ich auch früher merken können).

Jetzt frage ich mich natürlich: Warum kann ich damit das BDE Setup nicht ausführen? Das Interbase Client Setup und beliebige Windows Anwendungen kann ich damit starten.

Link zu diesem Kommentar
Auf anderen Seiten teilen

hm... vielleicht weil du es mit CREATE_NEW_CONCOLE als Konsolen Anwendung starten willst? (keine Ahnung ehrlich gesagt)

Mein Aufruf sieht etwas kleiner aus und ich hab damit keine Probleme:


procedure TForm1.btnInstallClick(Sender: TObject);

var StartupInfo: TStartupInfo;

    ProcessInfo: TProcessInformation;

    ClientInstalled: Boolean;

begin

  FillChar(StartupInfo, sizeOf(TStartupInfo), 0);

  StartupInfo.cb:= SizeOf(TStartupInfo);

  if CreateProcess(nil, PChar(SetupPfad), nil, nil, False, NORMAL_PRIORITY_CLASS,

     nil, nil, StartupInfo, ProcessInfo) then

  begin

    //*** Warten bis Setup beendet ist

    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);

    CloseHandle(ProcessInfo.hProcess);

    //*** Buttons anpassen

    ClientInstalled := CheckClient;

    btnInstall.Enabled := not ClientInstalled;

    btnStart.Enabled := ClientInstalled;

  end;

end;

SetupPfad ist der Pfad zur Exe.

Edit:

Mir ist auch aufgefallen, dass du StartupInfo mit einem Ascii 0 füllst (#0).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Funktion habe ich aus dem Internet, ich habe daran nichts geändert. Die Funktion funktioniert ja eigentlich bestens, nur eben mit dem BDE Setup nicht. Funktioniert denn dein Code mit dem BDE Setup?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich hab es gerade mal mit der BDE probiert (hät ich vielleicht davor schon tun sollen ;) ) und es geht nicht. Allerdings:

Wenn ich mein Programm dann beende (abschiesse) kommt die BDE-Setup Meldung, dass er die _setup.dll nicht gefunden hat.

Für die BDE Installation reicht die setup.exe allein nicht aus.

Also habe ich alle weiteren Dateien in den Ordner kopiert.

Über CreateProcess will es dann immernoch nicht so ganz... Er startet irgendwas und dann bleibt mein Programm hängen (ich hab es ausserhalb von Delphi gestartet). Nachdem ich das Programm beende (den Task) wird die BDE Installation fortgesetzt.

Komisch...

Ich hab allerdeing eine andere Idee:

Du installierst zuerst Interbase und danach die BDE? Dann starte Interbase über CreateProcess und das BDE Setup uber ShellExecute:

ShellExecute(handle, 'open', PChar(Pfad), '', '', SW_RESTORE);

Das funktioniert mit dem BDE Setup.

Der Unterschied zu CreateProcess ist, du kannst nicht auf das Ende vom Programm warten, aber da es ja die 2te Installation ist sollte es ja egal sein.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Leider geht es mit ShellExecute nicht, weil ich in meinem Programm BDE Aliase anlege, und dazu muß die BDE logischerweise installiert sein. Ich muss also unbedingt auf die Beendigung des fremden Setups warten können.

Link zu diesem Kommentar
Auf anderen Seiten teilen

hmmm... Und wie wäre ein Installationsskript?

Bei Delphi ist InstallShield Light dabei... hm... ich überlege gerade... da war irgendwas mit der Installation der BDE... ich glaube es ist nur die Benutzung von InstallShieldExpress erlaubt um die BDE mit deinem Programm zu installieren. Bin mir aber nicht 100% sicher (90% aber). Das könnte der Grund sein, warum sich die BDE weigert wenn sie von einem Programm aufgerufen wird. Du müsstest mal im Delphi handbuch kucken, ich glaub da stand was (Thema Distribution der eigenen Anwendung oder so).

Egal, auf jeden Fall sollte es ja mit so einem Programm möglich sein mehrere Programme zu installieren und danach REgistry Einträge anzulegen (Aliase).

Ich kann dir auch InnoSetup empfehlen. Ist umsonst und keine light Version.

http://www.jrsoftware.org/

Link zu diesem Kommentar
Auf anderen Seiten teilen

Eine fremde Setup-Erstellungssoftware kommt leider nicht in Frage, ich schreibe ja gerade selbst an einer (aus meinem eigenen Setup starte ich das IB- und das BDE-Setup). Das Setup ist ein ganz spezielles Installationsprogramm für eine bestimmte Anwendung. Da sind so viele Dinge nötig, dass man ein eigenes schreiben musste.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Versuchs doch mal so:

-mit dem InstallShield eine Installations-Routine erstellen, die nur die BDE installiert

-aus deiner eigenen Installations-Routine den InstallShield aufrufen

Die BDE sollte laut Borland nicht über "selbst gestrickte" Installationen installiert werden, sondern nur über von Borland abgesegnete Produkte (z.B. InstallShield)

Vorsicht ! Hab im bdn (bdn.borland.com)Einträge gefunden, daß eine BDE Installation u.U. IB-Treiber überschreibt. Schau da lieber vorher nach.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von King555

Da sind so viele Dinge nötig, dass man ein eigenes schreiben musste.

Kann ich mir jetzt nicht ganz vorstellen, aber ist ja auch egal... ihr werdet ja wissen was ihr tut ;) Wenn du ein eigenes Programm für die "Dinge" benötigst, kannst du von Install-Programm (InstallShield, InnoSetup) auch eine ExeDatei starten (also nach der Installation der BDE). Diese Exe wäre dann ein Programm von dir, was eben die benötigten "Dinge" erledigt.

Wobei ich natürlich nciht weiss, ob das so zu machen ist (also bei euren Anforderungen), aber ist mal eine Idee.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich denke, ich werde das BDE Setup nun einfach mit ShellExecute starten und dann eine MessageBox anzeigen, die man mit OK bestätigen muss, sobald das BDE Setup abgeschlossen wurde. So bleibt das Programm solange stehen, bis die BDE installiert wurde. Keine schöne Lösung, aber scheinbar die einzigste Lösung für mein spezielles Problem.

Danke für deine Tipps!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...