Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: el_c0c0 en 15 Marzo 2010, 01:02 am



Título: Consulta sobre como crear un ListView32 (solucionado)
Publicado por: el_c0c0 en 15 Marzo 2010, 01:02 am
Hola que tal, bueno me decidi a meterme en el tema de ASM. Hasta el momento va todo bien, pero me surgio una duda. Quiero crear un control ListView32, lo creo, perfecto. Ahora quiero agregar una columna, para ello me estoy basando en el codigo fuente del ucListView en VB6 de Carles P.V. Bueno, el tema es que no consigo meter el item del header, o algo asi. Aca adjunto el pedazo de codigo:
Código
  1.  createlv:
  2.         invoke CreateWindowEx,0,_dlgLV,NULL,WS_CHILD + WS_TABSTOP + LVS_REPORT + WS_VISIBLE,5,5,240,155,[dlghwnd],0,[wc.hInstance],NULL
  3.        mov    [dlglvhwnd],eax
  4.        invoke ShowWindow,eax,SW_SHOW
  5.        invoke  SetWindowLong,[dlglvhwnd], GWL_WNDPROC, WindowProc2                
  6.  
  7.        ; poner el lv en modo list
  8.        invoke GetWindowLong,[dlglvhwnd],GWL_STYLE
  9.        mov    [tmp], eax
  10.        mov    [tmp], tmp+LVS_LIST-LVS_ICON-LVS_SMALLICON-LVS_REPORT
  11.        invoke SetWindowLong,[dlglvhwnd],GWL_STYLE,[tmp]
  12.  
  13.        ; agregar columna
  14.        invoke lstrlen,_cap1           ; len del caption
  15.        mov    [hdi.cchTextMax], eax   ; len
  16.        mov    [hdi.pszText], _cap1    ; caption
  17.        mov    [hdi.cxy], 100          ; width
  18.        mov    [hdi.fmt], HDF_STRING+HDF_CENTER ; formato
  19.        mov    [hdi.mask], HDI_TEXT+HDI_WIDTH+HDI_FORMAT  ; mask
  20.  
  21.        invoke SendMessage,[dlglvhwnd],LVM_INSERTCOLUMN,0,[lvc] ;
  22.        invoke SendMessage,[dlglvhwnd],4127,0,0                 ; buscar header dentro del lview
  23.        mov    [dlglvheader], eax                               ; guardo resultado
  24.        invoke SendMessage,eax,HDM_SETITEM,0,[hdi]              ; seteo el item en el header
y tengo declarado asi:
Código
  1.  _dlgLV TCHAR 'SysListView32',0
  2.  _cap1 TCHAR 'LV32',0
  3.  
  4.  dlglvheader dd ?
  5.  dlglvhwnd dd ?
  6.  
  7.  tmp dd ?
  8.  
  9.  lvc LV_COLUMN
  10.  hdi HD_ITEM
estoy usando FASM. wc.hInstance viene de WNDCLASSEX que uso para crear la ventana. WndProc2 es un procedimiento que llama al DefProcWnd. Ah y probe con y sin [] en hdi y lvc.

PD: si quito la parte de 'cambiar el estilo' se ve el recuadro blanco del LV. Pero, con el codigo ese, queda del color de fondo de la ventana.

alguna sugerencia?

desde ya muchas gracias  ::)


Título: Re: Consulta sobre como crear un ListView32
Publicado por: MCKSys Argentina en 15 Marzo 2010, 02:40 am
Hola!

Fíjate por aqui: http://win32assembly.online.fr/tut31.html

Quizás te ayude :)

Saludos!


Título: Re: Consulta sobre como crear un ListView32
Publicado por: el_c0c0 en 15 Marzo 2010, 02:57 am
Hola!

Fíjate por aqui: http://win32assembly.online.fr/tut31.html

Quizás te ayude :)

Saludos!
Che gracias por responder. Mientras tanto estvue indagando por mi cuenta. Lo que me pusiste vos
Código
  1.   LOCAL lvc:LV_COLUMN
  2.   mov lvc.imask,LVCF_TEXT+LVCF_WIDTH
  3.   mov lvc.pszText,offset Heading1
  4.   mov lvc.lx,150
  5.   invoke SendMessage,hList, LVM_INSERTCOLUMN,0,addr lvc
yo lo tengo asi:
Código
  1.        mov     [lvc.mask], LVCF_TEXT or LVCF_WIDTH
  2.        mov     [lvc.pszText], _cap1 ; aca tengo duda de que esto sea asi
  3.        mov     [lvc.cx], 50
  4.        invoke  SendMessage, [dlglvhwnd], LVM_INSERTCOLUMN, 0, [lvc]

