Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   ExecAndWait und OpenOffice (https://www.delphipraxis.net/172883-execandwait-und-openoffice.html)

hoika 27. Jan 2013 09:39


ExecAndWait und OpenOffice
 
Hallo #,

folgender bekannter Code funktioniert leider mit OpenOffice (3.4.1) nicht mehr.

Delphi-Quellcode:
function ExecAndWait(const Filename, Params: string;
                     WindowState: word): boolean;
var
  SUInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  CmdLine: string;
begin
  { Enclose filename in quotes to take care of
    long filenames with spaces. }
  CmdLine := '"' + Filename + '" ' + Params;
  FillChar(SUInfo, SizeOf(SUInfo), #0);
  with SUInfo do begin
    cb := SizeOf(SUInfo);
    dwFlags := STARTF_USESHOWWINDOW;
    wShowWindow := WindowState;
  end;
  Result := CreateProcess(NIL, PChar(CmdLine), NIL, NIL, FALSE,
                          CREATE_NEW_CONSOLE or
                          NORMAL_PRIORITY_CLASS, NIL,
                          PChar(ExtractFilePath(Filename)),
                          SUInfo, ProcInfo);
  { Wait for it to finish. }
  if Result then
  begin
    MessageBox(0, PChar(IntToStr(ProcInfo.dwProcessId)), '', 0);
    WaitForSingleObject(ProcInfo.hProcess, INFINITE);
  end;
end;
Das Problem ist, dass das WaitForSingleObject nicht wartet.
Schaue ich mit die ProzessId von swriter im Task-Manager an,
ist das nicht die gleiche wie ich in der MessageBox ausgebe.
OO erzeugt wohl einen 2. Prozess swriter, der das eigentliche Programm ist.

Was nun ?

Im Netz steht irgendwas von "ParentProcId benutzen",
also die Subprozesse überwachen ?
Ist das die richtige Richtung ?


Danke


Heiko
der

Bernhard Geyer 27. Jan 2013 09:42

AW: ExecAndWait und OpenOffice
 
4.614 Beiträge und Quelltext nicht formatiert?
Würde ja gerne Helfen aber bei solchen Fließtext bekommt man Augenkrebs.

hoika 27. Jan 2013 09:58

AW: ExecAndWait und OpenOffice
 
Jaja,

habe es gerade gemerkt ;)
Ich durchsuche gerade das Internet zu meinem Problem (45% der Seiten habe ich schon durch ...)

Der Code funktioniert ja bei allen Programmen,
ausser halt OO ;(


Heiko

hoika 27. Jan 2013 10:13

AW: ExecAndWait und OpenOffice
 
Hallo,

so eine feine Lösung ...

Ich öffne ja OO direkt mit einer Datei.
Heisst die Datei z.B. 1.rtf, legt OO beim Öffnen im gleichen Verzeichnis
die versteckte Datei ".~lock.1.rtf#" (ohne die ") an.

Jetzt heisst es warten und Tee trinken, bis die Lock-Datei weg ist.
Dann hat OO die Datei geschlossen.


Heiko

Bernhard Geyer 27. Jan 2013 10:28

AW: ExecAndWait und OpenOffice
 
Zitat:

Zitat von hoika (Beitrag 1200826)
Heisst die Datei z.B. 1.rtf, legt OO beim Öffnen im gleichen Verzeichnis
die versteckte Datei ".~lock.1.rtf" (ohne die ") an.

Jetzt heisst es warten und Tee trinken, bis die Lock-Datei weg ist.

Und was passiert wenn OO eine Datei auf einem Read-Only Share öffnet?

hoika 27. Jan 2013 12:36

AW: ExecAndWait und OpenOffice
 
Hallo,

gute Frage. Soll sich jemand anders mit rumärgern.
Bei mir sind es immer Dateien im Temp ;)


Heiko

sx2008 27. Jan 2013 12:41

AW: ExecAndWait und OpenOffice
 
Also ich bezweifle, dass der Code von ExecAndWait() komplett ausgearbeitet ist und alle Sonderfälle abdeckt.
In der Jedi Code Library (JCL) gibt es eine vergleichbare Funktion und ich glaube mich erinnern zu können, dass dort geprüft wird ob der Prozess wirklich beendet wurde.

PS:
Hier ist die Funktion
Delphi-Quellcode:
ShellExecAndWait
http://sourceforge.net/p/jcl/code/38...hell.pas#l1412

Also ich vertraue bei Code, der die Windows API benützt nur der JCL, denn die ist sauber getestet,
und nicht irgendeinem Codeschnippsel aus dem Internet!

hoika 27. Jan 2013 12:46

AW: ExecAndWait und OpenOffice
 
Hallo,

schöne Funktion.
Aber wie du weiter oben gelesen hast, funktioniert sie bei OpenOffice nicht ...


Heiko

sx2008 27. Jan 2013 12:54

AW: ExecAndWait und OpenOffice
 
Zitat:

Zitat von hoika (Beitrag 1200839)
Aber wie du weiter oben gelesen hast, funktioniert sie bei OpenOffice nicht ...

Hast du das schon getestet?
Bei deiner Funktion fehlt ja z.B. das
Delphi-Quellcode:
WaitForInputIdle
was dazu führen könnte, dass
Delphi-Quellcode:
WaitForSingleObject
zu früh aufgerufen wird und dann einfach "durchflutscht".

hoika 27. Jan 2013 13:10

AW: ExecAndWait und OpenOffice
 
Hallo,

Ja habe es gerade mal probiert.
Statt ResetMemory hatte ich FillChar genommen.

Wie du weiter oben lesen kannst,
ist die ProzessID aus ShellExecute eine andere
als die, die im Taskmanager angezeigt wird.
OO arbeitet mit einem Thread-Pool und einem globalen Prozess (Java ...).,
da gibt es nichts mit warten.

Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz