2010-04-15 11 views
18

Soy nuevo en la API de Win32 y los muchos tipos nuevos comienzan a confundirme.¿Por qué Win32-API tiene tantos tipos personalizados?

Algunas funciones toman 1-2 ints y 3 UINTS como argumentos.

  • ¿Por qué no pueden simplemente usar ints? ¿Qué son UINTS?

Luego, están los otros tipos:

DWORD LPCWSTR LPBOOL 
  • Una vez más, creo que los tipos primitivos "C" serían suficientes - ¿por qué introducir 100 nuevos tipos?

Éste era un dolor: WCHAR*

que tenía que recorrer a través de él y push_back todos los personajes a un std :: string ya que no había otra manera de convertirlo en uno. Horrible.

  • ¿Por qué WCHAR? ¿Por qué reinventar la rueda? Pudieron haber usado char* en su lugar, o?
+7

No solo es C, sino que también tiene restos del gran cambio de Win16 (es decir, 16 bits) a Win32. Algunos de los tipos (en realidad # define's) también expresan aspectos de la infame notación húngara que también prevalecía en ese momento. Además, al ocultar los tipos reales detrás de los # define's, MS pudo soportar diferentes proveedores de compiladores de C; créanlo o no, había muchos proveedores diferentes de compiladores de C en aquel entonces. Olvidó nombres como Lattice C, Watcom C y muchos otros. Ahh .... los recuerdos. – kmontgom

+0

UNIT es "unsigned int". –

+3

WCHAR es un carácter * ancho *, UTF-16LE. Eso toma 2 bytes por personaje. Con eso en mente, probablemente puedas adivinar qué pasaría si intentaras usarlo como una matriz de caracteres común. –

Respuesta

34

La API de Windows fue creado por primera vez en la década de 1980, y ha tenido que soportar varias arquitecturas de CPU y compiladores diferentes a lo largo de los años. Pasaron de los sistemas independientes de un solo usuario de un solo usuario a los sistemas multinúcleo de seguridad multinúcleo en red. Tuvieron que solucionar problemas con los procesadores de 16 bits frente a los de 32 bits, y ahora con los procesadores de 64 bits. Tuvieron que solucionar problemas con los compiladores anteriores a ANSI C. Tenían que soportar compiladores de C++ en los primeros tiempos no estandarizados. Tuvieron que lidiar con la memoria segmentada. Debían apoyar la internacionalización antes de que existiera Unicode. Tenían que admitir compatibilidad de nivel de fuente con MS-DOS, con OS/2 y con Mac OS. Han tenido que ejecutar varias generaciones de chips Intel, y PowerPC, y MIPS, y Alpha, y ARM. La misma API básica se utiliza para sistemas de escritorio, servidor, dispositivos móviles y sistemas integrados.

En la década de 1980, C se consideraba un lenguaje de alto nivel (sí, realmente!) y muchas personas consideraron que era bueno usar tipos abstractos en lugar de simplemente especificar todo como un primitivo int, char o void *. Cuando no teníamos IntelliSense, infotips, navegadores de códigos, documentación en línea y similares, tales sugerencias de uso eran útiles, y facilitaban el código de puertos entre diferentes compiladores y diferentes lenguajes de programación.

Sí, es un lío horrible, pero eso no significa que hayan hecho algo mal.

+9

Uno de los artefactos más obvios del patrimonio API de Windows es el prefijo '' LP' 'utilizado en muchos tipos de punteros, ese prefijo significa' puntero largo '(también conocido como' puntero lejano ') y fue necesaria para muchos parámetros debido a la arquitectura segmentada subyacente de Win16, donde un puntero podría estar 'cerca' (apuntando dentro de un segmento supuesto) o 'lejos' (donde el segmento fue especificado como parte del puntero). Los punteros cercanos y lejanos han desaparecido con Win32, pero los nombres siguen siendo los mismos. –

+1

Es un poco gracioso. Los encabezados de la plataforma de Windows aún tienen definiciones para los indicadores de FAR. Es extraño que todavía no hayan limpiado el desorden, después de 20 o más años. La API C Win32 se siente olvidada. –

+7

@Mads: ¿Olvidado? Apenas. Mantener las definiciones antiguas permite que las aplicaciones antiguas se actualicen sin tener que reescribirlas. –

2

Un colega mío decía: "No hay problema que no se pueda resolver (¿ofuscado?) Por un nivel de indirección". En WIN32 lidiarás con WCHAR, UINT, etc. y te acostumbrarás. No tendrá que preocuparse cuando despliegue esa DLL, que tipo básico compila WCHAR o UNIT, "simplemente funcionará".

Es mejor leer toda la documentación para acostumbrarse a ella. Especialmente en el soporte ancho de char (WCHAR, etc.). Hay un buen definition on MSDN for WCHAR.

+2

"No hay problemas de complejidad en la programación que no se pueden aliviar agregando una capa de indirección. Y no hay ningún problema de rendimiento en la programación que no se puede aliviar mediante la eliminación de una capa de indirección". - Donald Knuth –

1

UINT es un entero sin signo. Si el valor de un parámetro no será/no puede ser negativo, tiene sentido especificar unsigned. LPCWSTR es un puntero a una matriz de caracteres amplia, mientras que WCHAR * no es const.

Probablemente deberías compilar tu aplicación para UNICODE cuando trabajas con caracteres anchos, o usar una rutina de conversión para convertir de angosta a ancha.
http://msdn.microsoft.com/en-us/library/dd319072%28VS.85%29.aspx

http://msdn.microsoft.com/en-us/library/dd374083%28v=VS.85%29.aspx

5

Win32 en realidad tiene muy pocos tipos primitivos. Lo que estás viendo son décadas de # definiciones definidas y typedefs y notación húngara. Debido a que había muy pocos tipos y pocos o ningún desarrollador de intellisense se dieron a sí mismos "pistas" sobre qué se suponía que debía hacer un tipo particular.

Por ejemplo, no hay un tipo booleano, pero hay una representación "con alias" de un entero que indica que se supone que una variable en particular debe tratarse como un booleano. Eche un vistazo a los contenidos de WinDef.h para ver a qué me refiero.

Puede consultar aquí: http://msdn.microsoft.com/en-us/library/aa383751(VS.85).aspx para echar un vistazo a la verdadera punta del iceberg. Por ejemplo, observe cómo HANDLE es el typedef base para cada otro objeto que es un "handle" para un objeto de Windows. Por supuesto, HANDLE se define en otro lugar como un tipo primitivo.

Cuestiones relacionadas