Pregunta

Estoy desarrollando aplicaciones de automatización de la palabra y estoy frente a problema grave con RPC inesperado / Comcast excepción

  

[System.InvalidCastException: Nie   można rzutować obiektu Modelu COM typu   'Sistema .__ ComObject' na typ interfejsu   'Microsoft.Office.Interop.Word._Application'.   Ta Operacja NIE się powiodła, ponieważ   wywołanie Metody QueryInterface dla   składnika Modelu 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 broma   niedostępny. (Wyjątek od HRESULT:   0x800706BA).]

La traducción del Polaco al Inglés:

  

No se puede convertir Sistema .__ ComObject a   Microsoft.Office.Interop.Word._Application.   La razón es que QueryInterface para   IID   '{00020970-0000-0000-C000-000000000046}'   no - servidor RPC no está disponible -   código de error HRESULT: 0x800706BA

Aquí el resumen del módulo WordApp:

La inicialización - cuando el usuario se registra en

.
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;

Estoy usando Activator.CreateInstance lugar de aplicación = nueva aplicación () - aquí el explicación .

A continuación, el usuario puede ejecutar 2 acciones en el módulo WordApp

a) documento de impresión preparado 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) convertir 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;
        }

Cuando cierre de sesión de usuario, entonces liberar ejemplo palabra:

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

La excepción se produce en lugares al azar - pero el lugar más común es cerca app.Documents.Add. Después de que la excepción no es posible app.Quit. Parece que la palabra instancia está muerto.

he encontrado que cosa en registro de eventos (ámbito de aplicación):

  

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 oficina de diagnóstico y no encontré ningún error.

¿Hay posible habilitar / encontrar más información de error del sistema?

Este código funciona perfectamente bien en mi máquina dev (Vista). El problema se produce en las máquinas de los clientes (generalmente winxp sp2 / sp3).

¿Hay un error en mi código o qué?

La única cosa que tengo que añadir. init WordModule / funciones / impresión cercanos son llamados a partir de hilos principal y savetomht a partir de hilos backgroundworkders'.

¿Fue útil?

Solución

Lo que usted describe a menudo se refiere a la situación siguiente. Se utiliza un servidor COM fuera proc (un objeto COM instancia en un proceso separado en lugar de en el mismo proceso que su programa) y por alguna razón ese servidor COM encuentra un error grave y termina de forma inesperada. El objeto COM que estaba usando ya no existe. Ya que la RPC se utiliza para interactuar con servidores COM fuera proc y el lado servidor ya no existe después de la terminación recibe el mensaje de error que indica que el servidor RPC no está disponible lo cual es cierto, pero se ve confuso.

Hay que investigar y eliminar la causa de la interrupción del servidor COM. Las razones más probables son las siguientes:

  • alguna entrada razonable valora que se pasa a las llamadas y
  • una excepción no controlada en un controlador de eventos. Si usted tiene alguna manipulación para eventos disparados desde un componente COM que debe coger todas las excepciones que pueden ser lanzadas dentro de su manejador y no dejar que se propagan fuera del controlador.

Otros consejos

No sé, pero aquí hay algunas sugerencias basadas en la experiencia general. Se podría tratar de usar distintos m s en lugar de compartir uno entre todos los parámetros (con la idea de que si el valor se metió con su interior podría tener resultados impredecibles). También puede tratar de proporcionar los valores razonables (en lugar de la m s) donde se pueda. Algunas versiones de la API pueden ser más tolerantes que otros.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top