2010-11-08 22 views
7

¿Cómo reenvío declarar HANDLE? No quiero incluir todos windows.h en este encabezado en particular.¿Cómo reenvío declarar HANDLE? (Win32)

+0

¿No es suficiente '#define HANDLE int'? – ruslik

+1

@ruslik: HANDLE no es un 'int'. En particular, creo que tiene el mismo ancho que un puntero. –

+0

@Billy en realidad es un índice en algunas tablas en el espacio del kernel. Y de todos modos, no necesita realizar ninguna aritmética en él. – ruslik

Respuesta

4

El encabezado que realmente typedefs HANDLE es winnt.h. Desafortunadamente, esto es 15K líneas - aquí, por lo que corregir su problema mediante la inclusión de la delgada windef.h es un poco engañoso.

Aquí está la parte pertinente en mi sistema (obviamente los detalles podrían cambiar a partir de la revisión a revisión, pero no va a cambiar en el nivel de aplicación ya que esto rompería binarios existentes):

// 
// Handle to an Object 
// 

#ifdef STRICT 
typedef void *HANDLE; 
#if 0 && (_MSC_VER > 1000) 
#define DECLARE_HANDLE(name) struct name##__; typedef struct name##__ *name 
#else 
#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name 
#endif 
#else 
typedef PVOID HANDLE; 
#define DECLARE_HANDLE(name) typedef HANDLE name 
#endif 
typedef HANDLE *PHANDLE; 

PS tengo amor ese #if 0 en este archivo de encabezado de envío de Microsoft.

+1

Probablemente para solucionar un error del compilador. –

+1

@Billy - tan cínico ... ;-) –

2

Bueno, parece que respondí a este yo. Solo #include ed <windef.h> en lugar de <windows.h> por el momento. Todavía me gustaría poder reenviar declarar MANEJO solo si alguien tiene una manera de hacerlo.

+1

Lookup, sin embargo está definido en windef.h y copia la definición. Windows es un ABI permanente fijo. No es un estándar abierto o algo en lo que tenga que preocuparse por la portabilidad de diferentes implementaciones. –

+1

Hice lo mismo, pero recibo una plétora de errores de compilación de 'winnt.h'. ¿Alguna idea de por qué? – CinCout