2017-09-20 1 views
0

J'ai un agent LotusScript planifié qui s'exécute sur un client (édition Social 9.0). L'un de ses objectifs est d'ouvrir un document Word et de l'enregistrer en tant que PDF, mais ce n'est pas vraiment important. Voici le code correspondant extraitObjet Word.Application (Office 2016) Méthode .quit() suspendue dans LS

Declarations 
Dim wrdApp as Variant 

Sub Initialize 

[Getting the usual Notes Session, Database, View values] 
    Set wrdApp = createObject("Word.Application") 
    wrdApp.visible = True 
starthere: 
    'we check to see if there is anything that has been deferred 
    Set v = db.GetView("RIT") 
    strStatus = "Success" 

    Set doc = v.Getfirstdocument() 
    If (doc Is Nothing) Then Exit Sub 
[Snip] 
End Sub 

Sub Terminate 
    wrdApp.visible = True 

    Dim quitCode As Variant 
    quitCode = 0 
    Call wrdApp.quit(quitCode) 
    Print "Quit called, waiting 3 seconds" 
' Wait a couple seconds 
    Sleep(3) 
    Print "Done waiting, setting wrdApp to Nothing" 
    Set wrdApp=Nothing 
    Print "Exiting agent" 
End Sub 

Le problème que je vais avoir est que depuis que nous avons mis à niveau vers Office 2016, parfois l'agent ne sera jamais fin. Dans le journal, je vois "Terminé en attente, définition de wrdApp sur Nothing" mais pas "Agent en cours de sortie". Je vais finir avec une fenêtre Word ouverte (mais pas de documents bien sûr) et quand je regarde dans le Gestionnaire des tâches, je vois un WINWORD.EXE fonctionnant avec 0% CPU et 2 ou 3 secondes de temps CPU. Et bien sûr, juste pour ajouter à l'intrigue, cela n'arrive pas à chaque fois non plus. Et puisque l'agent ne se termine jamais, tous les autres agents programmés sont bloqués jusqu'à ce que je tue l'instance de zombie Word. J'ai essayé toutes les suggestions que je peux trouver (vous remarquerez que je rends Word visible et j'utilise un Variant comme paramètre pour Quitter, et j'ai même jeté le sommeil (3) hors de la séparation), mais aucun n'a fait de différence . Nous n'avons jamais eu ce problème avec Office 2010 (même lorsque le code de l'agent était très louche.) En outre, le problème peut se produire que j'ouvre ou non un document Word. Y a-t-il une solution? Ou revient à O2010 la seule option?

+0

Juste un test: pourriez-vous mettre tout votre code dans le Initialize Sub? J'ai eu de mauvaises expériences avec un Terminate Sub qui a été terminé avant la fin du code ... –

+0

C'est un code que j'ai refactorisé un peu. Il était utilisé pour configurer et décomposer l'instance de Word dans un sous-programme appelé Initialize. Je l'ai réécrit de cette façon quand j'ai commencé à avoir le problème (ce qui signifie que ce n'est pas lié à Terminate.) Bien que le refactoring n'a pas aidé (ou blessé) le problème, j'aime comment ça circule mieux. – Duston

Répondre

0

Désolé pour le retard. J'ai développé une classe wrapper qui peut gérer les fichiers Word et OpenOffice de manière "transparente". Vous trouverez ci-dessous des parties de celui-ci. Je n'ai jamais eu de plaintes de mon client que le code ne fonctionne plus, mais cela peut aussi être dû au fait qu'ils utilisent la bibliothèque pour ouvrir un document en utilisant un modèle, puis remplir le document avec des données et ensuite laisser le document ouvert. Une différence à première vue: J'utilise Close où vous avez Quitter.

- pour ouvrir un document

Function CreateMSWordDocument As Variant 
    Dim msWord As Variant 

    On Error Goto CreateNewInstance 
    Set msWord = GetObject("", "Word.Application") 
Done: 
    Set CreateMSWordDocument = msWord 
    Exit Function 
CreateNewInstance: 
    Print "Loading Microsoft Word.... Please Wait...." 
    Err = 0 
    Set msWord = CreateObject("Word.Application") 
    Print "Microsoft Word Loaded" 
    Resume Done 
End Function 

Set wdDoc= CreateMSWordDocument 

- pour le fermer à nouveau:

Sub Close 
    Call wdDoc.Close 
End Sub 

Je n'ai pas plus d'informations pour vous que ci-dessus ...

+0

J'utilise .close sur l'objet document et .quit sur l'objet application. – Duston

0

Je ne suis pas sûr que cela vous concerne toujours. J'ai utilisé Word depuis des siècles comme vous le faites (juste en l'enveloppant dans une classe). Cependant, j'ai rencontré exactement le même problème ...

La solution était de faire NOTHING une fois que j'avais fermé le document - alors la tâche WINWORD se ferme silencieusement en arrière-plan!

HTH /John

+0

Merci pour vos commentaires. L'un des problèmes que j'ai aussi est que Word ne démarre pas toujours. J'ai abandonné et j'ai fini par prendre l'approche nucléaire. J'ai écrit un programme .NET C# lancé par le planificateur qui s'exécute toutes les 15 minutes. Si trouve tous exécutant WINWORD.EXE et s'il exécute plus de 15 minutes, le tue. Dans les 5 jours depuis que je l'ai implémenté, il a été tué 19 fois. – Duston

+0

Hmmm ... étrange ... Je n'ai eu aucun problème avec Word ne démarre pas. Et l'approche ci-dessus a jusqu'à présent fonctionné parfaitement en termes d'arrêt de Word :-) –

0

En tant que mode de mise à jour/répondre à cette question, j'ai abandonné la recherche de la vraie réponse et à la place a écrit un programme C# qui recherche une instance de Winword.exe qui a été en cours d'exécution pour plus de 15 minutes et tuer le processus. Ensuite, j'utilise le planificateur de tâches pour lancer ce programme toutes les 15 minutes. C'est rude et moche, mais il a éteint le feu de 4 alarmes que j'avais avant.