BUG: La classe GlobalMultiUse non termina in ambiente con multithreading

Traduzione articoli Traduzione articoli
Identificativo articolo: 300850 - Visualizza i prodotti a cui si riferisce l?articolo.
Questo articolo Ŕ stato archiviato. L?articolo, quindi, viene offerto ?cosý come Ŕ? e non verrÓ pi¨ aggiornato.
Espandi tutto | Chiudi tutto

In questa pagina

Sintomi

Quando due client chiama una routine di un file EXE ActiveX componente al momento stesso e questa procedura chiama un'altra routine di una classe multiuso in una libreria a collegamento dinamico ActiveX (DLL), se questa classe accede a una routine in una classe GlobalMultiUse in un'altra DLL ActiveX, il file EXE ActiveX componente rimane in memoria; Ŕ, il processo non riesce terminare, anche dopo che tutti i sono stati rilasciati i riferimenti.

Questo comportamento non si verifica in Visual Basic 6.0 Service Pack 3 (SP3) o versioni precedenti.

Cause

Questo problema si verifica perchÚ la funzione di DllCanUnloadNow della DLL GlobalMultiUse restituisce FALSE se chiamato attualmente da un altro thread. Questo significa che la DLL di GlobalMultiUse potrebbe non essere in grado di rilasciare stesso in un ambiente con multithreading.

Risoluzione

Un hotfix supportato Ŕ disponibile da Microsoft, tuttavia Ŕ destinato esclusivamente per risolvere il problema descritto in questo articolo. Applicarlo solo a sistemi che si verifica questo problema specifico.

Nota ╚ necessario un contratto di licenza verrÓ per ottenere questo hotfix.

Per risolvere il problema, contattare il servizio supporto tecnico clienti Microsoft per ottenere l'hotfix. Per un elenco completo di numeri di telefono del servizio supporto tecnico clienti Microsoft e per informazioni sui costi dell'assistenza, visitare il seguente sito Web Microsoft:
http://support.microsoft.com/contactus/?ws=support
Nota in casi particolari, le spese normalmente addebitate per le chiamate al Servizio Supporto Tecnico Clienti Microsoft potrebbero essere annullate qualora un addetto del Supporto Tecnico Microsoft dovesse determinare che uno specifico aggiornamento risolverÓ il problema. I normali costi del Servizio Supporto Tecnico Clienti verranno applicati per eventuali ulteriori domande e problemi che non dovessero rientrare nello specifico aggiornamento in questione. La versione inglese di questa correzione deve essere di avere i seguenti attributi di file o versioni successive:
   Date         Time        Version    Size     File name   
   ---------------------------------------------------------
   29 May 2001  3:32:23 PM  6.0.92.37  1.32 MB  Msvbvm60.dll
				

Status

Microsoft ha confermato che questo un bug in Microsoft i prodotti elencati all'inizio di questo articolo.

Informazioni

Procedura per riprodurre il problema.

Creare la DLL con una classe GlobalMultiUse

  1. Creare un nuovo progetto di DLL ActiveX con una classe predefinita, Class1.
  2. Dal menu progetto , scegliere ProprietÓ Progetto1 . Modificare il nome del progetto per GMultiUseDll e quindi fare clic su OK .
  3. Nella finestra di dialogo ProprietÓ , impostare la proprietÓ Instancing di Class1 a 6 - GlobalMultiUse dei comandi.
  4. Copiare e incollare il codice seguente al modulo di codice di Class1:
    Public Function ClassName() As String
        ClassName = "Class1"
    End Function
    					
  5. Dal menu file , fare clic su Crea GMultiUseDll.dll per compilare il progetto. GMultiUseDll.dll viene creato.

Creare la DLL con una classe multiuso

  1. Creare un nuovo progetto di DLL ActiveX con una classe predefinita, Class1.
  2. Dal menu progetto , scegliere ProprietÓ Progetto1 . Modificare il nome del progetto per MultiUseDll e quindi fare clic su OK .
  3. Dal menu progetto , fare clic su riferimenti , selezionare la casella di controllo GMultiUseDll.dll e quindi fare clic su OK .
  4. Copiare e incollare il codice seguente al modulo di codice di Class1:
    Public Function GetString() As String
        GetString = ClassName
    End Function
    					
  5. Dal menu file , fare clic su Crea MultiUseDll.dll per compilare il progetto. MultiUseDll.dll viene creato.

Creare il progetto EXE ActiveX

  1. Creare un nuovo progetto EXE ActiveX una classe predefinita, Class1.
  2. Dal menu progetto , scegliere ProprietÓ Progetto1 . Modificare il nome del progetto per TestServer e quindi fare clic su OK .
  3. Dal menu progetto , fare clic su riferimenti , selezionare la casella di controllo MultiUseDll.dll e quindi fare clic su OK .
  4. Dal menu progetto , fare clic su ProprietÓ TestServer . Nella scheda Generale , Ŕ possibile impostare il pool di thread su 10 thread.
  5. Copiare e incollare il codice seguente al modulo di codice di Class1
    Public Sub DoSomething()
        Dim obj As MultiuseDll.Class1
        Set obj = New MultiuseDll.Class1
        obj.GetString
    End Sub
    					
  6. Dal menu file , fare clic su Crea TextServer.exe per compilare il progetto. TextServer.exe viene creato.

Creare il progetto client

  1. Creare un nuovo progetto EXE standard un modulo predefinito, Form1.
  2. Dal menu progetto , scegliere ProprietÓ Progetto1 . Modificare il nome del progetto per TestClient e quindi fare clic su OK .
  3. Aggiungere un'etichetta (Label1), un controllo TextBox (testo1) e due CommandButtons (Command1 e Command2) a Form1.
  4. Copiare e incollare il codice seguente al modulo di codice del 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. Dal menu file , fare clic su Crea TestClient.exe per compilare il progetto. TestClient.exe viene creato.

Eseguire il test

  1. Aprire il blocco note. Aggiungere la prima posizione la lettera "t" e salvare il file come Sync.txt nella directory principale dell'unitÓ c.
  2. Avviare due istanze di TestClient.exe. Si noti che due processi TestClient.exe siano in esecuzione in Task Manager.
  3. Fare clic su Start per entrambe le istanze di TestClient.
  4. Aprire Sync.txt. Modificare la prima riga su "true" e salvare.

    Dopo aver salvato il file, si noti il processo di TestServer.exe in Task Manager.
  5. Fare clic su Interrompi per entrambe le istanze di TestClient e chiudere i moduli. Si noti che non vi sono Nessuna istanza di esecuzione TestClient.exe. A questo punto, TestServer.exe rimane caricato.
Per ulteriori informazioni sui problemi relativi al multithreading in Visual Basic scegliere sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito:
241896PRB: Problemi con i componenti ActiveX di Visual Basic 6.0 di threading

ProprietÓ

Identificativo articolo: 300850 - Ultima modifica: lunedý 24 febbraio 2014 - Revisione: 4.2
Le informazioni in questo articolo si applicano a:
  • 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
Chiavi:á
kbnosurvey kbarchive kbmt kbbug kblocalsvr kbpending kbqfe KB300850 KbMtit
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 300850
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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