2010-03-10 6 views
1

Je pensais que j'avais une solution de travail pour convertir des fichiers .mdi en PDF en utilisant le modèle d'objet Microsoft Office Document Imaging. La solution est dans un service Windows, mais maintenant je suis confronté à des erreurs sur lesquelles je n'arrive pas à trouver d'informations.Aide pour le débogage des erreurs COM? (.mdi en .pdf conversions de fichiers en utilisant Microsoft Office Document Imaging)

L'exception que je reçois est:

The server threw an exception. (Exception from HRESULT: 0x80010105 (RPC_E_SERVERFAULT)) System.Runtime.InteropServices.COMException (0x80010105): The server threw an exception. (Exception from HRESULT: 0x80010105 (RPC_E_SERVERFAULT))
at MODI.DocumentClass.Create(String FileOpen) at DocumentStore.Mdi2PDF(String path, String newPath)

Ensuite, dans l'Observateur d'événements il y a l'erreur d'application suivante:

Faulting application MyWindowsServiceName.exe, version 1.0.0.0, time stamp 0x4b97f185, faulting module mso.dll, version 12.0.6425.1000, time stamp 0x49d65443, exception code 0xc0000005, fault offset 0x0000bd8e, process id 0xa5c, application start time 0x01cac08cf032914b.

Voici la méthode qui fait la conversion:

private int? Mdi2PDF(String path, String newPath) 
{ 
    int? pageCount = null; 
    string tmpTif = Path.GetTempFileName(); 

    MODI.Document mdiDoc = new MODI.Document(); 
    mdiDoc.Create(path); 
    mdiDoc.SaveAs(tmpTif, 
     MODI.MiFILE_FORMAT.miFILE_FORMAT_TIFF_LOSSLESS, 
     MODI.MiCOMP_LEVEL.miCOMP_LEVEL_HIGH); 
    mdiDoc.Close(false); 

    pageCount = Tiff2PDF(tmpTif, newPath); 
    if (File.Exists(tmpTif)) 
     File.Delete(tmpTif); 

    return pageCount; 
} 

J'ai supprimé tous les threads du service en invoquant ceci, de sorte que seul le thread primaire était l'initialisation de l'objet MODI, mais toujours l'erreur, donc il ne semble pas être lié au thread.

J'ai également construit une application de console convertissant des centaines de documents et n'a pas obtenu l'exception. Par conséquent, cela semble provenir de la création de trop nombreuses instances de l'objet MODI, mais uniquement instanciées dans un service? Cela n'a pas vraiment de sens.

Quelqu'un at-il des indices sur ces erreurs et comment les déboguer davantage?

+0

Savez-vous quel appel MODI échoue? Lors de l'exécution en tant qu'application console droite, plutôt qu'en tant que service, obtenez-vous la même exception? – Ants

+0

C'est dans l'appel de création (j'ai mis à jour la question avec la trace de la pile). Je vais mettre en place une version d'application de console. – RyanW

Répondre

1

Il s'est écrasé. C'est un perroquet mort. Une exception matérielle AccessViolation dans une DLL Office (mso.dll). Vous avez peu d'options pour comprendre pourquoi exactement il s'est écrasé, ce n'est pas votre code. Mais l'utilisation de threads est certainement un bon moyen de planter un serveur COM qui est mono-thread. Tout type de code Office serait admissible. Débarrassez-vous d'abord de l'enfilage, puis appelez le support Microsoft.

+0

Merci, je suis d'accord, c'est une bonne idée de se débarrasser de l'enfilage pour isoler davantage les problèmes. J'ai également essayé de traiter l'instance de MODI.Document comme un singleton et d'appeler simplement close() et create() plutôt que de créer une nouvelle instance à chaque fois. – RyanW

2

Il y a quelque chose d'intéressant à propos de la fermeture du COMObject après son utilisation ou quelque chose comme ça. Cela pourrait peut-être aider, j'espère que oui.

  1. COMException 0x80010105
  2. Exception from HRESULT: 0x80010105 (RPC_E_SERVERFAULT))

Il semble avoir quelque chose lié à des objets disposant, soit un objet disposé trop tôt, ou ne sont pas éliminés du tout.

Avez-vous déjà essayé d'appeler le récupérateur de place de temps en temps tout au long de vos appels aux méthodes d'objet COM?

Je ne sais pas, je vomis tout ce qui me vient à l'esprit, peut-être que ça finira comme une solution quelque part! =)

+0

Merci, oui, je suis d'accord, je pense que j'ai réduit le problème de la disposition des objets, et j'apprécie les suggestions. J'ai construit une application de console que j'ai couru 2 versions simultanément, créant et fermant quelques centaines d'objets de MDI et aucun problème. Mais, quand je l'ai dans un service, le problème revient. Pour l'instant, je vais juste créer une seule instance de l'objet MODI et appeler les fonctions create(), saveas() et close() dessus. Cela semble l'avoir stabilisé. Je vais expérimenter un peu plus en invoquant le garbage collector aussi. – RyanW

Questions connexes