Autor Beitrag
harryp
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 52
Erhaltene Danke: 9

Win 8.1
Delphi 7, XE8
BeitragVerfasst: Sa 09.04.16 09:25 
Liebe Delphientwickler, ich brauch mal eure Hilfe,

ich führe bei meinen Zehnern grad ein kleines Softwareprojekt durch, in dessen Rahmen die Schüler eine Anwendung als Vorstellung unserer Schule schreiben sollen. Eine Schülergruppe hat es sich in den Kopf gesetzt ein Hauptprogramm zu erstellen und von dort aus Teilprogramme zu starten. Die Einbindung will diese Gruppe jedoch nicht per Show/ ShowModal o.ä. machen, sondern die EXE-Datei jeweils per ShellExecute (oder WinExec) starten. Sie schließen dabei nach dem Öffnen des Teilprogramms das Hauptprogramm und umgekehrt.

Nun tritt folgendes Phänomen auf:
  • Startet man vom Hauptprogramm aus Teilprogramm 1, schließt sich das Hauptprogramm (gewollt). Starte ich nun vom Teilprogramm 1 aus das Hauptprogramm schließt sich einfach Teilprogramm 1 und das Hauptprogramm startet nicht.
  • Startet man vom Teilprogramm aus das Hauptprogramm, schließt sich das Teilprogramm (gewollt). Starte ich nun vom Hauptprogramm aus das Teilprogramm, schließt sich einfach das Hauptprogramm und das Teilprogramm öffnet sich nicht.


Meine Fragen an euch:
  1. Gibt es irgendetwas das beim Starten via ShellExecute oder WinExec einen Besitzer o.ä. deklariert und somit verhindert, dass beim wechselseitigen Aufruf der ursprüngliche Besitzer (das zu erst gestartete Programm) ausgeführt wird?
  2. Gibt es eine Möglichkeit unter Nutzung von ShellExecute oder WinExec diesen wechselseitigen Start zu realisieren oder müssen die Schüler auf die Einbindung via Show/ShowModal zurückgreifen?


Code-Ausschnitt aus Hauptprogramm:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Button1Click(Sender: TObject);
begin
  rueckmeldung := ShellExecute(0'open''Keller\Project2.exe'nilnil, SW_NORMAL);
  if rueckmeldung > 32 then Label3.Caption := 'Das Starten war erfolgreich.'
                       else Label3.Caption := 'Da gab es wohl ein Problem beim Starten.';
  close;
end;


Code-Ausschnitt aus Teilprogramm:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Button1Click(Sender: TObject);
begin
  rueckmeldung := ShellExecute(0'open''..\Project1.exe'nilnil, SW_NORMAL);
  if rueckmeldung > 32 then Label1.Caption := 'Das Starten war erfolgreich.'
                       else Label1.Caption := 'Da gab es wohl ein Problem beim Starten.';
  close;
end;



Vielen Dank im Voraus für die Antworten.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 09.04.16 13:09 
Du hast dir offenbar die Parameter für ShellExecute nicht gut genug angeschaut:
msdn.microsoft.com/e...SPPError=-2147217396 hat folgendes geschrieben:

lpDirectory [in, optional]
Type: LPCTSTR
A pointer to a null-terminated string that specifies the default (working) directory for the action. If this value is NULL, the current working directory is used. If a relative path is provided at lpFile, do not use a relative path for lpDirectory.

Du startest also (mal angenommen) aus Verzeichnis c:\test\abc heraus die Datei ..\Project1.exe. Die Project1.exe liegt also in c:\test, läuft aber nun in c:\test\abc und du startest von dort aus die Datei Keller\Project2.exe. Sprich die Datei c:\test\abc\Keller\Project2.exe. In Wirklichkeit liegt die Datei aber ein Verzeichnis höher in c:\test\Keller\Project2.exe.

Deshalb wird die jeweils andere Exe danach nicht gefunden.

Du musst also lediglich das jeweilige Zielverzeichnis als aktuelles Verzeichnis der aufgerufenen Exe angeben. Und entsprechend der Dokumentation muss dieses aktuelle Verzeichnis ein absolut angegebenes Verzeichnis sein, wenn du ein relatives Verzeichnis als Dateiname angibst.

Für diesen Beitrag haben gedankt: harryp
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Sa 09.04.16 14:04 
Abgesehen von dem Problem (hat Sebastian ja schon erklärt), wird der Benutzer so nie die Möglichkeit haben zu kesen, was in dem Label steht.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
harryp Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 52
Erhaltene Danke: 9

Win 8.1
Delphi 7, XE8
BeitragVerfasst: So 10.04.16 11:23 
Danke für die Antworten.

Ja, es war mir schon klar, dass das im Label nie gesehen wird - das war auch nur zu Testzwecken drin.

Das Problem mit dem relativen Pfad war wirklich das entscheidende Problem. Nach Umwandeln auf einen absoluten Pfad funktioniert es. Danke jaenicke.