Einzelnen Beitrag anzeigen

schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#3

Re: Problem mit Thread

  Alt 3. Jan 2010, 19:32
Danke für den Tipp mit ExecAndWait!

Ich habe nun rausgefunden das es so keine Fehlermeldung gibt:
Delphi-Quellcode:
procedure TRunProcess.ExecAndWait;
var
  {$IFDEF UNICODE} ShExecInfoW: SHELLEXECUTEINFOW; {$ENDIF}
  ShExecInfoA: SHELLEXECUTEINFOA;
// MSDN: ShellExecuteEx, ShellExecuteInfo
begin

  if (fApp = '') or not FileExists(fApp) then
    exit;
  {$IFDEF UNICODE}
  if Win32IsUnicode = VER_PLATFORM_WIN32_NT then
  begin
    ZeroMemory(@ShExecInfoW, SizeOf(ShExecInfoW));
    ShExecInfoW.Wnd := GetForegroundWindow;
    ShExecInfoW.cbSize := SizeOf(SHELLEXECUTEINFOW);
    ShExecInfoW.fMask := 0; //SEE_MASK_NOCLOSEPROCESS;
    ShExecInfoW.lpVerb := 'open';
    ShExecInfoW.lpFile := PWideChar(WideString(fApp));
    ShExecInfoW.lpParameters := PWideChar(WideString(fParam));
    ShExecInfoW.lpDirectory := PWideChar(WideString(ExtractFileDir(fApp)));

    ShExecInfoW.nShow := fWindowState;

    try
      ShellAPI.ShellExecuteExW(@ShExecInfoW);
      if fWait then WaitForSingleObject(ShExecInfoW.hProcess, INFINITE);
    finally
      fStarted := ShExecInfoW.hProcess <> 0;
    end;
  end
  else
  {$ENDIF}
  begin
    ZeroMemory(@ShExecInfoA, SizeOf(ShExecInfoA));
    ShExecInfoA.Wnd := GetForegroundWindow;
    ShExecInfoA.cbSize := sizeof(SHELLEXECUTEINFOA);
    ShExecInfoA.fMask := 0; //SEE_MASK_NOCLOSEPROCESS;
    ShExecInfoA.lpVerb := 'open';
    ShExecInfoA.lpFile := PAnsiChar(AnsiString(fApp));
    ShExecInfoA.lpParameters := PAnsiChar(AnsiString(fParam));
    ShExecInfoA.lpDirectory := PAnsiChar(AnsiString(ExtractFileDir(fApp)));
    ShExecInfoA.nShow := fWindowState;

    try
      ShellExecuteExA(@ShExecInfoA);
      if fWait then WaitForSingleObject(ShExecInfoA.hProcess, INFINITE);
    finally
      fStarted := ShExecInfoA.hProcess <> 0;
    end;
  end;
end;
Das ShExecInfoW.fMask habe ich auf 0 gesetzt, da ich nur Prozesse starten will, aber nicht überprüfen ob sie auch wirklich gestartet wurden. Auch benutze ich das Wait nicht!

Der Fehler beim beenden ist hiervon gekommen:
Delphi-Quellcode:
      fDummyPWideChar := '';

      GetMem(fDummyPWideChar, Length(fApp) * 2 + 2);
      ZeroMemory(fDummyPWideChar, Length(fApp) * 2 + 2);
      ShExecInfoW.lpFile := StringToWideChar(fApp, fDummyPWideChar, Length(fApp) * 2 + 2);
      FreeMem(fDummyPWideChar);

      GetMem(fDummyPWideChar, Length(fParam) * 2 + 2);
      ZeroMemory(fDummyPWideChar, Length(fApp) * 2 + 2);
      ShExecInfoW.lpParameters := StringToWideChar(fParam, fDummyPWideChar, Length(fParam) * 2 + 2);
      FreeMem(fDummyPWideChar);

      GetMem(fDummyPWideChar, Length(ExtractFileDir(fApp)) * 2 + 2);
      ZeroMemory(fDummyPWideChar, Length(fApp) * 2 + 2);
      ShExecInfoW.lpDirectory := StringToWideChar(ExtractFileDir(fApp), fDummyPWideChar, Length(ExtractFileDir(fApp)) * 2 + 2);
      FreeMem(fDummyPWideChar);
Ich wollte auf diese Weise den String in ein PWideChar umwandeln.

Hin und wieder hatte ich Probleme beim Starten von Programmen und ich bin mir nicht sicher ob diese Methode:
ShExecInfoW.lpFile := PWideChar(WideString(fApp)); String -> PWideChar Umwandlung

So ganz in Ordnung ist!
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat