2012-09-07 77 views
12

Tengo un programa de prueba sencilla usando Microsoft Word interoperabilidad para obtener significados de las palabras del diccionario tesauro:get_SynonymInfo lanza insuficiente excepción de memoria para algunas palabras

using System; 
using Word = Microsoft.Office.Interop.Word; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     string word = "elite"; // = "common"; 

     var app = new Word.Application(); 
     var synInfo = app.SynonymInfo[word, Word.WdLanguageID.wdEnglishUS]; 

     if (synInfo.Found && synInfo.MeaningCount > 0) 
     { 
      foreach (var meaning in synInfo.MeaningList as Array) 
       Console.WriteLine(meaning.ToString()); 
     } 

     // release memory and quit Word app... (see below) 
    } 
} 

intentado esto con Microsoft Office 2010 y Microsoft Office 2013 de vista previa, usando .Net 4.0 en Visual Studio 2010, haciendo referencia a Office 12 PIA. Para más de 150 000 palabras diferentes, esto funciona como un encanto. Pero noto que para algunas palabras, el método get_SynonymInfo lanza una excepción:

Unhandled Exception: System.Runtime.InteropServices.COMException: Insufficient memory or disk space. 
    at Microsoft.Office.Interop.Word.ApplicationClass.get_SynonymInfo(String Word, Object& LanguageID) 
    at WordInteropTest.Program.Main(String[] args) in Program.cs:line 11 

Sé que estas palabras están causando una excepción:

  • élite (pero "élites" Obras)
  • cerca
  • tuck
  • alforzas
  • caminar
  • onboar d
  • horrorizado

Esto no tiene nada que ver con la excepción, sino para dar un código fuente completo, yo libero memoria y salir de la aplicación Palabra correctamente. No hay msword.exe restante en la lista de procesos cuando salgo de mi programa de prueba.

 // release memory and quit Word app... (continuing from above) 
     System.Runtime.InteropServices.Marshal.FinalReleaseComObject(synInfo); 
     app.Quit(Word.WdSaveOptions.wdDoNotSaveChanges); 
     System.Runtime.InteropServices.Marshal.FinalReleaseComObject(app); 

El uso del diccionario de sinónimos en Microsoft Word da manualmente los resultados adecuados para todas las palabras.

¿Cómo puedo evitar la excepción y obtener resultados usando el código Interop? ¿Hay alguna alternativa válida usando alguna otra API?


Actualización: me dijeron en un local programming web forum que este código funciona con Office 2007. Y para mi sorpresa, que lo hace. Pero con Office 2010 y 2013 Preview como se indica en esta pregunta, no funciona, al menos no en mis computadoras/máquinas virtuales. Luego traté de hacer referencia a Office 14 PIA en lugar de a Office 12, pero con Office 2013 Preview esto se comporta de la misma manera.

+1

Parece que puede ser un problema de larga data con Word, porque todavía está allí (AFAICT) en 2013. Este https://groups.google.com/forum/?hl=es&fromgroups=#!topic/microsoft. public.office.developer.automation/ex58NtYsJmc sugieren usar Excel. – Fionnuala

+0

El error es el mismo, pero tanto "pálido" como "desinflar" de esos hilos me funciona. –

+2

Lo que creo que podría ser el problema es que todas estas palabras tienen homógrafos en la lista de significados. Por ejemplo, con "élite" hay "mejor (sustantivo)" y "mejor (adjetivo)". La interfaz de SynonymInfo no puede representar ambos. Word 2007 muestra esto como dos entradas distintivas en el panel Tesauro, pero la Vista previa de Word 2010 y 2013 lo muestra como la entrada combinada "mejor (sustantivo/adjetivo)". –

Respuesta

8

Puedo reproducir este problema en mi computadora en Word 2010. El código de error (HResult) es -2146822464 o 0x800A16C0, en el que no hay nada que encontrar en Internet.

Como Remou notas, este problema ya existía back in 2002.

Sucede iff la lista de sinónimos en Word contiene uno o más sinónimos de dos o más tipos (por ejemplo adj./V., n./V. o adj./N.) . El idioma/diccionario no importa. Por ejemplo, onboard devuelve el error en wdEnglishUS pero no en wdEnglishUK, ya que este último no conoce la palabra. Las otras palabras existen en ambos diccionarios y dan un error en cualquier caso.

Aparentemente, este es un error y solo un problema para la interoperabilidad de Word, ya que Word lo muestra todo sin problemas. Por lo que pude encontrar, esta es la única forma en que la interoperabilidad le permite obtener información de sinónimos, y no hay ningún problema.

0

¿Cuál es el resultado si ingresa sus palabras "malas" en MS Word y verifica sus sinónimos? ¿Funciona allí? ¿Tal vez obtengas un diálogo adicional, que no se maneja bien en la API?

+1

Si lee la segunda línea antes de la Actualización, dice: "El uso del diccionario de sinónimos en Microsoft Word manualmente proporciona resultados adecuados para todas las palabras". No hay diálogos adicionales. –

Cuestiones relacionadas