Fehler: GlobalMultiUse-Klasse wird in Multithread-Umgebung nicht beenden.

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 300850 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Dieser Artikel wurde archiviert. Er wird im vorliegenden Zustand bereitgestellt und nicht mehr aktualisiert.
Alles erweitern | Alles schließen

Auf dieser Seite

Problembeschreibung

Wenn zwei Clients Aufrufen einer Prozedur ein ActiveX-EXE-Datei ruft Komponente an der gleichen Zeit, und dieser Prozedur eine andere Prozedur einer mehrfach verwendbares Klasse in eine ActiveX-dynamic-link Bibliothek (DLL), wenn diese Klasse eine Prozedur in einer GlobalMultiUse-Klasse in eine andere ActiveX DLL, die ActiveX EXE zugreift Komponente bleibt im Speicher;, die fehlschlägt, sogar nachdem alle beendet die Verweise darauf wurden freigegeben.

Dieses Verhalten tritt nicht in Visual Basic 6.0 Service Pack 3 (SP3) oder früher auf.

Ursache

Dieses Problem tritt auf, da DllCanUnloadNow -Funktion der DLL GlobalMultiUse FALSE zurückgibt, wenn Sie derzeit von einem anderen Thread aufgerufen wird. Dies bedeutet, dass GlobalMultiUse-DLL nicht können selbst in einer Multithreadumgebung freigeben kann.

Lösung

Ein unterstützter Hotfix ist inzwischen von Microsoft erhältlich; dieser Hotfix wurde jedoch ausschließlich zur Behebung des in diesem Artikel beschriebenen Problems entwickelt. Wenden Sie es nur auf Systemen, bei die dieses spezielle Problem auftritt.

Hinweis: Sie müssen eine Visual Studio-Lizenz Vereinbarung zu diesem Hotfix verfügen.

Wenden Sie sich zum Beheben dieses Problems an Microsoft Product Support Services, um den Hotfix zu erhalten. Eine vollständige Liste mit Telefonnummern der Microsoft-Produktsupport und Informationen Supportkosten der folgenden Microsoft-Website:
http://support.microsoft.com/contactus/?ws=support
Hinweis: PLEASE DO NOT TRANSLATE and DELETE THIS PASSAGE. IT DOES NOT APPLY TO GERMANY. Die englische Version dieses Updates sollte die folgenden Dateiattribute (oder höher) aufweisen:
   Date         Time        Version    Size     File name   
   ---------------------------------------------------------
   29 May 2001  3:32:23 PM  6.0.92.37  1.32 MB  Msvbvm60.dll
				

Status

Microsoft hat bestätigt, dass es sich hierbei um ein Problem bei den in diesem Artikel Microsoft-Produkten handelt.

Weitere Informationen

Schritte zum Reproduzieren des Verhaltens

Erstellen der DLL mit einer GlobalMultiUse-Klasse

  1. Erstellen Sie ein neues ActiveX-DLL-Projekt mit einer Standardklasse Class1.
  2. Klicken Sie im Menü Projekt auf Projekt1 Eigenschaften . Ändern Sie den Namen des Projekts zu GMultiUseDll , und klicken Sie dann auf OK .
  3. Legen Sie die Instancing-Eigenschaft von Class1 in 6 - GlobalMultiUse , klicken Sie im Dialogfeld Eigenschaften .
  4. Kopieren und fügen Sie den folgenden Code in Class1 des Code-Modul:
    Public Function ClassName() As String
        ClassName = "Class1"
    End Function
    					
  5. Klicken Sie im Menü Datei auf Als GMultiUseDll.dll zum Kompilieren des Projekts. GMultiUseDll.dll wird erstellt.

