Announcement

Collapse
No announcement yet.

CreateProcess mit Worddatei wenn Word schon offen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • CreateProcess mit Worddatei wenn Word schon offen

    Delphi 5, Word 2000
    Wenn ich aus einer Datenbank ein Worddokument hole, temporär speichere und nach dem Bearbeiten wieder in die Speichere funktioniert alles super, solange Word durch das createProcess gestartet wird. Ist Word vorher schon offen, öffnet das Worddokument zwar auch, aber mein Programm geht sofort durch den Rest der procedure, gibt die Fehlermeldung aus, dass das Dokument eigentlich nicht geöffnet werden kann und erkennt nicht mehr wann das Dokument geschlossen wird und alle Änderungen gehen verloren da ein zurücksichern in die Datenbank nicht mehr erfolgt.
    .
    GetStartupInfo(StartupInfo);
    StartupInfo.wShowWindow := SW_SHOW;
    if CreateProcess(nil,PChar(global_word_pfad + ' ' + sDokName),nil,nil,False,NORMAL_PRIORITY_CLASS,nil,
    nil,StartupInfo,ProcessInfo)
    then begin
    repeat
    Application.ProcessMessages;
    GetExitCodeProcess(ProcessInfo.hProcess, dwexit);
    // dwexit ist sofort 0 obwohl Word zweimal offen ist
    until dwExit <> still_active;

    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ProcessInfo.hProcess);

    {Standard-Dokument in DB speichern}
    DSET_DocVorlageWordDOKUMENT.LoadFromFile(sDokName) ;
    end
    else MessageDlg('Word kann nicht gestartet werden',mtError,[mbOk],0);

    Was muss ich am Quelltext ändern, damit das funktioniert. Word vorher von Hand zu schließen ist nicht die Lösung, da die Benutzer Word permanent offen haben wollen, weil Sie es ständig benutzen.

    Gruß Andreas

  • #2
    Hallo!

    Das gesamte Office bringt eine COM Schnittstelle mit. Such mal hier im Forum nach COM und Word oder sieh dir das Serienbriefbeispiel von Hr. Kosch an:
    http://www.entwickler-forum.de/WebX?13@@.ee8cc2b/0

    Wir steuern Word so an und das klappt eigentlich sehr gut. Inklusive Speichern etc. Erfordert aber etwas Einarbeitung in das Thema!!

    BYE BERN

    Comment


    • #3
      Mein Problem ist auch nicht die COM-Schnittstelle, das ist zu dem Zeitpunkt schon gelaufen (Worddokument aufrufen, mit Serienbriefquelle verbinden usw. da ich in diesem Fall das eventuell schon gestartete Word nutze durch Wordapplication1.connectkind = ckRunningOrNew). Mein Problem ist: Wenn das Worddokument aus der Datenbank geholt wurde, temporär auf die Festplatte gespeichert wurde, ich das Dokument wegens anschließender Zurücksicherung in die Datenbank mit createProcess (und mit waitforesingleobject ) starte funktioniert alles prima solange Word nicht schon offen war. Dann passiert der oben aufgeführte Ärger (GetExitCodeProcess liefert sofort 0 = inactive zurück / waitforesingleobject wird auch sofort übersprungen --> meine Procedure will das Worddokument sofort wieder speichern usw.). Meine Frage sollte vielleicht lauten: Wie erkenne ich im Programm, dass mein geöffnetes Word noch offen ist? ProcessInfo.hProcess ist scheinbar nicht eindeutig genug.
      Gruß Andrea

      Comment


      • #4
        Hmmm, also das Problem haben wir nicht.
        Wir haben das Utility "EventSinkImp" (www.techvanguards.com) verwendet um das Event "BeforeSave" abzufangen.
        Dort speichern wir dann das offene Dokument unter einem temporären Namen ab und lesen dieses temporäre Dokument in die DB ein...

        Also tritt Dein konkretes Problem bei uns nicht auf.

        Sorry leider keine Hilfe...

        BYE BERN

        Comment


        • #5
          Ich habe jetzt als Krücke folgenden Quelltext eingefügt:
          sleep(2000); // Word erstmal Zeit lassen
          while FileExists(GLOBAL_EXE_PFAD + 'Temp\~$kBearb.doc')
          do WaitForSingleObject(ProcessInfo.hProcess,INFINITE) ;
          Ich schaue nach ob die temporäre Datei vom Dokument vorhanden ist und erst wenn diese verschwunden ist geht es im Programm weiter. Funktioniert jetzt auch mit zweimal Word offen. Etwas professioneller wäre mir aber lieber.
          Gruß Andrea

          Comment

          Working...
          X