Gast King555 Geschrieben 27. Januar 2004 Teilen Geschrieben 27. Januar 2004 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gast King555 Geschrieben 27. Januar 2004 Teilen Geschrieben 27. Januar 2004 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 27. Januar 2004 Teilen Geschrieben 27. Januar 2004 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). Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gast King555 Geschrieben 27. Januar 2004 Teilen Geschrieben 27. Januar 2004 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 28. Januar 2004 Teilen Geschrieben 28. Januar 2004 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gast King555 Geschrieben 28. Januar 2004 Teilen Geschrieben 28. Januar 2004 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 28. Januar 2004 Teilen Geschrieben 28. Januar 2004 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/ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gast King555 Geschrieben 28. Januar 2004 Teilen Geschrieben 28. Januar 2004 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
grueni Geschrieben 29. Januar 2004 Teilen Geschrieben 29. Januar 2004 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 29. Januar 2004 Teilen Geschrieben 29. Januar 2004 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gast King555 Geschrieben 29. Januar 2004 Teilen Geschrieben 29. Januar 2004 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! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.