Erro: Classe GlobalMultiUse não terminar em ambiente multithread

Traduções deste artigo Traduções deste artigo
ID do artigo: 300850 - Exibir os produtos aos quais esse artigo se aplica.
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Expandir tudo | Recolher tudo

Neste artigo

Sintomas

Quando dois clientes chamar um procedimento de um EXE ActiveX componente no mesmo momento e esse procedimento chama outro procedimento de uma classe MultiUse em uma biblioteca de vínculo dinâmico ActiveX (DLL), se essa classe acessar um procedimento em uma classe GlobalMultiUse em outro ActiveX DLL, EXE ActiveX componente permanece na memória; que é, o processo falhar finalizar, mesmo depois que todas as referências a ele tem sido lançadas.

Esse comportamento não ocorre no Visual Basic 6.0 Service Pack 3 (SP3) ou anterior.

Causa

Esse problema ocorre porque a função DllCanUnloadNow de DLL GlobalMultiUse retorna FALSO se atualmente está sendo chamado por outro thread. Isso significa que a DLL GlobalMultiUse pode não ser capaz de liberar próprio em um ambiente multithreaded.

Resolução

Um hotfix suportado agora está disponível da Microsoft, mas destina-se somente a corrigir o problema descrito neste artigo. Aplique-o somente aos sistemas que apresentarem esse problema específico.

Observação Você deve ter um contrato de licença do Visual Studio para obter este hotfix.

Para resolver esse problema, contate o Atendimento Microsoft para obter o hotfix. Para obter uma lista completa de telefones do Atendimento Microsoft e informações sobre os custos de suporte da, visite o seguinte site:
http://support.microsoft.com/contactus/?ws=support
Observação Em alguns casos, as taxas cobradas pelas ligações para chamadas de suporte podem ser canceladas se um profissional de suporte da Microsoft determinar que uma atualização específica resolverá o problema. Os custos normais de suporte serão aplicados a questões e problemas que não se qualificam à atualização específica em questão de suporte adicionais. A versão em inglês dessa correção deve ter os seguintes atributos de arquivo ou posteriores:
   Date         Time        Version    Size     File name   
   ---------------------------------------------------------
   29 May 2001  3:32:23 PM  6.0.92.37  1.32 MB  Msvbvm60.dll
				

Situação

A Microsoft confirmou que este é um bug no Microsoft produtos que estão listados no início deste artigo.

Mais Informações

Passos para reproduzir o problema

Criar a DLL com uma classe GlobalMultiUse

  1. Crie um novo projeto ActiveX DLL com uma classe padrão, Class1.
  2. A partir do menu Project , clique em Propriedades de Projeto1 . Altere o nome de projeto para GMultiUseDll e, em seguida, clique em OK .
  3. Na caixa de diálogo Propriedades , defina a propriedade Instancing Class1 como 6 - GlobalMultiUse .
  4. Copie e cole o seguinte código ao módulo de código do Class1:
    Public Function ClassName() As String
        ClassName = "Class1"
    End Function
    					
  5. No menu arquivo , clique em Criar GMultiUseDll.dll para compilar o projeto. GMultiUseDll.dll é criado.

Criar a DLL com uma classe MultiUse

  1. Crie um novo projeto ActiveX DLL com uma classe padrão, Class1.
  2. A partir do menu Project , clique em Propriedades de Projeto1 . Altere o nome de projeto para MultiUseDll e, em seguida, clique em OK .
  3. A partir do menu Project , clique em referências , marque a caixa de seleção GMultiUseDll.dll e, em seguida, clique em OK .
  4. Copie e cole o seguinte código ao módulo de código do Class1:
    Public Function GetString() As String
        GetString = ClassName
    End Function
    					
  5. No menu arquivo , clique em Criar MultiUseDll.dll para compilar o projeto. MultiUseDll.dll é criado.

Criar projeto EXE ActiveX

  1. Crie um novo projeto ActiveX EXE com uma classe padrão, Class1.
  2. A partir do menu Project , clique em Propriedades de Projeto1 . Altere o nome de projeto para TestServer e, em seguida, clique em OK .
  3. A partir do menu Project , clique em referências , marque a caixa de seleção MultiUseDll.dll e, em seguida, clique em OK .
  4. No menu Project , clique em Propriedades TestServer . Na guia Geral , defina o pool de segmentos para 10 segmentos.
  5. Copie e cole o seguinte código ao módulo de código do Class1
    Public Sub DoSomething()
        Dim obj As MultiuseDll.Class1
        Set obj = New MultiuseDll.Class1
        obj.GetString
    End Sub
    					
  6. No menu arquivo , clique em Criar TextServer.exe para compilar o projeto. TextServer.exe é criado.

Criar o projeto de cliente

  1. Crie um novo projeto Standard EXE com um formulário padrão, o Form1.
  2. A partir do menu Project , clique em Propriedades de Projeto1 . Altere o nome de projeto para TestClient e, em seguida, clique em OK .
  3. Adicione um rótulo (Label1), um TextBox (Texto1) e dois CommandButtons (Command1 e Command2) ao Form1.
  4. Copie e cole o código a seguir ao módulo de código do 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. No menu arquivo , clique em Criar TestClient.exe para compilar o projeto. TestClient.exe é criado.

Executar o teste

  1. Abra o bloco de notas. Adicionar a letra "t" a posição do primeiro e salve o arquivo como Sync.txt na raiz da unidade C.
  2. Inicie duas instâncias de TestClient.exe. Observe que dois processos de TestClient.exe estão em execução no Gerenciador de tarefas.
  3. Clique em Iniciar para ambas as instâncias de TestClient.
  4. Abra Sync.txt. Altere a primeira linha como "true" e salve.

    Após você salva o arquivo, observe o processo de TestServer.exe no Gerenciador de tarefas.
  5. Clique em Parar para ambas as instâncias de TestClient e feche os formulários. Observe que não há nenhuma instância de execução TestClient.exe. Neste ponto, TestServer.exe permanece carregado.
Para informações adicionais sobre problemas relacionados a multithreading in Visual Basic, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
241896PROBLEMA: Threading problemas com componentes de ActiveX do Visual Basic 6.0

Propriedades

ID do artigo: 300850 - Última revisão: segunda-feira, 24 de fevereiro de 2014 - Revisão: 4.2
A informação contida neste artigo aplica-se 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
Palavras-chave: 
kbnosurvey kbarchive kbmt kbbug kblocalsvr kbpending kbqfe KB300850 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 300850

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