• Jueves 14 de Noviembre de 2024, 23:36

Autor Tema:  Handles  (Leído 1650 veces)

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Handles
« en: Lunes 2 de Abril de 2007, 15:57 »
0
Hola, algunas cosas no me quedan claras con respecto a que son los handles. Encontre esta definicion simple que fue lo que mas me aclaro las cosas.

Citar
manejadores ( handles ). Esto es un valor entero único definido por el entorno operativo y utilizado para referirse a objetos tales como formularios, controles, etc. Un handle es un número de identificación. HWnd es un handle para referirse a una ventana, hDC es un handle para referirse al contexto de dispositivo de un objeto ( Device Context ).

Por lo que entiendo es un numero entero que lo "entrega" el SO para referirse a algo en particular, no?. Bueno, pero mi duda radica en que por ej tuve que usar un par de funciones para manejar directorios y una de ellas devolvia un handle.

Código: Text
  1.  HANDLE hFind;
  2.  
  3.  hFind = FindFirstFile("c:\\*", &FindFileData);
  4.  

Lo que no entiendo es el por que de tantos manejadores en la API?, o sea, ahi a que hace referencia ese handle, a algun objeto en particular?. Luego ese mismo manejador se lo tengo que pasar a la funcion FindNextFile.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Handles
« Respuesta #1 en: Lunes 2 de Abril de 2007, 16:25 »
0
De Windows internals:

handle
An object identifier. A process receives a handle to an object when it creates or opens an object by name. Referring to an object by its handle is faster than using its name because the object manager can skip the name lookup and find the object directly.

Los directorios y archivos que enumeras son representados por objetos a nivel de Kernel, estos objetos no pueden ser accedidos directamente desde modo Usuario y son compartidos por todos los procesos no asi los HANDLES que son privados y el mismo HANDLE en un proceso puede ni siquiera ser valido en otro.

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.

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Handles
« Respuesta #2 en: Martes 3 de Abril de 2007, 00:59 »
0
estuve revisando la documentacion y encontre esto que no entiendo.
Citar
Handle to an object.
This type is declared in WinNT.h as follows:


typedef PVOID HANDLE;

y busque que es un PVOID.

Citar
Pointer to any type.
This type is declared in WinNT.h as follows:


typedef void *PVOID;
no entiendo el *PVOID. Que hace ese operador de indireccion? si no hay definido un PVOID de esta forma.

Citar
typedef void PVOID;
Yo me refiero a que si quiero usar un tipo de dato PVOID es posible pero no esta definido, o si?

Castord

  • Nuevo Miembro
  • *
  • Mensajes: 20
    • Ver Perfil
Re: Handles
« Respuesta #3 en: Martes 3 de Abril de 2007, 02:49 »
0
un handle es un puntero a un objeto... un manejador...
por ejemplo... las 'constantes de tipo' handle mas comunes son el hWnd, hINSTANCE donde la 'H' es el prefijo de notacion hungara usada por los programadores de microsoft para definir sus variables, constantes y demas... ej. pVAR (VARIALBE puntero), szvar (variable tipo cadena terminada en cero (sz)) nVar (variable tipo entera) y bla, bla... szp, n, s, h, lp, p etc.

HWnd en un handle a una ventana abierta que controla el gestor de ventanas para trabajo multitarea...

hInstance...  es un handle a la instancia de la ventana abierta..

existe un millar .. pero esos son los mas tipicos

HWND, HINSTANCE, HANDLE, HICON.. Etc.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Handles
« Respuesta #4 en: Martes 3 de Abril de 2007, 08:11 »
0
Cita de: "AnioN"
Yo me refiero a que si quiero usar un tipo de dato PVOID es posible pero no esta definido, o si?
Es un tipo de dato definido por Microsoft, asi como el DWORD y tantos otros. Para usarlo tenes que incluir las librerias correspondientes (Windows.h en este caso).

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.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Handles
« Respuesta #5 en: Martes 3 de Abril de 2007, 08:12 »
0
Cita de: "Castord"
un handle es un puntero a un objeto... un manejador...
por ejemplo...
En realidad no es puntero sino un valor entero que hace referencia a una entrada en uan tabla de HANDLES. Los objetos del sistema no son accesibles directamente desde modo Usuario.

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.

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Handles
« Respuesta #6 en: Martes 3 de Abril de 2007, 19:17 »
0
Un handle es un número de identificación.

PVOID es un puntero a void, relee la instrucción typedef donde se encuentra:
Código: Text
  1.  
  2. typedef void* PVOID
  3.  
  4.  
Le estás dando "otro nombre" a un tipo void*, es una práctica común en la API de Windows "definir tipos de datos" (usando typedef) para los punteros :P.

Saludos,
JJ (Geo).
La imaginación es el límite.
Hardware & Software | Mexchip

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Handles
« Respuesta #7 en: Miércoles 4 de Abril de 2007, 12:19 »
0
es lo mismo:

Código: Text
  1. typedef void* PVOID
  2.  

que

Código: Text
  1. typedef void *PVOID
  2.  

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Handles
« Respuesta #8 en: Miércoles 4 de Abril de 2007, 17:56 »
0
Si, es lo mismo. El colocar el * cerca del identificador o del tipo es "a gusto del cliente" ;).

En C normalmente se escribe junto al identificador (de allí que así esté escrito en las definiciones de la API de Windows):
Código: Text
  1.  
  2. typedef void *PVOID;
  3. int *pInt;
  4.  
  5.  

En C++ gralmente. se escribe junto al tipo:
Código: Text
  1.  
  2. typedef void* PVOID;
  3. int* pInt;
  4.  
  5.  

Repito, es a gusto/preferencia/lineamiento de quien escribe el código. Personalmente, prefiero la segunda forma ;).
La imaginación es el límite.
Hardware & Software | Mexchip

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Handles
« Respuesta #9 en: Miércoles 4 de Abril de 2007, 20:13 »
0
yo igual, me parece la segunda forma mas "clara". Muchas Gracias.