Autor Beitrag
Holgerwa
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 325

WIN XP Pro, Vista Business
Delphi 7 Pro, BDS 2006 Pro
BeitragVerfasst: Di 22.03.05 21:37 
Hallo,

ich möchte aus meinem Programm eine Word-Datei (.doc) mit Word starten, und dann solange warten, bis Word wieder vom Benutzer beendet wurde, also die Veränderungen am Word-Dokument abgeschlossen sind.

Dazu mache ich das:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
  ...
  FillChar (StartupInfo, SizeOf (StartupInfo), #0);
  StartupInfo.cb          := SizeOf(StartupInfo);
  StartupInfo.dwFlags     := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
  StartupInfo.wShowWindow := SW_SHOW;
  if not CreateProcess(nil, @Filename[1], nilnil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nilnil, StartupInfo, ProcessInfo) then
    ShowMessage ('Fehler');
  rc := WAIT_TIMEOUT;
  while (rc = WAIT_TIMEOUT) do
    begin
      Application.ProcessMessages;
      rc := WaitForSingleObject (ProcessInfo.hProcess, 500);
    end;
  ...

(wobei Filename = Pfad zu Word.exe + Doc-Datei)

Das funktioniert auch, Word wird mit der angegebenen Datei geöffnet, und mein Programm wartet nun. Wenn ich Word beende, passiert genau das, was soll, mein Programm läuft weiter.

Das Problem kommt, wenn Word schon geöffnet ist (z.B. mit einem anderen Dokument).
Dann wird zwar mein Doc-Dokument auch geöffnet, aber mein Programm wartet nicht mehr und läuft gleich weiter, obwohl Word noch geöffnet ist.

Leider bin ich bei Win-API Profi, versuche mich also mehr oder weniger heranzutasten...

Weiß jemand, warum das passiert, und was man dagegen tun kann?

Danke!
Holger
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Di 22.03.05 22:43 
Word übergibt, wenn es bereits eine Instanz findet, die Parameter an diese und beendet sich selbst dann automatisch wieder.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Holgerwa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 325

WIN XP Pro, Vista Business
Delphi 7 Pro, BDS 2006 Pro
BeitragVerfasst: Di 22.03.05 22:53 
Hallo,

danke für die Antwort. Dann macht das ja auch Sinn, was das mit meinem Programm passiert :idea:

Gibt es vielleicht einen anderen Ansatz für mein Problem?
Oder ist das sowas Ungewöhnliches, daß da noch niemand eine Lösung gefunden hat?

Eigentlich will ich ja "nur" eine beliebige (meistens .doc, aber auch andere) Datei mit deren Anwendung starten, und dann benachrichtigt werden, wenn in dieser anderen Anwendung die Bearbeitung abgeschlossen ist.

Das kleine "nur" könnte natürlich auch ein unüberwindbares Hindernis sein :wink:

Holger
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Di 22.03.05 22:58 
1) FindWindow in einem Thread wird wohl wieder nicht gerne verwendet
2) dll injection in word und wenn dll entalden wird ist word geschlossen
3) debugger basteln und winword, dann wird man auch benachrichtig wenn es geschlossen wird
4) dll injection + api hook auf exitprocess bei winword
5) ??? aber was einfacheres gibbet bestimmt :)

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
Holgerwa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 325

WIN XP Pro, Vista Business
Delphi 7 Pro, BDS 2006 Pro
BeitragVerfasst: Di 22.03.05 23:11 
Ich hoffe, daß es noch was für 5) gibt :)

Um es dann auch zu verallgemeinern, und nicht an Word aufzuhängen (das war eben die erste Anwendung, die sich garstig verhalten hat):

Könnte man denn ein Handle auf die Instanz der Anwendung erhalten, die dann auch wirklich das jeweilige Dokument öffnet?
(Achtung: Hier spricht der API-Laie, bitte nicht lachen! :oops: )

Holger