Pregunta

Tengo un cuadro de lista propietario dibujado en una aplicación externa ( America Online ) que necesito para obtener los datos de un componente para la construcción de ayudar a las personas con su facilidad de uso. (La utilidad va a hacer el acceso de ciertas cosas más simples, etc).

Aviso

Mi conocimiento de C ++ es muy pobres . Soy un programador de C #.

Tengo el hWnd al cuadro de lista en cuestión, pero parece ser dibujado propietario. El uso de declaraciones de LB_GETTEXT datos erróneos, apenas consigo basura (se hace en mi depurador como un montón de caracteres chinos) y pasando por los retornos LB_GETITEMDATA lo mismo.

Creo que esto es debido a que el cuadro de lista dibujado propietario tiene gráficos en él. Haciendo mucho de la excavación, he descubierto que otros en el pasado con este problema. He descubierto el siguiente código que se supone para remediar este problema. Sin embargo no es así. El código se publica a continuación, y los problemas debajo de ella.

void GetListItemData( HWND hListWnd, long index, char *outputResult )
{
    int result;
    DWORD processID;
    HANDLE hProcess;
    char *itemData;
    char sDataRead[5];
    DWORD bytes;
    DWORD lListItemHold, lListItemDataHold;
    *outputResult=0;

    if( hListWnd )
    {
        GetWindowThreadProcessId( hListWnd, &processID );

        hProcess=OpenProcess( 0x10|0xf0000|PROCESS_VM_READ, 0, processID );

        if( hProcess )
        {
            lListItemHold=(DWORD)SendMessage( hListWnd, LB_GETITEMDATA, index-1, 0 );
            lListItemHold=lListItemHold+24;

            result=ReadProcessMemory( hProcess, (void *)lListItemHold, &sDataRead, 4, &bytes );
            if( !result )
            {
                RaiseWinErr();
            }

            memcpy( &lListItemDataHold, &sDataRead, 4 );
            lListItemDataHold=lListItemDataHold+6;

            ReadProcessMemory( hProcess, (void *)lListItemDataHold, outputResult, 16, &bytes );

            CloseHandle( hProcess );
        }
    }
}

A mi entender, limitado como es, es que lListItemHold=lListItemHold+24 intenta dar cuenta de la 'estructura' lo que está en el cuadro de lista y pasar a través de los primeros 24 bytes de la misma, y ??devolver lo que queda. Sin embargo, esto no parece estar funcionando para mí.

¿Alguien puede arrojar algo de luz sobre cosas que podría intentar? Sé que estoy agarrando a un clavo ardiendo como es. Estoy codificar esta en C #, por lo que esta función se utiliza usando p/invoke tal como sigue;

    [DllImport("GetListItemData.dll", CallingConvention = CallingConvention.Cdecl)]
    internal static extern void RetrieveListItem(
        System.IntPtr hWnd,
        System.Int32 index,
        [MarshalAs(UnmanagedType.LPArray)]byte[] buffer
    );

    [DllImport("GetListItemData.dll", CallingConvention = CallingConvention.Cdecl)]
    internal static extern void RetrieveListItem(
        System.IntPtr hWnd,
        System.Int32 index,
        [MarshalAs(UnmanagedType.LPTStr)]System.Text.StringBuilder buffer
    );
¿Fue útil?

Solución

Tengo dos entradas de blog sobre el tema

http: //taylorza.blogspot. com / 2009/08 / archivo-piratería-my-way-través-process.html http://taylorza.blogspot.com/2010/06/crossing-process-boundary-with-net.html

Sin embargo, estos son para un control ListView, pero es posible que desee echar un vistazo al código. El segundo poste está utilizando P / Invoke Para lograr esto en .NET.

1- ¿Por qué estás agregando 24 a lListItemHold?

2- ¿Seguro lListItemhold es un puntero a una cadena, que podría ser algún tipo de estructura interna de la aplicación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top