SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: AnioN en Lunes 2 de Abril de 2007, 15:57

Título: Handles
Publicado por: AnioN en Lunes 2 de Abril de 2007, 15:57
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.
Título: Re: Handles
Publicado por: Eternal Idol en Lunes 2 de Abril de 2007, 16:25
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.
Título: Re: Handles
Publicado por: AnioN en Martes 3 de Abril de 2007, 00:59
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?
Título: Re: Handles
Publicado por: Castord en Martes 3 de Abril de 2007, 02:49
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.
Título: Re: Handles
Publicado por: Eternal Idol en Martes 3 de Abril de 2007, 08:11
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).
Título: Re: Handles
Publicado por: Eternal Idol en Martes 3 de Abril de 2007, 08:12
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.
Título: Re: Handles
Publicado por: Geo en Martes 3 de Abril de 2007, 19:17
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).
Título: Re: Handles
Publicado por: AnioN en Miércoles 4 de Abril de 2007, 12:19
es lo mismo:

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

que

Código: Text
  1. typedef void *PVOID
  2.  
Título: Re: Handles
Publicado por: Geo en Miércoles 4 de Abril de 2007, 17:56
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 ;).
Título: Re: Handles
Publicado por: AnioN en Miércoles 4 de Abril de 2007, 20:13
yo igual, me parece la segunda forma mas "clara". Muchas Gracias.