BOGUE : GlobalMultiUse Class ne pas terminaison dans un environnement multithread

Traductions disponibles Traductions disponibles
Numéro d'article: 300850 - Voir les produits auxquels s'applique cet article
Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
Agrandir tout | Réduire tout

Sommaire

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 :
http://support.microsoft.com/contactus/?ws=support
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 = ClassName
    End 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.GetString
    End 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 Boolean
    
    Private 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
        Loop
    End Sub
    
    Private Sub Command2_Click()
        bStop = True
    End Sub
    
    Private Sub Form_Load()
        Text1.Text = "c:\sync.txt"
        Command1.Caption = "Start"
        Command2.Caption = "Stop"
        bStop = False
    End Sub
    
    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
        bStop = True
    End 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

Propriétés

Numéro d'article: 300850 - Dernière mise à jour: lundi 24 février 2014 - Version: 4.2
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • 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
Mots-clés : 
kbnosurvey kbarchive kbmt kbbug kblocalsvr kbpending kbqfe KB300850 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: 300850
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.

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