Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: .:UND3R:. en 12 Mayo 2013, 18:15 pm



Título: [Solucionado]Insertar columna en listview (dialogboxparam)
Publicado por: .:UND3R:. en 12 Mayo 2013, 18:15 pm
Hola a todos, actualmente estoy aprendiendo sobre listview y me surge la siguiente duda con el parámetro hWnd de la API SendMessage:

Tengo el siguiente código:

Código
  1. TITLE  listview
  2.  
  3. .386
  4. option casemap:none
  5. .model flat,stdcall
  6. include c:\masm32\include\windows.inc
  7. include c:\masm32\include\kernel32.inc
  8. include c:\masm32\include\user32.inc
  9. include c:\masm32\include\comctl32.inc
  10.  
  11. includelib c:\masm32\lib\kernel32.lib
  12. includelib c:\masm32\lib\user32.lib
  13. includelib c:\masm32\lib\comctl32.lib
  14.  
  15. DlgProc PROTO,
  16. hWnd:HWND,
  17. uMsg:UINT,
  18. wParam:WPARAM,
  19. lParam:LPARAM
  20.  
  21. .const
  22.  
  23. .data
  24. DlgName byte "Hola",0
  25. Heading1 byte "Test1",0
  26. Heading2 byte "Test2",0
  27.  
  28. .data?
  29. hInstance HINSTANCE ?
  30. CommandLine LPSTR ?
  31.  
  32. .code
  33. InsertColumn proc,
  34. hWnd:HWND
  35. LOCAL lvc:LV_COLUMN
  36. mov lvc.imask,LVCF_TEXT+LVCF_WIDTH
  37. mov lvc.pszText,offset Heading1
  38. mov lvc.lx,150
  39. invoke SendMessage,hWnd, LVM_INSERTCOLUMN,0,addr lvc
  40. or lvc.imask,LVCF_FMT
  41. mov lvc.fmt,LVCFMT_RIGHT
  42. mov lvc.pszText,offset Heading2
  43. mov lvc.lx,100
  44. invoke SendMessage,hWnd, LVM_INSERTCOLUMN, 1 ,addr lvc
  45. ret
  46. InsertColumn endp
  47.  
  48. start:
  49. invoke GetModuleHandle,NULL
  50. mov hInstance,eax
  51. invoke GetCommandLine
  52. mov CommandLine,eax
  53. invoke DialogBoxParam,hInstance,ADDR DlgName,NULL,ADDR DlgProc,NULL
  54. invoke ExitProcess,eax
  55. DlgProc PROC hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
  56. .IF uMsg == WM_INITDIALOG
  57. invoke InitCommonControls
  58. invoke InsertColumn,hWnd
  59. ; invoke GetDlgItem,hWnd,IDC_FOCUS
  60. ; invoke SetFocus,eax
  61. .ELSEIF uMsg == WM_CLOSE
  62. invoke EndDialog,hWnd,NULL
  63. .ELSE
  64. mov eax,FALSE
  65. ret
  66. .ENDIF
  67. mov eax,TRUE
  68. ret
  69. DlgProc ENDP
  70. END start

El problema que tengo es que la siguiente línea no funciona correctamente:

Código
  1. invoke SendMessage,hWnd, LVM_INSERTCOLUMN,0,addr lvc

¿alguien podría guiarme para insertar las columnas?, saludos y gracias de ante mano

Solución: obtener con GetDlgItem el manejador:

Código
  1. TITLE  listview
  2.  
  3. .386
  4. option casemap:none
  5. .model flat,stdcall
  6. include c:\masm32\include\windows.inc
  7. include c:\masm32\include\kernel32.inc
  8. include c:\masm32\include\user32.inc
  9. include c:\masm32\include\comctl32.inc
  10.  
  11. includelib c:\masm32\lib\kernel32.lib
  12. includelib c:\masm32\lib\user32.lib
  13. includelib c:\masm32\lib\comctl32.lib
  14.  
  15. DlgProc PROTO,
  16. hWnd:HWND,
  17. uMsg:UINT,
  18. wParam:WPARAM,
  19. lParam:LPARAM
  20.  
  21. .const
  22. IDC_LSV1 equ 1001
  23.  
  24. .data
  25. DlgName byte "Hola",0
  26. Heading1 byte "Test1",0
  27. Heading2 byte "Test2",0
  28.  
  29. .data?
  30. hInstance HINSTANCE ?
  31. CommandLine LPSTR ?
  32.  
  33. .code
  34. InsertColumn proc,
  35. hWnd:HWND
  36. LOCAL lvc:LV_COLUMN
  37. mov lvc.imask,LVCF_TEXT+LVCF_WIDTH
  38. mov lvc.pszText,offset Heading1
  39. mov lvc.lx,150
  40. invoke SendMessage,hWnd, LVM_INSERTCOLUMN,0,addr lvc
  41. or lvc.imask,LVCF_FMT
  42. mov lvc.fmt,LVCFMT_RIGHT
  43. mov lvc.pszText,offset Heading2
  44. mov lvc.lx,100
  45. invoke SendMessage,hWnd, LVM_INSERTCOLUMN, 1 ,addr lvc
  46. ret
  47. InsertColumn endp
  48.  
  49. start:
  50. invoke GetModuleHandle,NULL
  51. mov hInstance,eax
  52. invoke GetCommandLine
  53. mov CommandLine,eax
  54. invoke DialogBoxParam,hInstance,ADDR DlgName,NULL,ADDR DlgProc,NULL
  55. invoke ExitProcess,eax
  56. DlgProc PROC hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
  57. .IF uMsg == WM_INITDIALOG
  58. invoke InitCommonControls
  59. invoke GetDlgItem,hWnd,IDC_LSV1
  60. invoke InsertColumn,eax
  61. ; invoke GetDlgItem,hWnd,IDC_FOCUS
  62. ; invoke SetFocus,eax
  63. .ELSEIF uMsg == WM_CLOSE
  64. invoke EndDialog,hWnd,NULL
  65. .ELSE
  66. mov eax,FALSE
  67. ret
  68. .ENDIF
  69. mov eax,TRUE
  70. ret
  71. DlgProc ENDP
  72. END start