elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  Consulta sobre como crear un ListView32 (solucionado)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Consulta sobre como crear un ListView32 (solucionado)  (Leído 4,206 veces)
el_c0c0


Desconectado Desconectado

Mensajes: 307


Ver Perfil
Consulta sobre como crear un ListView32 (solucionado)
« en: 15 Marzo 2010, 01:02 »

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  ::)


« Última modificación: 19 Marzo 2010, 19:00 por el_c0c0 » En línea

'-     coco
"Te voy a romper el orto"- Las hemorroides
MCKSys Argentina


Desconectado Desconectado

Mensajes: 2.191


Diviérte crackeando, que para eso estamos!


Ver Perfil
Re: Consulta sobre como crear un ListView32
« Respuesta #1 en: 15 Marzo 2010, 02:40 »

Hola!

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

Quizás te ayude :)

Saludos!


En línea

---------------------
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."
el_c0c0


Desconectado Desconectado

Mensajes: 307


Ver Perfil
Re: Consulta sobre como crear un ListView32
« Respuesta #2 en: 15 Marzo 2010, 02:57 »

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
En línea

'-     coco
"Te voy a romper el orto"- Las hemorroides
MCKSys Argentina


Desconectado Desconectado

Mensajes: 2.191


Diviérte crackeando, que para eso estamos!


Ver Perfil
Re: Consulta sobre como crear un ListView32
« Respuesta #3 en: 15 Marzo 2010, 03:14 »

Tuyo
Código:
inc lvi.iSubItem

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

¿ No será por eso ? (Mucho de ASM no manejo :))
En línea

---------------------
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."
el_c0c0


Desconectado Desconectado

Mensajes: 307


Ver Perfil
Re: Consulta sobre como crear un ListView32
« Respuesta #4 en: 15 Marzo 2010, 03:21 »

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
En línea

'-     coco
"Te voy a romper el orto"- Las hemorroides
Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 4.823


Clarin miente, TN opera y los giles regurgitan.


Ver Perfil WWW
Re: Consulta sobre como crear un ListView32
« Respuesta #5 en: 15 Marzo 2010, 12:06 »

¿Ambos mensajes devuelven -1? Teniendo el codigo lo mejor que podes hacer es depurar el programa con el WinDbg.
En línea



La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
el_c0c0


Desconectado Desconectado

Mensajes: 307


Ver Perfil
Re: Consulta sobre como crear un ListView32
« Respuesta #6 en: 15 Marzo 2010, 16:47 »

¿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:


saludos
« Última modificación: 15 Marzo 2010, 17:04 por el_c0c0 » En línea

'-     coco
"Te voy a romper el orto"- Las hemorroides
Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 4.823


Clarin miente, TN opera y los giles regurgitan.


Ver Perfil WWW
Re: Consulta sobre como crear un ListView32
« Respuesta #7 en: 15 Marzo 2010, 18:16 »

Es dificil saber sin el codigo pero en teoria esos mensajes funcionaron bien ...
En línea



La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
el_c0c0


Desconectado Desconectado

Mensajes: 307


Ver Perfil
Re: Consulta sobre como crear un ListView32
« Respuesta #8 en: 15 Marzo 2010, 22:31 »

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 ;)
En línea

'-     coco
"Te voy a romper el orto"- Las hemorroides
Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 4.823


Clarin miente, TN opera y los giles regurgitan.


Ver Perfil WWW
Re: Consulta sobre como crear un ListView32
« Respuesta #9 en: 15 Marzo 2010, 22:53 »

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  ::)
« Última modificación: 16 Marzo 2010, 00:04 por Eternal Idol » En línea



La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
el_c0c0


Desconectado Desconectado

Mensajes: 307


Ver Perfil
Re: Consulta sobre como crear un ListView32
« Respuesta #10 en: 16 Marzo 2010, 04:14 »

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 !
En línea

'-     coco
"Te voy a romper el orto"- Las hemorroides
bizco


Desconectado Desconectado

Mensajes: 698


Ver Perfil
Re: Consulta sobre como crear un ListView32
« Respuesta #11 en: 16 Marzo 2010, 04:48 »




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.



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?
« Última modificación: 16 Marzo 2010, 05:26 por ctlon » En línea

Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 4.823


Clarin miente, TN opera y los giles regurgitan.


Ver Perfil WWW
Re: Consulta sobre como crear un ListView32
« Respuesta #12 en: 16 Marzo 2010, 07:56 »

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).
En línea



La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
el_c0c0


Desconectado Desconectado

Mensajes: 307


Ver Perfil
Re: Consulta sobre como crear un ListView32
« Respuesta #13 en: 18 Marzo 2010, 18:32 »

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
En línea

'-     coco
"Te voy a romper el orto"- Las hemorroides
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Powered by SMF 1.1.19 | SMF © 2006-2008, Simple Machines