BUG: La classe GlobalMultiUse non termina in ambiente con multithreading

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
Questo articolo è stato archiviato. L’articolo, quindi, viene offerto “così come è” e non verrà più aggiornato.
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: 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 = ClassNameEnd 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.GetStringEnd 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 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. 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
multi-thread

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 300850 - Ultima revisione: 02/24/2014 12:49:05 - Revisione: 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 Professional Edition

  • kbnosurvey kbarchive kbmt kbbug kblocalsvr kbpending kbqfe KB300850 KbMtit
Feedback