Entwickler-Ecke

Dateizugriff - Wechselseitiges Starten einer EXE mit ShellExecute


harryp - Sa 09.04.16 09:25
Titel: Wechselseitiges Starten einer EXE mit ShellExecute
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:


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:

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:

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 - Sa 09.04.16 13:09

Du hast dir offenbar die Parameter für ShellExecute nicht gut genug angeschaut:
https://msdn.microsoft.com/en-us/library/windows/desktop/bb762153%28v=vs.85%29.aspx?f=255&MSPPError=-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.


Nersgatt - 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.


harryp - 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.