y para el tema de agregar un item en ese codigo esta asi:
Código
  1.  mov lvi.imask,LVIF_TEXT
  2.  inc lvi.iSubItem
  3.  invoke wsprintf,addr buffer, addr template,[edi].nFileSizeLow
  4.  lea eax,buffer
  5.  mov lvi.pszText,eax
  6.  invoke SendMessage,hList, LVM_INSERTITEM,0, addr lvi
y yo por mi parte lo tengo como
Código
  1.        mov     [lvi.iItem], 0
  2.        mov     [lvi.iSubItem], 0
  3.        mov     [lvi.mask], LVIF_TEXT
  4.        mov     [lvi.pszText], _cap1
  5.        invoke  SendMessage,[dlglvhwnd], LVM_INSERTITEM,0,[lvi]

misteriosamente sigue sin funcionar. sorry que sea duro con esto, recien empiezo :D

saludos


Título: Re: Consulta sobre como crear un ListView32
Publicado por: MCKSys Argentina en 15 Marzo 2010, 03:14 am
Tuyo
Código:
inc lvi.iSubItem

Iczelion
Código:
mov     [lvi.iSubItem], 0

¿ No será por eso ? (Mucho de ASM no manejo :))


Título: Re: Consulta sobre como crear un ListView32
Publicado por: el_c0c0 en 15 Marzo 2010, 03:21 am
Tuyo
Código:
inc lvi.iSubItem

Iczelion
Código:
mov     [lvi.iSubItem], 0

¿ No será por eso ? (Mucho de ASM no manejo :))
Al revez, el que uso yo usa los []. Esto es porque le estoy pasando como puntero. (de todas formas sin [] no funciona :D). Estoy casi seguro que es un problema al pasar el string; aun sigo viendo que carajos pasa.

Gracias por contestar, ademas espero otras respuestas.

saludos


Título: Re: Consulta sobre como crear un ListView32
Publicado por: Eternal Idol en 15 Marzo 2010, 12:06 pm
¿Ambos mensajes devuelven -1? Teniendo el codigo lo mejor que podes hacer es depurar el programa con el WinDbg.


Título: Re: Consulta sobre como crear un ListView32
Publicado por: el_c0c0 en 15 Marzo 2010, 16:47 pm
¿Ambos mensajes devuelven -1? Teniendo el codigo lo mejor que podes hacer es depurar el programa con el WinDbg.

Recien lo probe con Olly, me devuelven 0. A su vez agregue un CMP para no tener que andar debugueando. cual sera el problema?

