Öffnen Sie ein Microsoft Word-Dokument in einem Windows-Dienst scheint zu hängen
Ich habe einen windows service in c# geschrieben, die liest den text aus word-Dokumenten (doc und docx) mit VBA Interop. Allerdings auf bestimmte Dokumente, es scheint zu hängen, auf den Aufruf der Open-Methode. Es scheint, dass das problem die Dokumente haben alle Makros in Ihnen. Die lokal installierte version von word Makros deaktiviert und der code, den ich verwenden, um das Dokument zu öffnen, ist wie folgt:
using Word = Microsoft.Office.Interop.Word;
using OfficeCore = Microsoft.Office.Core;
Word.Application m_wordApp = new Word.ApplicationClass();
Word.Document m_wordDoc = null;
object TRUE_VALUE = true;
object FALSE_VALUE = false;
object MISSING_VALUE = System.Reflection.Missing.Value;
m_wordApp.DisplayAlerts = Microsoft.Office.Interop.Word.WdAlertLevel.wdAlertsNone; //will still fail with this line removed
m_wordApp.Visible = false; //will still fail with this line removed
m_wordApp.AutomationSecurity = Microsoft.Office.Core.MsoAutomationSecurity.msoAutomationSecurityForceDisable; //will still fail with this line removed
m_wordDoc = m_wordApp.Documents.Open(ref fileNameObject, ref FALSE_VALUE, ref TRUE_VALUE, ref FALSE_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref FALSE_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE);
Kann ich diese Dokumente manuell auf meiner Entwicklungs-Maschine. Weiß jemand, warum dies passiert ist oder haben weitere Fragen zu meiner Frage?
- Nicht die version von Word auf die Produktion der Maschine Eingabeaufforderung für Makros, oder im hintergrund deaktivieren?
- Was passiert, wenn du den code in ein normales Console-Anwendung und führen Sie diese auf der Produktions-Maschine? Einige dialog pop-up?
- Mke - Wort sollte lautlos deaktivieren Sie die Makros. Ich fand den registry-Schlüssel entspricht, der "alle Makros ohne Benachrichtigung deaktivieren" - option in dem Wort Vertrauen Zentrum und festgelegt, dass für die Benutzer der Dienst ausgeführt wird, aber das hat nicht das problem behoben
- wollte nur follow-up zu sehen, wenn die unten Ihre Frage beantwortet.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Microsoft.Office.Interop.Word
verwendet eine COM-wrapper für die Fernsteuerung des eigentlichen Word-executable. Es ist absolut horible. Die Einstellung zum deaktivieren von Makros in der Kopie von Wort, es ist mit ziemlicher Sicherheit eine Benutzer-spezifische Einstellung und der Windows-Dienst ausgeführt werden, wird Word als beliebiger Benutzer, der den Dienst unter. Die Chancen sind, es ist im wesentlichen aufspringen eine Art von makro-Sicherheit-dialog in einigen theoretischen Unterwelt, das ist die Windows-Dienst-Benutzer-desktop/ui.Habe ich hoffentlich endlich alle Fragen zu diesem und endete mit der folgenden Zeile zum öffnen der doc:
Dem 4. und 2. letzten Parameter verhindern, die die Reparatur und Codierung Dialoge öffnen, das behebt die meisten der Fehler.
Den Registrierungsschlüssel zu aktivieren Makros ohne Benachrichtigung deaktivieren ist:
Endlich, nach allem, dass es immer noch docs, die waren Absturz des service und undicht winword-Instanzen. Nach dem anmelden als service-Benutzer und öffnen eines dieser Dokumente habe ich diese Meldung von word: "Word kann nicht starten Sie den Konverter mswrd632". Dies wird behoben, indem Sie einen registry-Schlüssel, wie in http://support.microsoft.com/kb/973904.
Edit: ich fand auch, dass da VBA nicht installiert wurde Word geöffnet, ein Dialogfeld zu sagen, der Dienst dies verursacht einige der Dokumente, die zum Aufhängen der service. Neu installieren, dann deaktivieren obwohl die Wort selbst (wie oben erklärt) noch ein paar mehr Dokumente verarbeiten. Noch ein paar Dokumente, die nicht verarbeitet werden können. Denken zu versuchen http://poi.apache.org/text-extraction.html mit ikvmc zum Parsen der Dokumente statt.
Gibt es Empfehlungen gegen serverseitigen Automatisierung von Microsoft, aber es gibt auch viele Ressourcen, um Ihnen zu helfen, wenn das, was du bist noch zu tun. Diese beiden Artikel sollte Ihnen ausreichend Hintergrundwissen in das, was zu berücksichtigen für:
Automatisierung von Office
Lösungen mit Visual Studio .NET
Allerdings, wenn es ist so einfach, wie Sie Ihre Dokumente hängen, weil AutoMacros, wie
AutoOpen
innerhalb der VBA-code hinter, Sie müssen verwenden von WordBasic, diese zu deaktivieren. Ich könnte nie damit dies funktioniert in C#, aber ich habe in VB.NET. Sehen Wie zu öffnen-Dokument mit AutoOpen-makro mit PowerShell?Letzte option wäre zu prüfen, ein tool, das für server-side-Office-Automatisierung, wie Apose.Worte.
Word wird der Benutzer aufgefordert, wenn es ein kleineres problem mit dem Dokument. Die Eingabeaufforderung wird auf dem desktop angezeigt, für Dienstleistungen in Ihrem Fall, wo niemand es hören kann Schreien. Und verhindert, dass die Open () - Methode aufrufen, ausfüllen.
Sicherstellen, dass die OpenAndRepair argument der Open () - Methode auf True, so wird dies behandelt automatisch ohne Aufforderung des Benutzers.
Können Sie auch versuchen, den Aufruf der Dokumente.OpenNoRepairDialog (...) - Methode. Es gibt für office 2007 und höher.
Hinweis, dass ich gerade COM-Aufrufe, also bin ich nicht sicher, dass es vorhanden ist in die office-interop-Bibliotheken.