Erstellen der DLL mit einer mehrfach verwendbares Klasse

  1. Erstellen Sie ein neues ActiveX-DLL-Projekt mit einer Standardklasse Class1.
  2. Klicken Sie im Menü Projekt auf Projekt1 Eigenschaften . Ändern Sie den Namen des Projekts zu MultiUseDll , und klicken Sie dann auf OK .
  3. Im Menü Projekt klicken Sie auf Verweise , aktivieren Sie das Kontrollkästchen GMultiUseDll.dll und klicken Sie dann auf OK .
  4. Kopieren und fügen Sie den folgenden Code in Class1 des Code-Modul:
    Public Function GetString() As String
        GetString = ClassName
    End Function
    					
  5. Klicken Sie im Menü Datei auf Als MultiUseDll.dll zum Kompilieren des Projekts. MultiUseDll.dll wird erstellt.

Erstellen des ActiveX-EXE-Projekts

  1. Erstellen Sie ein neues ActiveX-EXE-Projekt mit einer Standardklasse Class1.
  2. Klicken Sie im Menü Projekt auf Projekt1 Eigenschaften . Ändern Sie den Namen des Projekts zu TestServer , und klicken Sie dann auf OK .
  3. Im Menü Projekt klicken Sie auf Verweise , aktivieren Sie das Kontrollkästchen MultiUseDll.dll und klicken Sie dann auf OK .
  4. Klicken Sie im Menü Projekt auf TestServer Eigenschaften . Legen Sie auf der Registerkarte Allgemein der Threadpool auf 10 Threads.
  5. Kopieren und fügen Sie den folgenden Code in Class1 des Code-Modul
    Public Sub DoSomething()
        Dim obj As MultiuseDll.Class1
        Set obj = New MultiuseDll.Class1
        obj.GetString
    End Sub
    					
  6. Klicken Sie im Menü Datei auf Als TextServer.exe zum Kompilieren des Projekts. TextServer.exe wird erstellt.

Erstellen des Client-Projekts

  1. Erstellen Sie ein neues Standard-Projekt mit einem Standardformular Form1.
  2. Klicken Sie im Menü Projekt auf Projekt1 Eigenschaften . Ändern Sie den Namen des Projekts zu TestClient , und klicken Sie dann auf OK .
  3. Fügen Sie eine Bezeichnung (Label1), ein Textfeld (Text1) und zwei Befehlsschaltflächen (Command1 und Command2) zu Form1 hinzu.
  4. Kopieren und fügen Sie den folgenden Code in Form1 des Code-Modul:
    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. Klicken Sie im Menü Datei auf Als TestClient.exe zum Kompilieren des Projekts. TestClient.exe wird erstellt.

Ausführen des Tests

  1. Öffnen Sie Editor. Die Position des ersten Buchstaben "t" hinzu, und speichern Sie die Datei als Sync.txt im Stammverzeichnis von Laufwerk c:.
  2. Starten Sie zwei Instanzen von TestClient.exe. Beachten Sie, dass zwei TestClient.exe Prozesse im Task-Manager ausgeführt werden.
  3. Klicken Sie auf Start , um beide Instanzen von TestClient.
  4. Öffnen Sie Sync.txt. Ändern Sie die erste Zeile auf "True", und speichern.

    Nachdem Sie die Datei speichern, feststellen des TestServer.exe-Prozess im Task-Manager.
  5. Klicken Sie für beide Instanzen von TestClient auf Beenden und schließen Sie die Formulare. Beachten Sie, dass keine Instanzen von TestClient.exe ausgeführt wird. An dieser Stelle bleibt TestServer.exe geladen.
Weitere Informationen zu Problemen zu multithreading in Visual Basic folgendem Artikel der Microsoft Knowledge Base:
241896PRB: Threading Probleme mit Visual Basic 6.0-ActiveX-Komponenten

Eigenschaften

Artikel-ID: 300850 - Geändert am: Montag, 24. Februar 2014 - Version: 4.2
Die Informationen in diesem Artikel beziehen sich auf:
  • 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 Professional Edition
Keywords: 
kbnosurvey kbarchive kbmt kbbug kblocalsvr kbpending kbqfe KB300850 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 300850
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns