PRB : Interprocessus COM Automation peut bloquer l'application cliente sous Win95/98

Traductions disponibles Traductions disponibles
Numéro d'article: 216400 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Symptômes

Lors de l'automatisation d'un serveur COM out-de-process à partir d'une application cliente, si le code client entame une boucle étroite ou fait des demandes complètes permettant d'obtenir de nouvelles interfaces, l'application cliente peut se bloquer pendant un appel d'automatisation, exiger de l'utilisateur de mettre fin au processus anormalement. Une fois bloqué, toute demande COM impliquant une interface marshaled échoue. Un redémarrage est nécessaire pour résoudre le problème.

Le problème se produit uniquement sur les systèmes Windows 95 et Windows 98.

Cause

Lorsqu'une interface est marshalée au-delà des limites des processus, un certain nombre d'objets système est créé pour gérer la communication entre les processus client et serveur. Cela inclut le proxy/stub, ainsi que les OID et OXID requises par COM pour identifier l'interface qui est marshalé. Lorsque l'interface est libérée par le processus client, ces objets seront détruites lors du garbage collection.

Par sa conception, COM utilise paresseux garbage collection pour libérer des ressources système qui ne sont plus nécessaires. Cette collection se produit au cours des périodes d'inactivité relative. Si une application cliente ne fournit pas suffisamment de temps libre pour le garbage collection se produise, il est possible que le système manque de ressources et ne pourront plus marshaler des interfaces. Si cela se produit, la couche COM elle-même peut devenir corrompue, prévenir toute nouvelle opération garbage collection jusqu'à ce que le système soit redémarré.

La cause la plus courante pour le problème est que le code du client a entré une boucle serrée ou effectue une période d'intense d'automation impliquant une hiérarchie d'objets imbriqués, où les appels successifs seront permettent d'obtenir et de libérer des nombreux objets out-of-process en un laps de temps. Par exemple, l'exemple de code suivant montre une hiérarchie d'objet imbriqué requiert trois interfaces à marshaler chaque fois que la méthode PrintOut est appelée. Étant donné que le code s'exécute dans une boucle serrée, le nombre total d'interfaces qui sont marshalées est 30 :
   For i = 1 To 10
      oExcel.ActiveWorkbook.Sheets(i).UsedRange.PrintOut
   Next i
				
pour Windows 95 et Windows 98, le nombre total d'interfaces qui peuvent être marshalés à la fois est environ 65 536.

Résolution

Les développeurs doivent réduire le nombre de références d'objet qu'ils demandent au cours des boucles serrées ou périodes lourdes d'automation. Si vous avez besoin d'une interface plusieurs fois, il doit être détenue à et utilisé à plusieurs reprises plutôt que lancé et reacquired plusieurs fois de suite.

Par exemple, cette version modifiée de l'exemple ci-dessus exécute la même tâche mais ne nécessite que deux interfaces doivent être marshalées pour chaque appel PrintOut (une réduction de 30 % à partir du code ci-dessus):
   Set oBook = oExcel.ActiveWorkbook
   For i = 1 To 10
      oBook.Sheets(i).UsedRange.PrintOut
   Next i
				
est une autre solution possible peut-être à déplacer certains code automation en processus vers le serveur, si le serveur autorise pour l'écriture de scripts en cours. Par exemple, produits Microsoft Office intègrent VBA scripts pour automation interne. En déplaçant le code de boucle dans un module VBA, vous pouvez éviter le marshaling des interfaces multiples et à la place appeler une macro qui permet au serveur de faire tout le travail.

Références

Pour plus d'informations, consultez l'article suivant dans la base de connaissances Microsoft :
219905Comment faire : Ajouter dynamiquement et exécuter une macro VBA à partir de Visual Basic

Propriétés

Numéro d'article: 216400 - Dernière mise à jour: mercredi 24 janvier 2007 - Version: 4.4
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Windows 95
  • Microsoft Windows 98 Standard Edition
  • Microsoft Windows Millennium Edition
Mots-clés : 
kbmt kbautomation kboleapp kbprb KB216400 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 216400
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com