REVISIÓN: Cuando se utiliza SendMessage con TB_GETIMAGELIST para obtener un identificador de ImageList en Windows XP, ¿no obtener el identificador correcto

Seleccione idioma Seleccione idioma
Id. de artículo: 811415 - 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

Puede utilizar SendMessage para obtener el identificador de la imagen de varios controles de controles comunes de Microsoft Windows (Mscomctl.ocx) 6.0. Mediante el uso de SendMessage , puede pasar TB_GETIMAGELIST, LVM_GETIMAGELIST, TVM_GETIMAGELIST o TCM_GETIMAGELIST para obtener el identificador de imagelist para la barra de herramientas, ListView, TreeView y controles TabStrip.

Sin embargo, al hacer esto en un equipo que ejecuta Windows XP, se devuelve el identificador incorrecto. Si llamar a cualquier otro API y, a continuación, pasar este identificador, las llamadas a API no funcionará correctamente.

Causa

Este problema se produce porque Windows XP y Mscomctl.ocx cargan dos versiones diferentes de Comctl32.dll que no son compatibles.

Solución

Ahora hay disponible un hotfix para el que Microsoft proporciona soporte técnico, pero que sólo se diseñó para corregir el problema descrito en este artículo. Aplíquelo sólo a sistemas que experimenten este problema específico. Este hotfix puede ser sometido a comprobaciones adicionales. Por lo tanto, si no se ve muy afectado por este problema, recomendamos que espere al próximo service pack de Visual Studio 6.0 que contenga este hotfix.

Para resolver este problema inmediatamente, póngase en contacto con los Servicios de soporte técnico de Microsoft con el fin de obtener la revisión. Para obtener una lista completa de los números de teléfono de servicios de soporte de técnico de Microsoft e información acerca de los costos de soporte, visite el siguiente sitio Web:
http://support.microsoft.com/default.aspx?scid=fh;EN-US;CNTACTMS
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 tiene los atributos de archivo enumerados en la siguiente tabla u otros posteriores. Las fechas y horas de estos archivos aparecen en la hora universal coordinada (UTC). La información de los archivos se convertirá a la hora local cuando la vea. Para averiguar la diferencia entre hora UTC y la hora local, utilice la ficha zona horaria de la herramienta fecha y hora en el panel de control.
   Date         Time   Version   Size       File name
   -----------------------------------------------------
   13-Dec-2002  00:18  6.0.97.1  1,062,160  Mscomctl.ocx

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

Para reproducir el problema mediante el control de barra de herramientas, siga estos pasos:
  1. Inicie un nuevo proyecto EXE estándar de Visual Basic 6.0. De forma predeterminada, se crea Form1.
  2. En el menú proyecto , haga clic en componentes . En el cuadro de diálogo componentes , agregue una referencia a Microsoft Common Controls 6.0 .
  3. Agregue un control ImageList (ImageList1), un control de barra de herramientas (Toolbar1) y un CommandButton (Command1) a Form1.
  4. Haga clic con el botón secundario en el control ImageList y, a continuación, haga clic en la ficha imágenes agregar controlan dos imágenes a ImageList.
  5. Add the following code to Form1:
    Option Explicit
    
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
    Private Declare Function GetImageCount Lib "comctl32" Alias "ImageList_GetImageCount" (ByVal p As Long) As Long
    Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal cmd As Long) As Long
    
    
    Private Const WM_USER = &H400
    Private Const TB_GETIMAGELIST = WM_USER + 49
    Private Const GW_CHILD = 5
    
    Private Sub Command1_Click()
        Dim hImageList As Long, hChild As Long
        
        hChild = GetWindow(Toolbar1.hwnd, GW_CHILD)
        
        hImageList = SendMessage(hChild, TB_GETIMAGELIST, 0, 0)
        MsgBox "Image Count = " & GetImageCount(hImageList)
    End Sub
    
    Private Sub Form_Load()
        Set Toolbar1.ImageList = ImageList1
        Toolbar1.Buttons.Add , , "Button 1"
        Toolbar1.Buttons.Add , , "Button 2"
        Toolbar1.Buttons(1).Image = 1
        Toolbar1.Buttons(2).Image = 2
    End Sub
    
  6. Ejecutar la aplicación y, a continuación, haga clic en Command1 . El cuadro de texto Número de imágenes contiene 0 . Después de aplicar la revisión, el recuento de imagen devuelve correctamente como 2 .

Propiedades

Id. de artículo: 811415 - Última revisión: lunes, 24 de febrero de 2014 - Versión: 2.3
La información de este artículo se refiere a:
  • Microsoft Visual Basic 6.0 Edición empresarial
  • Microsoft Visual Basic 6.0 Edición de aprendizaje
  • the operating system: Microsoft Windows XP
Palabras clave: 
kbnosurvey kbarchive kbmt kbvbp600fix kbfix kbqfe KB811415 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): 811415

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