2016-05-22 9 views
1

in meiner app (Delphi XE10) schließen mag ich eine Datei öffnen (RTF) mit Standard-Editor des Benutzers (MSword oder Openoffice writter oder anderes) und der Lage sein, diesen Editor aus meiner Anwendung zu schließen. Ich habe versucht, den Code unten zu verwenden, aber ohne Erfolg auf diegeöffnet und ein externes Programm von Delphi

procedure TForm1.Button1Click(Sender: TObject); 
var hApp : Cardinal; 
begin 
    hApp := StartApp('open','temp.rtf','','',sw_normal); 
    anotherForm.showmodal; 
    KillProcess(hApp); 
end; 

Editor zu schließen, wo:

function StartApp(apchOperation, apchFileName, apchParameters, apchDirectory: PChar;awrdShowCmd: Word): Cardinal; 
var 
    lseiInfo: TShellExecuteInfo; 
begin 
    Result := 0; 
    FillChar(lseiInfo, SizeOf(lseiInfo), Chr(0)); 
    lseiInfo.cbSize := SizeOf(lseiInfo); 
    lseiInfo.fMask := SEE_MASK_NOCLOSEPROCESS; 
    lseiInfo.lpVerb := apchOperation; 
    lseiInfo.lpFile := apchFileName; 
    lseiInfo.lpParameters := apchParameters; 
    lseiInfo.lpDirectory := apchDirectory; 
    lseiInfo.nShow := awrdShowCmd; 
    if Boolean(ShellExecuteEx(@lseiInfo)) then 
    Result := lseiInfo.hProcess; 
end; 

procedure KillProcess(hProcess: Cardinal); 
Var 
    ovExitCode: LongWord; 
begin 
    try 
     if hProcess <> 0 then begin 
      GetExitCodeProcess(hProcess, ovExitCode); 
      if (ovExitCode = STILL_ACTIVE) or (ovExitCode <> WAIT_OBJECT_0) then 
      TerminateProcess(hProcess, ovExitCode); 
      CloseHandle(hProcess); 
     end; 
    except 
    end; 
end; 

Der Editor öffnet, aber wenn es mit Killprocess schließen müssen, ovExitCode ist immer Null, so TerminateProcess doesn‘ t ausführen. Ich versuche auch, TerminateProcess in jedem Fall auszuführen, aber der Editor (in diesem Fall MSword) wird nicht geschlossen.

Können Sie mir bitte helfen? Dank im Voraus

+0

Dies wird im Allgemeinen nicht möglich sein. –

+1

In der Dokumentation zu GetExitCodeProcess finden Sie Informationen darüber, warum es fehlschlägt. –

+0

Auch Ihr 'try ... except' ist sinnlos. –

Antwort

1

Ich schlage vor, Fallenlassen der KillProcess Ansatz und verwenden SendMessage() mit WM_CLOSE statt. Auf diese Weise wird Ihre Anwendung auf "normale" Weise beendet. Sie können den Fenstergriff von der Prozesshandle bekommen, es wird hier beschrieben: https://stackoverflow.com/a/20163705/3936440

+0

Ja, Sie haben Recht, aber der Code, den Sie vorschlagen, ist in C und ich kann nicht nach Delphi übersetzen (ich versuchte es, aber ohne Erfolg). – JimPapas

+0

@JimPapas Haben Sie bereits in Delphi nach 'SendMessage()' geforscht? Es gibt viele Artikel im Internet, die dies beschreiben. – ViRuSTriNiTy

Verwandte Themen