edit, dejo foto del Olly:
(http://img85.imageshack.us/img85/7398/1503100103.jpg) (http://img85.imageshack.us/i/1503100103.jpg/)

saludos


Título: Re: Consulta sobre como crear un ListView32
Publicado por: Eternal Idol en 15 Marzo 2010, 18:16 pm
Es dificil saber sin el codigo pero en teoria esos mensajes funcionaron bien ...


Título: Re: Consulta sobre como crear un ListView32
Publicado por: el_c0c0 en 15 Marzo 2010, 22:31 pm
Es dificil saber sin el codigo pero en teoria esos mensajes funcionaron bien ...

te dejo el codigo completo, espero que sea una pelotudez.
Código
  1. format PE GUI 4.0
  2. entry start
  3.  
  4. include 'win32w.inc'
  5.  
  6. section '.data' data readable writeable
  7.  
  8.  _class TCHAR 'CocusUI®',0
  9.  _title TCHAR 'Window de prueba',0
  10.  _error TCHAR 'Startup failed.',0
  11.  _dlgLV TCHAR 'SysListView32',0
  12.  _cap1 TCHAR 'LV32',0
  13.  
  14.  dlglvheader dd ?
  15.  dlglvhwnd dd ?
  16.  dlghwnd dd ?
  17.  dlghdc dd ?
  18.  tmp dd ?
  19.  
  20.  wc WNDCLASS 0,WindowProc,0,0,NULL,NULL,NULL,COLOR_BTNFACE+1,NULL,_class
  21.  
  22.  msg MSG
  23.  lvi LV_ITEM
  24.  lvc LV_COLUMN
  25.  hdi HD_ITEM
  26.  
  27. section '.text' code readable executable
  28.  
  29.  start:
  30.  
  31.        invoke  GetModuleHandle,0
  32.        mov     [wc.hInstance],eax
  33.        invoke  LoadIcon,0,IDI_APPLICATION
  34.        mov     [wc.hIcon],eax
  35.        invoke  LoadCursor,0,IDC_ARROW
  36.        mov     [wc.hCursor],eax
  37.        invoke  RegisterClass,wc
  38.        test    eax,eax
  39.        jz      error
  40.  
  41.        invoke  CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,128,128,256,192,NULL,NULL,[wc.hInstance],NULL
  42.        test    eax,eax
  43.        jz      error
  44.  
  45.        mov     [dlghwnd],eax
  46.        invoke  GetDC,eax
  47.        mov     [dlghdc],eax
  48.  
  49.        jmp     createlv
  50.  
  51.  
  52.  createlv:
  53.        invoke CreateWindowEx,0,_dlgLV,NULL,WS_CHILD + WS_TABSTOP + WS_VISIBLE + LVS_REPORT,5,5,240,155,[dlghwnd],0,[wc.hInstance],NULL
  54.        mov    [dlglvhwnd],eax
  55.        invoke SetWindowLong,[dlglvhwnd], GWL_WNDPROC, WindowProc2
  56.        invoke ShowWindow,[dlglvhwnd],SW_SHOW
  57.  
  58.        mov     [lvi.mask], LVIF_TEXT ;or LVIF_STATE
  59.        mov     [lvi.iItem], 0
  60.        mov     [lvi.iSubItem], 0
  61.        mov     [lvi.pszText], _cap1
  62.  
  63.        invoke  SendMessage,[dlglvhwnd], LVM_INSERTITEM,0,[lvi]
  64.  
  65.        cmp     eax,-1
  66.        ja      msg_loop
  67.        invoke  MessageBeep, MB_OK
  68.  
  69.  msg_loop:
  70.        invoke  GetMessage,msg,NULL,0,0
  71.        cmp     eax,1
  72.        jb      end_loop
  73.        jne     msg_loop
  74.        invoke  TranslateMessage,msg
  75.        invoke  DispatchMessage,msg
  76.        jmp     msg_loop
  77.  
  78.  error:
  79.        invoke  MessageBox,NULL,_error,NULL,MB_ICONERROR+MB_OK
  80.  
  81.  end_loop:
  82.        invoke  ExitProcess,[msg.wParam]
  83.  
  84. proc WindowProc2 uses ebx esi edi, hwnd,umsg,wparam,lparam
  85.     invoke  DefWindowProc,[hwnd],[umsg],[wparam],[lparam]
  86.  
  87.     cmp     [umsg], LVM_INSERTITEM
  88.     je      .beep
  89.     ret
  90.  
  91.     .beep:
  92.     invoke     MessageBeep, MB_OK
  93.     ret
  94. endp
  95.  
  96. proc WindowProc uses ebx esi edi, hwnd,wmsg,wparam,lparam
  97.        cmp     [wmsg],WM_DESTROY
  98.        je      .wmdestroy
  99.  
  100.  .defwndproc:
  101.        invoke  DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
  102.  
  103.        jmp     .finish
  104.  .wmdestroy:
  105.        invoke  DestroyWindow,[dlglvhwnd]
  106.        invoke  PostQuitMessage,0
  107.        xor     eax,eax
  108.  .finish:
  109.        ret
  110. endp
  111.  
  112.  
  113.  
  114. section '.idata' import data readable writeable
  115.  
  116.  library kernel32,'KERNEL32.DLL',\
  117.          user32,'USER32.DLL',\
  118.          shell32,'SHELL32.DLL'
  119.  
  120.  include 'api\kernel32.inc'
  121.  include 'api\user32.inc'
  122.  include 'api\shell32.inc'  
Saludos y gracias por las respuestas ;)


Título: Re: Consulta sobre como crear un ListView32
Publicado por: Eternal Idol en 15 Marzo 2010, 22:53 pm
Detesto FASM ... al menos tenes que llamar a InitCommonControls/InitCommonControlsEx (fue en lo primero que pense al leer el hilo pero la explicacion me confundio, no se creaba el control ...), CreateWindowEx en createlv devuelve 0.

Sigo viendo, esto tambien esta mal:
invoke  SendMessage,[dlglvhwnd], LVM_INSERTITEM,0,[lvi]
invoke  SendMessage,[dlglvhwnd], LVM_INSERTITEM,0, lvi

Lo mismo para la columna (lvc no [lvc]) y sacando WindowProc2 ya podes seguir  ::)


Título: Re: Consulta sobre como crear un ListView32
Publicado por: el_c0c0 en 16 Marzo 2010, 04:14 am
Detesto FASM ... al menos tenes que llamar a InitCommonControls/InitCommonControlsEx (fue en lo primero que pense al leer el hilo pero la explicacion me confundio, no se creaba el control ...), CreateWindowEx en createlv devuelve 0.

Sigo viendo, esto tambien esta mal:
invoke  SendMessage,[dlglvhwnd], LVM_INSERTITEM,0,[lvi]
invoke  SendMessage,[dlglvhwnd], LVM_INSERTITEM,0, lvi

Lo mismo para la columna (lvc no [lvc]) y sacando WindowProc2 ya podes seguir  ::)

Bien, agregue el initcommoncontrols y initcommoncontrolsex con el parametro ICC_LISTVIEW_CLASSES, pero no me va. Ah, tambien cambie de [lvi] a lvi. Tambien saque la linea de SetWindowLong,[dlglvhwnd], GWL_WNDPROC, WindowProc2,pero igual. Que rayos pasa?
Saludos !


