Announcement

Collapse
No announcement yet.

Div. Word-Fehlermeldungen

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

  • Div. Word-Fehlermeldungen

    Hallo!

    Ich steuere von Delphi4 aus über die Unit WORD_TLB.PAS
    Word 2003 (SP2). Mein Betriebssystem ist Windows XP (SP2)

    In unregelmäßigen, nicht reproduzierbaren Abständen bekomme ich div. Fehlermeldungen:

    - Ausnahmefehler des Servers
    - Befehl misslungen
    - Der Remoteprozeduraufruf ist fehlgeschlagen
    - Das angeforderte Element ist nicht in der Sammlung
    vorhanden

    Alles im Zusammenhang mit Word-Befehlen.
    Ein Kunde von uns bekommt wochenlang KEINE Fehlermeldung (obwohl er alle entsprechenden Programmpunkte genauso nutzt, wie immer), und dann bekommt er wieder einen der o.g. Fehler.
    Ich kann in meiner Test-Umgebung auch keinen Anhaltspunkt
    finden. Es läßt sich einfach nicht reproduzieren, passiert einfach
    ab und zu mal!
    Bevor ich hier meine Quellcode-Beispiele poste, erst mal die Frage, ob vielleicht jemand ähnliche Probleme hat oder vielleicht sogar schon weiß woran das liegen kann??

    Danke schonmal...

    Branco

  • #2
    Nur Ideen:<p>
    a) Word ist zu dem Zeitpunkt noch mit was anderem beschäftigt und kann darum diese Aktion noch nicht ausführen.<p>
    b) Eine alte Instanz der Zugriffsvariante hängt noch im Speicher bzw. Word ist einfach abgestürzt und läuft nun bereits ein zweites Mal.<p>
    Mari
    Schöne Grüße, Mario

    Comment


    • #3
      Hallo Mario,

      zu a) Word kann vorher vom Kunden bereits geöffnet sein.
      Ich verwende dann die aktive Instanz.
      Die Fehler treten aber auch auf, wenn Word vorher
      nicht geöffnet war.

      zu b) Hierzu ist mir bei einem Kunden aufgefallen, daß der
      Prozess WINWORD.EXE im Task-Manager nicht korrekt
      wieder freigegeben wird und es zu Situationen kommen
      kann, in denen mehrere WINWORD-Prozesse im Task-
      Manager stehen.
      Dies ist aber in meiner Testumgebung noch nie passiert!
      Obwohl ich die gleichen Fehler bekomme.

      Bis vor 10 Minuten dachte ich, ich wäre auf der richtigen Spur:
      Ich habe in den Komponentendiensten in der Systemsteuerung
      bei der COM-Sicherheit alle Hacken gesetzt, die noch leer waren.
      Es gab einen ähnlichen Hinweis hier von Andeas Kosch.
      Bin den ganzen Nachmittag am testen und hatte noch keine Fehler. Bis vor 10 Minuten....

      Naja, die Suche geht weiter....

      Danke trotzdem für Deine Ideen!

      Wenn Du auch Word über die WORD_TLB.PAS steuerst,
      stell doch mal von Dir ein Codebeispiel rein, wie Du Word
      öffnest und beendest. Vielleicht mache ich da noch was falsch.

      Branc

      Comment


      • #4
        Gibts beim Word-Interface auch ein Interactive-Property?

        Falls ja das auf False setzen, damit Word alle möglichen User-Interaktionen abschaltet.

        Hatte ähnliche Probleme bei Excel. Da reichte es schon etwas mit der Maus zu bewegen damit sich Excel verschluckte

        Comment


        • #5
          Ich verbinde nie auf eine aktive Instanz sondern nehme immer eine neue. Mein Code ist unspektakulär:<p><pre>
          WordApplication := TWordApplication.Create(Self);
          WordApplication.Connect;
          WordApplication.Quit</pre></p&gt
          Schöne Grüße, Mario

          Comment


          • #6
            Hallo Bernhard!

            Ein "Interactive"-Property habe ich nicht gefunden!
            Trotzdem danke für den Hinweis!

            Und hallo Mario!

            Ich muß z.T. eine aktive Instanz verwenden, da unsere Kunden Word u.U. bereits offen haben und nicht wollen, daß es nochmal geöffnet wird.

            Ich habe im Anhang mal eine kurze Beispiel-Prozedur
            in der ich Word öffne, ein Dokument öffne und beides
            wieder schliesse.
            Vielleicht fällt ja jemandem auf, ob ich hier was falsch
            mache. (zumindest hatte ich lange keine Probleme damit...)

            Branc

            Comment


            • #7
              Dein Code sieht ziemlich sauber und klar aus. Eine Stelle habe ich aber spontan gesehen: Worddok.Activate. Hier holst Du das gewünschte Dokument in den Vordergrund. Warum? Wenn ein Anwender gerade in einem Vorgang drin ist, könnte genau da meiner Meinung nach ein Problem auftreten.<p>
              Supergau: offener Open-Dialog?<p>
              In alten Anwendungen habe ich auch so gearbeitet. Dann habe ich angefangen, das Dokument mit dem Selection-Objekt zu bearbeiten. Das war ziemlich fehlerträchtig. Es gibt zwar bei Word die Möglichkeit, die Bildschirminteraktion abzuschalten, aber das war auch keine gute Lösung... Word läuft, sofern nicht neu gestartet, nicht Invisible? Falls Selection im Einsatz ist: Um Längen stabiler war Range.<p>
              Mari
              Schöne Grüße, Mario

              Comment


              • #8
                Das Dokument aktiviere ich, um mir eben von dem richtigen
                Dokument Infos zu holen oder zu Werte zu setzen (z.B.
                Seitenränder oder Druckereinstellungen).
                An die Situation, daß jemand gerade einen Dialog offen hat,
                hab ich noch gar nicht gedacht! (Schande über mich! :-) )
                Danke für den Hinweis! Ich werde die Dokumente dann versuchen über die ID anzusprechen.

                Ich glaube aber, daß ich meinem Problem jetzt auf der Spur bin:
                Es kommt vor, daß der Code zum Öffnen von Word bei mir
                mehrmals hintereinander aufgerufen wird. Bei jedem Aufruf
                wird Word am Ende wieder geschlossen. (ist nicht optimal so,
                ich weiß, werd ich auch wieder ändern...) Ich glaube dem
                System geht das zu schnell: wenn der erste Aufruf meiner
                Prozedur Word wieder schließt, dauert das manchmal länger,
                manchmal geht es schneller. Wenn der nächste Aufruf dann
                abfragt, ob Word schon offen ist, ist dies evtl. noch der Fall,
                weil es nicht so schnell geschlossen werden konnte! Der zweite
                Aufruf geht also evtl. von einem offenen Word aus, daß dann
                aber doch noch währenddessen geschlossen wird.
                Ich hoffe, Du kannst mir folgen. Ich schreibe wohl etwas umständlich...
                Hier liegt der Hund begraben:

                // --> Starten von WinWord:
                try
                WinWord := (GetActiveOLEObject('Word.Application') as _Application);
                WinWordOffen := True;
                except
                WinWord := CoApplication_.Create;
                WinWordOffen := False;
                end;

                Ich glaube, daß die Funktion "GetActiveOLEObject" nicht sicher
                funktioniert! Ich vermute, daß es Situationen gibt, in denen die Funktion auch ein aktives Word nicht erkennt, und somit wird eine neue Word-Instanz im Except-Block aufgemacht! Dies würde auch erklären, wieso ein Kunde von uns nach einem Absturz mehrfach den Prozess WINWORD.EXE im Task-Manager hat!

                Ich werde versuchen die Abfrage, ob Word schon offen ist, oder nicht, anders zu machen! Da waren ja auch hier im Forum einige Beispiele!

                Ein weiterer Fehlerpunkt ist sicher auch (wie hier schon an anderer Stelle beschrieben) die Tatsache, daß die FireWall von Windows XP bestimmte Komponentendienste, die für den Remote-Aufruf von Word gebraucht werden, blockiert.
                Der Kunde, bei dem die Probleme auftreten, hat ausschließlich XP
                im Einsatz! Hier werde ich mal testweise die FireWall deaktivieren!
                Als letzten Punkt werde ich den Virenscanner testweise deaktivieren lassen, damit nicht ein unnötiger Scan nach Makro-Viren den Word-Aufruf beeinflußt!

                Tja, soweit - sogut!
                Ehrlich gesagt, würde ich ja viel lieber Spiele programmieren,
                aber man kann icht alles haben.... :-)

                Branc

                Comment


                • #9
                  Ja, schnelles Öffnen und schließen kann sicher so ein Problem erzeugen. Während sich Word schließt, kann es sicher noch als aktives Objekt abgefragt werden. Nur leider läuft das genau dann ins leere <p>
                  Probiere alternativ mal meinen Code. Wenn ich mich recht entsinne, konnte ich trotzdem ich praktisch eine eigene Instanz starten und Documents durchlaufen um bereits geöffnete Dateien zu finden und nutzen!<p>
                  <pre> OpenExist := False;
                  for j := 1 to WordApplication.Documents.Count do begin
                  OLEId := j;
                  if WordApplication.Documents.Item(OLEId).FullName = TmpFile
                  then begin
                  OpenExist := True;
                  Break;
                  end;
                  end; // for j

                  if OpenExist
                  then WordDocument.ConnectTo(WordApplication.Documents.I tem(OLEId))
                  else WordDocument.ConnectTo(WordApplication.Documents.O pen(
                  TmpFile, EmptyParam, OLEReadOnly, EmptyParam,
                  EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                  EmptyParam, EmptyParam));
                  </pre><p>
                  Am Ende entscheide ich dann immer, ob ich das Dokument schließen kann oder nicht (OpenExist). Dann schaue ich immer noch nach, ob Documents.Count nicht zufällig 0 ist, falls ja, schließe ich auch Word. <p>
                  <pre> IF WordApplication.Documents.Count = 0
                  THEN WordApplication.Quit
                  ELSE WordApplication.Visible := TRUE;

                  WordApplication.Disconnect;
                  WordApplication.Free;
                  </pre><p>Mari
                  Schöne Grüße, Mario

                  Comment


                  • #10
                    Hab ich noch gar nicht drüber nachgedacht, eine zweite
                    Instanz aufzumachen und damit bereits geöffnete Dokumente
                    einer schon offenen ersten Instanz zu lokalisieren.
                    Ich hätte auf Anhieb gedacht, das geht gar nicht.
                    (oder ich hab's grad total net verstanden...)

                    Aber das Problem ist auch die Geschwindigkeit und die Ressourcen bei unseren Kunden.
                    Die haben eh schon immer etliche Tasks offen und da ist es mir lieber mich auf eine vorhandene Instanz aufzuschalten als eine neue aufzumachen. Geht halt auch schneller.

                    Zum Teil wiederholen sich die Aufrufe in unserem Programm auch und ich will nicht immer eine neue Instanz auf und zu machen.
                    Das Problem sehe ich nach wie vor in der Verbindung mit der aktiven Instanz über "GetActiveOLEObject".
                    Ich denke, ich muß versuchen eine globale Instanz für unser Programm aufzumachen und immer offen zu halten.
                    Das wirft zwar mein ganzes bisheriges Konzept durcheinander, aber was soll's...

                    Und wie gut, daß alle MS-Betriebssysteme und alle Office-
                    Versionen so gnadenlos kompatibel sind! Da kann man sich
                    sicher sein, daß alles immer überall läuft! :-)

                    Auf jeden Fall trotzdem Dank für den Tip!

                    Branc

                    Comment


                    • #11
                      Hallo,<p>
                      Auch wenn Du eine neue Instanz aufmachst, wird diese mit ziemlicher Sicherheit nicht besonders anders behandelt, wie der Connect auf eine bestehende. Sonst käme man nicht problemlos an die Dokument ran. Du solltest das wirklich mal probieren, ich glaube nicht, dass dadurch mehr Speicher verloren geht.<p>
                      Mari
                      Schöne Grüße, Mario

                      Comment

                      Working...
                      X