Einzelnen Beitrag anzeigen

ZOD

Registriert seit: 6. Mai 2009
97 Beiträge
 
#3

AW: fehlende Rechte nach EXE start auf WIN7

  Alt 22. Okt 2013, 07:38
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.
  Mit Zitat antworten Zitat