BOGUE : GlobalMultiUse Class ne pas terminaison dans un environnement multithread

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: 300850
Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
Symptômes
Lorsque deux clients appeler une procédure d'un EXE ActiveX composant au même moment et cette procédure appelle une autre procédure d'une classe MultiUse dans une bibliothèque ActiveX dynamic-link (DLL), si cette classe accède à une procédure dans une classe GlobalMultiUse ActiveX DLL un autre, le ActiveX EXE composant reste en mémoire, qui est, le processus ne parvient pas à arrêter, même après tout les références ont été publiés.

Ce problème ne se produit pas dans Visual Basic 6.0 Service Pack 3 (SP3) ou version antérieure.
Cause
Ce problème se produit car la fonction DllCanUnloadNow de la DLL GlobalMultiUse renvoie FALSE si elle est actuellement appelée par un autre thread. Cela signifie que la DLL GlobalMultiUse ne peut pas être en mesure de se lancer dans un environnement multithread.
Résolution
Un correctif est désormais disponible auprès de Microsoft, mais il ne vise qu'à corriger le problème décrit dans cet article. S'il s'appliquent uniquement aux systèmes rencontrant ce problème spécifique.

note Vous devez disposer d'un accord de licence de Visual Studio pour vous procurer ce correctif.

Pour résoudre ce problème, contactez le support technique Microsoft afin d'obtenir le correctif logiciel. Pour une liste complète des numéros de téléphone des services de support technique Microsoft et des informations sur les frais de support technique, reportez-vous au site de Web Microsoft suivant : note Dans certains cas, les frais aucuns de support peuvent être facturés si un technicien du support technique Microsoft détermine qu'une mise à jour spécifique peut résoudre votre problème. Les coûts habituels du support technique s'appliqueront aux autres questions et problèmes non traités par la mise à jour en question. La version anglaise de ce correctif doit avoir les attributs de fichier suivants ou ceux d'une version ultérieure :
   Date         Time        Version    Size     File name      ---------------------------------------------------------   29 May 2001  3:32:23 PM  6.0.92.37  1.32 MB  Msvbvm60.dll				

Statut
Microsoft a confirmé le que de ce bogue dans le Microsoft produits répertoriés au début de cet article.
Plus d'informations

Procédure pour reproduire le comportement

Créez la DLL avec une classe GlobalMultiUse

  1. Créez un nouveau projet DLL ActiveX avec une classe par défaut, Class1.
  2. Dans le menu projet , cliquez sur Propriétés de Projet1 . Remplacez le nom de projet GMultiUseDll , puis cliquez sur OK .
  3. Dans la boîte de dialogue Propriétés , définissez la propriété Instancing Class1 à 6 - GlobalMultiUse .
  4. Copiez et collez le code suivant au module de code de Class1 :
    Public Function ClassName() As String    ClassName = "Class1"End Function					
  5. Dans le menu Fichier , cliquez sur Créer GMultiUseDll.dll pour compiler le projet. GMultiUseDll.dll est créé.

Créez la DLL avec une classe MultiUse

  1. Créez un nouveau projet DLL ActiveX avec une classe par défaut, Class1.
  2. Dans le menu projet , cliquez sur Propriétés de Projet1 . Remplacez le nom de projet MultiUseDll , puis cliquez sur OK .
  3. Dans le menu projet , cliquez sur Références , activez la case à cocher GMultiUseDll.dll et puis cliquez sur OK .
  4. Copiez et collez le code suivant au module de code de Class1 :
    Public Function GetString() As String    GetString = ClassNameEnd Function					
  5. Dans le menu Fichier , cliquez sur Créer MultiUseDll.dll pour compiler le projet. MultiUseDll.dll est créé.

