Entwickler-Ecke

Windows API - Shellexecute funktionsprobleme beim Aufrufen einer bat-Datei


Grafix - Do 15.07.10 23:50
Titel: Shellexecute funktionsprobleme beim Aufrufen einer bat-Datei
Hallo,

ich möchte mit Shellexecute eine bat-Datei aufrufen, die dann ein JavaProgramm initialisiert. (Das Programm ist der WOM-Client von Minecraft). Anzumerken ist, dass die bat-Datei prüft, ob eine bestimmte Java-Datei vorhanden ist - was sie definitiv ist.
Will ich diese Bat-Datei nun mit dem shellexecute Befehl starten, gibt die batch eine Fehlermeldung, dass eben diese Datei nicht vorhanden sei. Starte ich sie direkt mit Doppelklick, funktioniert alles so wies soll... Woran kann das liegen? Der Fehler wird doch wohl bei meiner Programmierung liegen, nicht an der Batch oder?

Danke für alle Hinweise

Lg

Grafix


jaenicke - Do 15.07.10 23:53

Du hast bei deinem Aufruf von ShellExecute [http://msdn.microsoft.com/en-us/library/bb762153(VS.85).aspx] den Parameter für das Arbeitsverzeichnis nicht (oder falsch) gesetzt...


Grafix - Fr 16.07.10 00:04

Ahh danke, daran lag's.

So nebenbei, nach welchem Stichwort muss ich suchen, wenn mein Delphiprogramm überwachen und reagieren soll, wenn das aufgerufene Programm wieder geschlossen wird?


Gerd Kayser - Fr 16.07.10 00:47

user profile iconGrafix hat folgendes geschrieben Zum zitierten Posting springen:
So nebenbei, nach welchem Stichwort muss ich suchen, wenn mein Delphiprogramm überwachen und reagieren soll, wenn das aufgerufene Programm wieder geschlossen wird?

Wenn mit dem aufgerufenen Programm die Batchdatei gemeint ist, sollte es vom Prinzip wie folgt gehen:

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:
var
  Befehl              : String;
  StartupInfo         : TStartupInfo;
  ProcessInfo         : TProcessInformation;
begin
  Befehl := 'cmd.exe /c <Batchdateiname>';

  // StartupInfo initialisieren.
  FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
  StartupInfo.cb := SizeOf(TStartupInfo);

  // DOS-Fenster soll nicht angezeigt werden.
  StartupInfo.dwFlags := StartF_UseShowWindow;
  StartupInfo.wShowWindow := SW_Hide;

  if CreateProcess(nil
                   PChar(Befehl), 
                   nil
                   nil,
                   false, 
                   0
                   nil
                   'c:\',
                   StartupInfo,
                   ProcessInfo) then 
    begin
      WaitForSingleObject(ProcessInfo.hProcess, Infinite);
      CloseHandle(ProcessInfo.hProcess);
    end;

Wichtig ist, daß cmd.exe mit dem Parameter /c aufgerufen wird, damit sich die Eingabeaufforderung nach dem Beenden des Batchprogrammes von alleine wieder schließt.