Título: Re: Consulta sobre como crear un ListView32
Publicado por: bizco en 16 Marzo 2010, 04:48 am
(http://r.i.elhacker.net/cache?url=http://img691.imageshack.us/img691/7922/ventanita2.jpg)


Código:
start:
       [b] invoke   InitCommonControls [/b]
        invoke  GetModuleHandle,0
        mov     [wc.hInstance],eax
        invoke  LoadIcon,0,IDI_APPLICATION
        .......
        .......

No me va, no es una explicacion. mira justo en el call que devuelve la funcion. si actualizaste el codigo lo mejor es que lo pongas aqui y podemos ser mas concretos.

(http://r.i.elhacker.net/cache?url=http://img169.imageshack.us/img169/4883/ventanita.jpg)

No te voy a dar el codigo, pero fijate bien en tu codigo. ¿que va primero el huevo o la gallina?

En pocas palabras intentas meter un item cuando aun no existe la columna que lo contiene.

Columna1            Columna2           ColumnaX

Elemento1            sub                     sub

PD ya no se cuantas veces edite,  ese "problema" te viene pq usas  LVS_REPORT ¿quieres ese estilo para tu lv?


Título: Re: Consulta sobre como crear un ListView32
Publicado por: Eternal Idol en 16 Marzo 2010, 07:56 am
Bien, agregue el initcommoncontrols y initcommoncontrolsex con el parametro ICC_LISTVIEW_CLASSES, pero no me va. Ah, tambien cambie de [lvi] a lvi. Tambien saque la linea de SetWindowLong,[dlglvhwnd], GWL_WNDPROC, WindowProc2,pero igual. Que rayos pasa?
Saludos !

¿Y esta parte?: "Lo mismo para la columna (lvc no [lvc])", tenes que agregar la columna, usa elcodigo que tenias antes para eso pero con lvc (yo lo copie del primer mensaje del hilo).


Título: Re: Consulta sobre como crear un ListView32
Publicado por: el_c0c0 en 18 Marzo 2010, 18:32 pm
Bien, agregue el initcommoncontrols y initcommoncontrolsex con el parametro ICC_LISTVIEW_CLASSES, pero no me va. Ah, tambien cambie de [lvi] a lvi. Tambien saque la linea de SetWindowLong,[dlglvhwnd], GWL_WNDPROC, WindowProc2,pero igual. Que rayos pasa?
Saludos !

¿Y esta parte?: "Lo mismo para la columna (lvc no [lvc])", tenes que agregar la columna, usa elcodigo que tenias antes para eso pero con lvc (yo lo copie del primer mensaje del hilo).

Bien, no habia posteado resultados porque no estuve en casa. Si, quiero LVS_REPORT. Ya lo solucione, habia que usar Initcommoncontrols sin el Ex. Ahora lo que no entiendo es porque solo toma la letra L de la variable LV32, imagino que es por el tema de Wide o Ansi. No?

Muchisimas gracias gente :D


Título: Re: Consulta sobre como crear un ListView32
Publicado por: Eternal Idol en 18 Marzo 2010, 18:43 pm
De nadas  ::)

Seguramente; yo lo habia cambiado asi: include 'win32a.inc' probando otras cosas por eso me olvide y no lo mencione (a mi me sale LV32).


Título: Re: Consulta sobre como crear un ListView32
Publicado por: el_c0c0 en 18 Marzo 2010, 19:34 pm
De nadas  ::)

Seguramente; yo lo habia cambiado asi: include 'win32a.inc' probando otras cosas por eso me olvide y no lo mencione (a mi me sale LV32).

Claro yo habia usado eso mismo. Pero bueno, para sacarme la duda, como seria el asunto en Wide? yo tengo declarado _cap1 TCHAR 'LV32',0 sera otro tipo en vez de TCHAR? podria usar db para eso?. Saludos!


Título: Re: Consulta sobre como crear un ListView32
Publicado por: Eternal Idol en 18 Marzo 2010, 20:04 pm
TCHAR suena correcto pero es algo de FASM (en cuanto a ASM), mejor consulta su documentacion.


Título: Re: Consulta sobre como crear un ListView32
Publicado por: bizco en 19 Marzo 2010, 04:41 am
si, puedes usar db perfectamente. realmente tchar lo que haces es declarar como db (multibyte) o du para unicode que es el caso de la cabecera que estas usando.


Título: Re: Consulta sobre como crear un ListView32
Publicado por: Eternal Idol en 19 Marzo 2010, 07:48 am
Si usas db tenes que llamar a SendMessageA y usar la estructura LV_ITEMA (si incluis la cabecera correcta eso se hace automaticamente en teoria).