Créez le projet EXE ActiveX

  1. Créez un nouveau projet de ActiveX EXE avec une classe par défaut, Class1.
  2. Dans le menu projet , cliquez sur Propriétés de Projet1 . Remplacez le nom de projet TestServer , puis cliquez sur OK .
  3. Dans le menu projet , cliquez sur Références , activez la case à cocher MultiUseDll.dll et puis cliquez sur OK .
  4. Dans le menu projet , cliquez sur Propriétés TestServer . Sous l'onglet Général , définissez le pool de threads à 10 threads.
  5. Copiez et collez le code suivant au module de code de Class1
    Public Sub DoSomething()    Dim obj As MultiuseDll.Class1    Set obj = New MultiuseDll.Class1    obj.GetStringEnd Sub					
  6. Dans le menu Fichier , cliquez sur Créer TextServer.exe pour compiler le projet. TextServer.exe est créé.

Créez le projet client

  1. Créez un nouveau projet EXE standard d'un formulaire par défaut, Form1.
  2. Dans le menu projet , cliquez sur Propriétés de Projet1 . Remplacez le nom de projet TestClient , puis cliquez sur OK .
  3. Ajoutez une étiquette (Label1), une zone de texte (Texte1) et deux CommandButtons (Command1 et Command2) à Form1.
  4. Copiez et collez le code suivant au module de code de Form1 :
    Dim bStop As BooleanPrivate Sub Command1_Click()    Dim oServer As Object    Set oServer = CreateObject("TestServer.Class1")    WaitTRUEinFile Text1.Text    oServer.DoSomething    Set oServer = Nothing    Label1.Caption = "The reference was released"End Sub' The purpose of this function is to synchronize the call to the' GlobalMultiUse DLL through the file Sync.txt.Private Sub WaitTRUEinFile(sFile As String)    Dim sFlag      As String    Label1.Caption = "Waiting for 'TRUE' in " & sFile    Do While bStop = False        Open sFile For Input As #1        Line Input #1, sFlag        Close #1                If UCase(Trim(sFlag)) = "TRUE" Then            Exit Do        End If        DoEvents    LoopEnd SubPrivate Sub Command2_Click()    bStop = TrueEnd SubPrivate Sub Form_Load()    Text1.Text = "c:\sync.txt"    Command1.Caption = "Start"    Command2.Caption = "Stop"    bStop = FalseEnd SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)    bStop = TrueEnd Sub					
  5. Dans le menu Fichier , cliquez sur Créer TestClient.exe pour compiler le projet. TestClient.exe est créé.

Exécuter le test

  1. Ouvrez le bloc-notes. Ajouter la lettre « t » en première position et enregistrer le fichier en tant que Sync.txt à la racine du lecteur c.
  2. Démarrez deux instances de TestClient.exe. Notez que deux processus TestClient.exe sont exécutent dans le Gestionnaire des tâches.
  3. Cliquez sur Démarrer pour les deux instances de TestClient.
  4. Ouvrez Sync.txt. Modifier la première ligne la valeur « True » et enregistrer.

    Après avoir enregistré le fichier, notez le processus TestServer.exe dans le Gestionnaire des tâches.
  5. Cliquez sur Arrêter pour les deux instances de TestClient et fermez les formulaires. Notez qu'aucune instance ne d'exécution TestClient.exe. À ce stade, TestServer.exe reste chargé.
Pour plus d'informations sur les problèmes relatifs à multithreading dans Visual Basic, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
241896 MODÈLE : thread problèmes rencontrés avec les composants ActiveX Visual Basic 6.0
multi-thread

Avertissement : Cet article a été traduit automatiquement.

Propriétés

ID d'article : 300850 - Dernière mise à jour : 02/24/2014 06:04:55 - Révision : 4.2

Microsoft Visual Studio 6.0 Service Pack 4, Microsoft Visual Studio 6.0 Service Pack 5, Microsoft Visual Basic 6.0 Enterprise Edition Service Pack 4, Microsoft Visual Basic 6.0 Enterprise Edition Service Pack 5, Microsoft Visual Basic 6.0 Édition professionnelle

  • kbnosurvey kbarchive kbmt kbbug kblocalsvr kbpending kbqfe KB300850 KbMtfr
Commentaires