Guten Morgen Jaenicke,
den Aufruf von CreateProcess habe ich hier abgeguckt:
http://www.delphi-treff.de/tipps/sys...createprocess/
Bei mir sieht das so aus:
Delphi-Quellcode:
procedure TRMGlobFuncUniversal.ExecuteFile(
const AFilename:
String;
AParameter, ACurrentDir:
String;
AWait: Boolean;
AOnWaitProc: TExecuteWaitEvent);
var
si: TStartupInfo;
pi: TProcessInformation;
bTerminate: Boolean;
lokParameter,
lokFilename :
string;
begin
bTerminate := False;
if Length(ACurrentDir) = 0
then
ACurrentDir := ExtractFilePath(AFilename);
if AnsiLastChar(ACurrentDir) = '
\'
then
Delete(ACurrentDir, Length(ACurrentDir), 1);
FillChar(si, SizeOf(si), 0);
with si
do begin
cb := SizeOf(si);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := SW_NORMAL;
end;
FillChar(pi, SizeOf(pi), 0);
lokParameter := Trim(AParameter);
lokFilename := Trim(AFilename);
// Format('"%s"', [AFilename]);
AParameter := Format('
"%s" %s', [AFilename, TrimRight(AParameter)]);
if CreateProcess(
// Nil, PChar(AParameter),
PChar(lokFilename),
// pointer to name of executable module
PChar('
'),
// pointer to command line string
Nil,
// pointer to process security attributes
Nil,
// pointer to thread security attributes
False,
// handle inheritance flag
CREATE_DEFAULT_ERROR_MODE
or CREATE_NEW_CONSOLE
or NORMAL_PRIORITY_CLASS,
// creation flags
Nil,
// pointer to new environment block
PChar(ACurrentDir),
// pointer to current directory name
si,
// pointer to STARTUPINFO
pi
// pointer to PROCESS_INFORMATION
)
then
try
if AWait
then
while WaitForSingleObject(pi.hProcess, 50) <> Wait_Object_0
do
begin
if Assigned(AOnWaitProc)
then
begin
AOnWaitProc(pi, bTerminate);
if bTerminate
then
TerminateProcess(pi.hProcess, Cardinal(-1));
end;
Application.ProcessMessages;
end;
finally
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
end;
end;
Die Funktion liegt in einer Singelton
Unit und wird auch für andere Zwecke verwendet.
Der Aufruf sieht so aus:
RMFuncUniversal.ExecuteFile(PfadPASExeLok, '', ExtractFilePath(PfadPASExeLok), False, nil);
wobei PfadPASExeLok als Property in der aufrufenden
Unit definiert ist:
property PfadPASExeLok : string read FPfadPASExeLok write FPfadPASExeLok;
Der Pfad zur EXE ist korrekt, das Programm wird auch gestartet. Es gibt eben dann
nach dem Aufruf de Programmes aus der Startroutine heraus im Programm bei Dateizugriff
den Fehler "Datei nicht gefunden".
Die Dateien, auf die zugegriffen wird, liegen auf einem Netzwerklaufwerk und sind Teil eines
Archivsystems. Der Pfad wird aus einer Datenbank (FB2.5) ausgelesen und ist dort "hart" incl.
LW-Buchstaben belegt. Die entsprechende Netzwerkverbindung ist angemeldet und funktioniert,
das ist schon daran zu erkennen, daß bei einem Direktaufruf (Doppelklick auf die EXE)
das ganze fehlerfrei läuft.