![]() |
ExecAndWait und OpenOffice
Hallo #,
folgender bekannter Code funktioniert leider mit OpenOffice (3.4.1) nicht mehr.
Delphi-Quellcode:
Das Problem ist, dass das WaitForSingleObject nicht wartet.
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; 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 |
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. |
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 |
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 |
AW: ExecAndWait und OpenOffice
Zitat:
|
AW: ExecAndWait und OpenOffice
Hallo,
gute Frage. Soll sich jemand anders mit rumärgern. Bei mir sind es immer Dateien im Temp ;) Heiko |
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
![]() 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! |
AW: ExecAndWait und OpenOffice
Hallo,
schöne Funktion. Aber wie du weiter oben gelesen hast, funktioniert sie bei OpenOffice nicht ... Heiko |
AW: ExecAndWait und OpenOffice
Zitat:
Bei deiner Funktion fehlt ja z.B. das
Delphi-Quellcode:
was dazu führen könnte, dass
WaitForInputIdle
Delphi-Quellcode:
zu früh aufgerufen wird und dann einfach "durchflutscht".
WaitForSingleObject
|
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 06:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz