Domanda

sto sviluppando applicazioni di automazione parola e sto affrontando serio problema con RPC inaspettata / COM gettato eccezione

  

[System.InvalidCastException: Nie   można rzutować obiektu del modello COM typu   'Sistema .__ ComObject' na tip interfejsu   'Microsoft.Office.Interop.Word._Application'.   Ta Operacja nie powiodła się, ponieważ   wywołanie metody QueryInterface dla   składnika del modello COM w celu uzyskania   interfejsu o identyfikatorze IID   '{00020970-0000-0000-C000-000000000046}'   nie powiodło się z powodu   następującego Bledu: Serwer RPC jest   niedostępny. (Wyjątek od HRESULT:   0x800706BA).]

La traduzione da Polacco a Inglese:

  

Impossibile eseguire il cast del sistema .__ ComObject a   Microsoft.Office.Interop.Word._Application.   La ragione è che QueryInterface per   IID   '{00020970-0000-0000-C000-000000000046}'   non riuscito - di server RPC non è disponibile -   il codice di errore HRESULT: 0x800706BA

Ecco il breve modulo WordApp:

L'inizializzazione - dopo che l'utente ha eseguito l'accesso

.
using Microsoft.Office.Interop.Word;

    public class WordApp       
    {
        Application app = null;
        object m = System.Reflection.Missing.Value; 
        object oFalse = false;  
        object oTrue = true;

....

            app = Activator.CreateInstance(Type.GetTypeFromProgID("Word.Application.12")) as Application;
            app.Visible = false;
            app.DisplayAlerts = WdAlertLevel.wdAlertsNone;
            app.PrintPreview = false;

sto usando Activator.CreateInstance invece di app = new Application () - qui il spiegazione .

Poi utente può eseguire 2 azioni nel modulo WordApp

a) di stampa di documenti preparati docx

        System.Windows.Forms.PrintDialog pd = new System.Windows.Forms.PrintDialog();
        ...

        this.app.ActivePrinter = pd.PrinterSettings.PrinterName;
        object oNumcopies = pd.PrinterSettings.Copies;
        object oRange = WdPrintOutRange.wdPrintAllDocument;
        object inputname = fullPath;
        Document doc = app.Documents.Add(
                              ref inputname,
                              ref m,
                              ref m,
                              ref m);
        try
        {
            // Print the document 
            doc.PrintOut(ref oFalse, ref oFalse, ref oRange,
                    ref m, ref m, ref m,
                    ref m, ref oNumcopies, ref m, ref m,
                    ref oFalse, ref m, ref m,
                    ref m, ref m, ref m, ref m,
                    ref m);
        }
        finally
        {
            doc.Close(ref oFalse, ref m, ref m);
            doc = null;
        }

b) convertire docx a MHT

        object inputname = docxname;
        object outputname = htmlname;
        object fileType = WdSaveFormat.wdFormatWebArchive;

        Document doc = app.Documents.Add( 
                              ref inputname,
                              ref m,
                              ref m,
                              ref m);
        try
        {
            doc.SaveAs(ref outputname, ref fileType,
                ref m, ref m, ref m, ref m, ref m, ref m, ref m,
                ref m, ref m, ref m, ref m, ref m, ref m, ref m);
        }
        finally
        {
            doc.Close(ref oFalse, ref m, ref m);
            doc = null;
        }

Quando il logout dell'utente, poi ho rilasciare esempio parola:

            object oSaveChanges = WdSaveOptions.wdDoNotSaveChanges;
            app.Quit(
         ref oSaveChanges,
         ref m,
         ref m);

L'eccezione viene generata in luoghi casuali - ma il luogo più comune è vicina app.Documents.Add. Dopo tale eccezione non è possibile app.Quit. Sembra che esempio parola è morta.

ho scoperto che cosa in eventlog (ambito di applicazione):

  

EventType offdiag12, P1   585d8a02-f370-4c04-85b6-fccad7e80459255ec053-6dbd-4a22-9e59-112a79de8c6a,   P2 NIL, P3 NIL, P4 NIL, P5 NIL, P6   NIL, P7 NIL, P8 NIL, P9 NIL, P10 NIL.

Corro ufficio diagnostica e non ho trovato alcun errore.

C'è possibile abilitare / trovare maggiori informazioni di errore dal sistema?

Questo codice viene eseguito perfettamente sulla mia macchina dev (Vista). Il problema si verifica a macchine dei clienti (di solito WinXP SP2 / SP3).

C'è un errore nel mio codice o cosa?

L'unica cosa che ho bisogno di aggiungere. WordModule init / funzioni / stampa stretti sono chiamati dal thread principale e savetomht a partire da fili backgroundworkders'.

È stato utile?

Soluzione

Ciò che si descrive spesso si riferisce alla seguente situazione. Si utilizza un server out-process (un oggetto COM un'istanza in un processo separato piuttosto che nello stesso processo come programma) COM e per qualche motivo quel server COM verifica un errore irreversibile e termina in modo imprevisto. L'oggetto COM si sta utilizzando non esiste più. Dal momento che RPC è usato per interagire con server COM out-proc e lato server non esiste più dopo il termine viene visualizzato il messaggio di errore dicendo che il server RPC non è disponibile, che è vero, ma sembra confuso.

Devi ricerca ed eliminare la causa della cessazione del server COM. Le ragioni più probabili sono le seguenti:

  • Valori qualche input irragionevole si passa alle chiamate e
  • un'eccezione non gestita in un gestore di eventi. Se si dispone di alcuna manipolazione per eventi generati da un componente COM si dovrebbe prendere tutte le eccezioni che possono essere generate all'interno del vostro gestore e non lasciare che si propagano al di fuori del gestore.

Altri suggerimenti

Non lo so, ma qui ci sono alcuni suggerimenti sulla base dell'esperienza generale. Si potrebbe provare a utilizzare distinta m s piuttosto che la condivisione di uno tra i parametri (l'idea è che se il valore è stato pasticciato con al suo interno potrebbe essere avere risultati imprevedibili). Si potrebbe anche voler provare fornire valori ragionevoli (piuttosto che il m s) dove si può. Alcune versioni del API possono essere più indulgente di altri.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top