Error: No terminar la clase GlobalMultiUse en entorno de multiproceso

Seleccione idioma Seleccione idioma
Id. de artículo: 300850 - Ver los productos a los que se aplica este artículo
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Expandir todo | Contraer todo

En esta página

Síntomas

Cuando dos clientes llamar a un procedimiento de un archivo EXE de ActiveX componente en el mismo momento y este procedimiento llama a otro procedimiento de una clase bien multiuso en una biblioteca de ActiveX dynamic-link (DLL), si esta clase tiene acceso a un procedimiento en una clase GlobalMultiUse ActiveX DLL otro, el ActiveX EXE componente permanece en memoria; que es, el proceso falla terminar, incluso después de todo han liberado las referencias a él.

Este comportamiento no se produce en Visual Basic 6.0 Service Pack 3 (SP3) o anterior.

Causa

Este problema se produce porque la función DllCanUnloadNow de la DLL de GlobalMultiUse devuelve FALSE si actualmente se llama por otro subproceso. Esto significa que la DLL de GlobalMultiUse puede no podrá liberar propio en un entorno multiproceso.

Solución

Ahora es disponible en Microsoft un hotfix compatible, pero sólo se diseñó para corregir el problema que se describe en este artículo. Aplíquela sólo a sistemas que experimenten este problema específico.

Nota Debe tener un acuerdo de licencia de Visual Studio para obtener este hotfix.

Para resolver el problema, póngase en contacto con los Servicios de soporte técnico de Microsoft con el fin de obtener el hotfix. Para obtener una lista completa de los números de teléfono de los servicios de soporte técnico de Microsoft e información acerca de los costos de soporte, visite el siguiente sitio Web:
http://support.microsoft.com/contactus/?ws=support
Nota en casos especiales, los costos derivados normalmente de las llamadas al soporte técnico pueden cancelarse si un profesional de soporte técnico de Microsoft determina que una actualización específica resolverá el problema. Los costos habituales de soporte se aplicarán a las preguntas de soporte técnico adicionales y problemas que no guarden relación con la actualización en cuestión. La versión en inglés de esta revisión debe tener los atributos de archivo siguientes o posteriores:
   Date         Time        Version    Size     File name   
   ---------------------------------------------------------
   29 May 2001  3:32:23 PM  6.0.92.37  1.32 MB  Msvbvm60.dll
				

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft enumerados al principio de este artículo.

Más información

Pasos para reproducir el comportamiento

Crear la DLL con una clase GlobalMultiUse

  1. Crear un proyecto de DLL ActiveX nuevo con una clase de predeterminada (Class1.
  2. En el menú proyecto , haga clic en Propiedades de Project1 . Cambie el nombre del proyecto a GMultiUseDll y, a continuación, haga clic en Aceptar .
  3. En el cuadro de diálogo Propiedades , establezca la propiedad Instancing de Class1 a 6 - GlobalMultiUse .
  4. Copie y pegue el código siguiente al módulo de código de Class1:
    Public Function ClassName() As String
        ClassName = "Class1"
    End Function
    					
  5. En el menú archivo , haga clic en Crear GMultiUseDll.dll para compilar el proyecto. Se crea GMultiUseDll.dll.

Crear la DLL con una clase bien multiuso

  1. Crear un proyecto de DLL ActiveX nuevo con una clase de predeterminada (Class1.
  2. En el menú proyecto , haga clic en Propiedades de Project1 . Cambie el nombre del proyecto a MultiUseDll y, a continuación, haga clic en Aceptar .
  3. En el menú proyecto , haga clic en referencias , active la casilla de verificación GMultiUseDll.dll y, a continuación, haga clic en Aceptar .
  4. Copie y pegue el código siguiente al módulo de código de Class1:
    Public Function GetString() As String
        GetString = ClassName
    End Function
    					
  5. En el menú archivo , haga clic en Crear MultiUseDll.dll para compilar el proyecto. Se crea MultiUseDll.dll.

Crear el proyecto de EXE ActiveX

  1. Crear un nuevo proyecto de EXE ActiveX con una clase de predeterminada (Class1.
  2. En el menú proyecto , haga clic en Propiedades de Project1 . Cambie el nombre del proyecto a TestServer y, a continuación, haga clic en Aceptar .
  3. En el menú proyecto , haga clic en referencias , active la casilla de verificación MultiUseDll.dll y, a continuación, haga clic en Aceptar .
  4. En el menú proyecto , haga clic en Propiedades TestServer . En la ficha General , establezca el grupo de subprocesos a 10 subprocesos.
  5. Copie y pegue el código siguiente al módulo de código de Class1
    Public Sub DoSomething()
        Dim obj As MultiuseDll.Class1
        Set obj = New MultiuseDll.Class1
        obj.GetString
    End Sub
    					
  6. En el menú archivo , haga clic en Crear TextServer.exe para compilar el proyecto. Se crea TextServer.exe.

Crear el proyecto de cliente

  1. Crear un nuevo proyecto EXE estándar con un formulario predeterminado, Form1.
  2. En el menú proyecto , haga clic en Propiedades de Project1 . Cambie el nombre del proyecto a TestClient y, a continuación, haga clic en Aceptar .
  3. Agregue una etiqueta (Label1), un control TextBox (Texto1) y dos botones de comando (Command1 y Command2) a Form1.
  4. Copie y pegue el código siguiente al módulo de código 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. En el menú archivo , haga clic en Crear TestClient.exe para compilar el proyecto. Se crea TestClient.exe.

Ejecutar la prueba

  1. Abra el Bloc de notas. Agregar la letra "t" a la primera posición y guarde el archivo como Sync.txt en la raíz de unidad C.
  2. Inicie dos instancias de TestClient.exe. Observe que dos procesos TestClient.exe están ejecutando en el Administrador de tareas.
  3. Haga clic en Inicio para las dos instancias de TestClient.
  4. Abra Sync.txt. Cambie la primera línea en "true" y guarde.

    Después de guardar el archivo, observe el proceso de TestServer.exe en el Administrador de tareas.
  5. Haga clic en Detener para ambas instancias de TestClient y cierre los formularios. Observe que no hay ninguna instancia de ejecución TestClient.exe. En este momento, TestServer.exe permanece cargado.
Para obtener información adicional sobre problemas relacionados con subprocesamiento múltiple en Visual Basic, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
241896PRB: Subprocesos problemas con los componentes de ActiveX de Visual Basic 6.0

Propiedades

Id. de artículo: 300850 - Última revisión: lunes, 24 de febrero de 2014 - Versión: 4.2
La información de este artículo se refiere a:
  • Service Pack 4 de Microsoft Visual Studio 6.0
  • Service Pack 5 de Microsoft Visual Studio 6.0
  • Service Pack 4 de Microsoft Visual Basic 6.0 Enterprise Edition
  • Microsoft Visual Basic 6.0 Enterprise Edition Service Pack 5
  • Microsoft Visual Basic 6.0 Professional Edition
Palabras clave: 
kbnosurvey kbarchive kbmt kbbug kblocalsvr kbpending kbqfe KB300850 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 300850

Enviar comentarios

 

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