• Domingo 22 de Diciembre de 2024, 12:58

Autor Tema:  Pequeñas Dudas En Programa Basico  (Leído 1739 veces)

krnl64

  • Miembro activo
  • **
  • Mensajes: 72
    • Ver Perfil
Pequeñas Dudas En Programa Basico
« en: Domingo 25 de Noviembre de 2007, 22:20 »
0
Hola a todos.

Estoy empezando en esto del masm32 y codeando un simple programa que te escribe una palabra en la consola y espera a que pulses una tecla para terminar,me han surgido algunas dudas que no consigo resolver.

Les pongo mi code y les cuento:

Código: Text
  1.  
  2.  
  3. .386                                            
  4. .model flat, stdcall
  5. option casemap:none
  6.  
  7. include kernel32.inc
  8. include windows.inc
  9.  
  10.  
  11. includelib kernel32.lib
  12.  
  13. .data
  14.  
  15. ;variables necesarias
  16.  
  17. msg  db 'hola',0
  18. buff db ?
  19.  
  20. hout dd ?
  21. hin  dd ?; handles de e/s
  22.  
  23. tit db 'Consola Demo',0
  24.  
  25.  
  26. .code
  27.  
  28. start:
  29.  
  30.   call con
  31.   call pinta
  32.  
  33.   push hin
  34.   call CloseHandle
  35.          &#59; Cierro los handles abiertos
  36.   push hout
  37.   call CloseHandle
  38.  
  39.   call FreeConsole  &#59; Cierro la consola
  40.  
  41.  
  42.  
  43. ; Salgo de forma controlada
  44. push NULL
  45. call ExitProcess
  46.  
  47.  
  48. con proc      
  49. ;call AllocConsole
  50. ; solicito poder crear una consola
  51. ; Esto sobra porque el programa es de consola
  52.  
  53. push STD_OUTPUT_HANDLE
  54. call GetStdHandle; obtendre el handle de la consola
  55. mov  hout,eax   &#59; copio a hout el handle obtenido
  56.  
  57. push STD_INPUT_HANDLE
  58. call GetStdHandle
  59. mov hin,eax  &#59; handle de entrada
  60.  
  61.  
  62. lea eax,tit
  63. push eax
  64. call SetConsoleTitle
  65. ;titulo de la consola
  66.  
  67. ret  
  68. con endp
  69.  
  70.  
  71. pinta proc
  72.  
  73. push NULL; nulo
  74. lea eax,buff; buffer de escritura
  75. push eax; meto el buffer en la pila
  76. push 4;longitud del mensaje
  77. lea eax,msg
  78. push eax; meto la cadena en la pila
  79. push hout;meto en la pila el handle
  80. call WriteConsole
  81. ;llamo a la funcion
  82.  
  83.  
  84. push NULL
  85. push NULL
  86. push NULL; los parametros son nulos porque no voy a
  87. push NULL; almacenar el dato leido, excepto el handle que
  88. push hin  &#59; es necesario
  89. call ReadConsole
  90.  
  91. ret
  92.  
  93. pinta endp
  94.  
  95. end start
  96.  
  97.  
  98.  



Empiezo a ejecutar y obtengo los handles de E/S de la consola.

Me escribe la palabra hola (esto menos mal que lo hace bien) y espera a que pulse enter, pero en este procedimiento el handle de salida desaparece y en LastError pone ERROR_INVALID_ACCESS.

Cuando regresa a la rutina principal al cerrar los handles, me cierra el handle de entrada pero el de salida no, porque no existe.

FreeConsole y ExitProcess funcionan bien.

Pueden decirme el por qué de estos fallos ? porque estoy buscando info y no consigo averiguarlos.

Creo que el handle de salida de la consola desaparece "solo" porque cumple su funcion y no se va a usar más, pero no estoy muy seguro.

Espero que me puedan aclarar esas dudillas.

Gracias

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Pequeñas Dudas En Programa Basico
« Respuesta #1 en: Domingo 25 de Noviembre de 2007, 23:05 »
0
Para lo primero ya lo resolviste en tu edicion, tampoco hace falta el FreeConsole por cierto.

En la documentacoin de ReadConsole no dice que lpBuffer (el segundo parametro) o lpNumberOfCharsRead (el cuarto parametro) sean opcionales ... es logico que de una excepcion de acceso invalido de memoria si esta escribiendo en 0.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

krnl64

  • Miembro activo
  • **
  • Mensajes: 72
    • Ver Perfil
Re: Pequeñas Dudas En Programa Basico
« Respuesta #2 en: Lunes 26 de Noviembre de 2007, 00:21 »
0
No le puse NULL porque fuese opcional sino porque pensaba que no necesitaría ni buffer ni variable ninguna porque no quería guardar la entrada de datos.

Le puse ambos parametros y funciona.

Lo que no termino de entender es de que el handle de salida de datos desaparece (De hay el fallo al hacer CloseHandle hout).

En la msdn no dice que se cierre solo.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Pequeñas Dudas En Programa Basico
« Respuesta #3 en: Lunes 26 de Noviembre de 2007, 08:08 »
0
Cita de: "krnl64"
No le puse NULL porque fuese opcional sino porque pensaba que no necesitaría ni buffer ni variable ninguna porque no quería guardar la entrada de datos.

Le puse ambos parametros y funciona.

Lo que no termino de entender es de que el handle de salida de datos desaparece (De hay el fallo al hacer CloseHandle hout).

En la msdn no dice que se cierre solo.
Bueno, a menos que diga que un parametro es opcional si este es un puntero tenes que pasar uno valido.

En cuanto al CloseHandle, es la misma logica que con el FreeConsole. ¿Vos abriste ese HANDLE? Entonces tampoco lo cerras.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

krnl64

  • Miembro activo
  • **
  • Mensajes: 72
    • Ver Perfil
Re: Pequeñas Dudas En Programa Basico
« Respuesta #4 en: Lunes 26 de Noviembre de 2007, 15:27 »
0
Es verdad !! Yo solo recupero el handle pero no lo abro.
Normal que no tenga que cerrarlo.

Gracias por las respuestas  !!

Saludos