Captulo 1
Delphi el API de Windows
Delphi ha trado una nueva era a la programacin en Windows. Nunca antes ha sido tan sencillo crear aplicaciones potentes y robustas para el entorno Windows en tan cortos plazos de tiempo. Ahora en su quinta versin, Delphi se conoce mundialmente como el entorno de desarrollo visual por excelencia para Windows. Ninguna otra herramienta de programacin puede siquiera acercarse a la potencia, facilidad de uso y calidad de los ejecutables de Delphi. Uno de los puntos fuertes de Delphi es la Librera de Componentes Visuales (Visual Component Library), el modelo de objetos de Borland. Este modelo de objetos ha permitido al equipo de desarrolladores de Delphi encapsular la casi totalidad del tedioso proceso de programacin para Windows en componentes de fcil utilizacin. Los anteriores lenguajes de programacin para Windows exigan al desarrollador escribir grandes cantidades de cdigo slo para exprimir de Windows un mnimo de funcionalidad. El simple acto de crear una ventana e interceptar acciones de men ocupaba pginas enteras de cdigo. La excelente encapsulacin por parte de Delphi de las tediosas exigencias de la programacin para Windows ha convertido lo que una vez fue una tarea montona en una experiencia divertida y excitante.
2 Captulo I
Descripcin
Puntero a cadena de caracteres. Puntero a cadena de caracteres. Nmero entero sin signo. Valor booleano. Puntero a valor booleano. Puntero a valor byte. Puntero a valor entero Puntero a nmero de punto flotante de precisin simple. Puntero a valor de 16 bits. Puntero a valor de 32 bits. Puntero a valor de 32 bits. Valor de 8 bits (puede representar un carcter). Puntero a valor de 8 bits. Nmero entero de 16 bits. Nmero entero de 32 bits (sin signo). Puntero a entero d e 32 bi ts. N mero entero d e 32 bi ts (si n si g no ). Pu n te ro a en tero de 32 bi ts. Puntero a val or de 32 bi ts. Puntero a val o r d e 32 bi ts. Puntero a val or de 16 bi ts. Puntero a nmero d e p unto fl o tante d e d o bl e p reci si n. Identi fi cador l ocal . Identi fi cador de l enguaj e.
Tipo Windows
THandle
Tipo O b j e c t Pascal
Integer
Descripcin
I d enti fi cad o r (man ej ad o r) d e o b j eto . Mu cha s fu nci o nes d el A PI d e Wi nd ow s reto rnan un val o r d e este ti p o, q ue i d enti fi ca a un o b j eto d e n tro d e l a s tab l a s i nt er n as d e o b j eto s d e W i nd o w s. Puntero a manejador. Pa r m et ro d e me ns aj e d e 3 2 b i ts. En ve rsi o ne s an te ri o res d e W i nd o w s er a un ti p o d e d a to s d e 1 6 b i ts. Pa r m et ro d e me ns aj e d e 3 2 b i ts. V al o r d e r e to r no d e fu n ci n d e 3 2 b i t s. M a ne j a d o r d e ve n t a n a. T o d o s l o s co n tr o l es, v e n ta n a s p ri nci p al es o hi j as, etc. ti enen su m anej ad o r d e ven ta na co r r es p o nd i e n t e, q u e l es i d e n ti fi c a d e n t ro d e l a s t a b l as i nt er n a s d e W i n d o w s. Man ej ad o r d e un "g a ncho " (ho o k ) d e si stem a i nstal ad o . ndi ce d e una cad ena d e caracteres d entro d e l a tabl a d e tomos l ocal es o gl obal es. Manej ad o r q ue i d enti fi ca un b l o q ue d e memo ri a gl ob al reservad o di nmi camente. En l as versi o nes d e Wi nd ow s d e 32 b i ts, no hay d i sti nci n entr e l a memo ri a d i nmi ca reser vad a g l o b al o l ocal mente. Manej ad o r q ue i d enti fi ca un b l o q ue d e memo ri a l o cal reservad o di nmi camente. En l as versiones de Wi ndows de 32 bi ts, no hay d i s ti n ci n e n t r e l a m e mo ri a d i n mi c a r e s e r v a d a g l o b al o l ocal mente. Pu nt e ro a p ro ce d i mi ento . S e u ti l i za no rm al me nt e co mo ti p o d e p armetro en funci ones que requi eren que se sumi ni stre l a di recci n de una funci n de respuesta (call back functio n). Man ej ad o r d e o b j eto g r fi co . Lo s co ntexto s d e d i sp o si ti vo, pl umas, brochas, etc. ti enen un manejador de este ti po que los i d enti fi ca d entro d e l as tabl as i nternas d e Wi nd ow s. Man ej ad o r d e o b j eto d e map a d e b i ts d e W i nd o w s. Ma ne j a d o r d e o b j e to d e b ro c ha d e W i nd o w s . Ma ne j a d o r d e o b j e to d e p l uma d e W i nd o w s. Ma ne j a d o r d e co n te xto d e d i sp o si ti vo d e W i nd o w s. Ma ne j a d o r d e o b j e to d e p al et a d e co l o res d e W i nd o w s . Man ej ad o r d e o b j eto d e fue nte l g i ca d e W i nd o w s. Ma ne j a d o r d e o b j e to d e i co no d e W i nd o w s. Ma ne j a d o r d e o b j e to d e me n d e W i nd o w s. Ma ne j a d o r d e o b j e to d e me ta fi che ro d e W i nd o w s. Ma ne j a d o r d e o b j e to d e me ta f che ro mej o ra d o d e W i nd o w s. Ma ne j a d o r d e o b j e to d e re g i n d e W i nd o w s. Manej ado r d e ob j eto d e i nstanci a.
HLOCAL
THandle
FARPROC
Pointer
H G DI O B J
Integer
HBITMAP HBRUSH HPEN HDC H PA L ET T E HFONT HICON HMENU HMETAFILE HENHMET AFILE HRGN HINST
Integer Integer
4 Captulo I
Tipo Windows
HMODULE HRSRC HKL HFILE H CURS O R COLORREF
Descripcin
Manejador de objeto de un mdulo. Manej ad o r d e o b j eto d e recurso d e Wi ndo ws Manejador de configuracin de teclado. Manejador de fichero abierto. Man ej ad o r d e o b j eto d e curso r d e W i nd o w s Val or de referenci a d e col or d e Wi ndows, que conti ene val ores para los componentes rojo, verde y azul de un color.
Manejadores
Un concepto fundamental de la programacin Windows es el de manejador de objeto. Muchas funciones devuelven un manejador de objeto que la funcin crea o carga desde un recurso. Funciones como CreateWindow y CreateWindowEx devuelven un manejador de ventana. Otras funciones devuelven un manejador de fichero abierto, o un manejador de un heap recin reservado en memoria, corno HeapCreate. Internamente, Windows mantiene la informacin necesaria sobre todos esos objetos, y los manejadores sirven como enlace entre el objeto y la aplicacin. ste es el mecanismo que permite que una aplicacin se comunique con el sistema operativo. A travs de los manejadores, una aplicacin puede fcilmente referirse a cualquiera de esos objetos, y el sistema operativo sabr instantneamente qu objeto desea manipular la aplicacin.
Constantes
Las funciones del API de Windows declaran miles de constantes diferentes para que sean utilizadas como valores de parmetros. En el fichero Windows.PAS se definen constantes para todo tipo de usos, desde valores de colores hasta valores de retorno. Las constantes definidas para cada funcin del API se listan junto con la funcin en cuestin dentro de ese fichero. Sin embargo, Windows.PAS puede ofrecer ms informacin con relacin a las constantes asociadas a cualquier funcin particular; por ello, una buena regla a tener siempre en cuenta es la de comprobar este fichero al utilizar funciones complejas.
Cadenas de caracteres
Todas las funciones del API de Windows que utilizan cadenas requieren un puntero a un array de caracteres terminados en nulo. Windows ha sido escrito en C, que no ofrece el tipo de cadena de Pascal. Las versiones iniciales de Delphi exigan que la aplicacin reservara un buffer para la cadena y convirtiera la variable de tipo String a PChar. Sin embargo, a partir de Delphi 3 el formato interno de las cadenas y un nuevo mecanismo de conversin permiten utilizar una cadena como un PChar mediante una simple conversin de tipo (por ejemplo, PChar(MiCadena), donde MiCadena es una
variable declarada corno MiCadena: String). En la mayora de los casos, esta conversin podr utilizarse al llamar a una funcin del API de Windows que requiera un parmetro de tipo cadena de caracteres.
Siempre que se conozcan los tipos de los parmetros exigidos por la funcin y el nombre de la DLL que contiene la funcin, cualquier funcin del API de Windows puede ser importada y utilizada por una aplicacin Delphi. Es importante destacar que la directiva stdcall debe aadirse siempre al prototipo de la funcin, por cuanto ste es el mecanismo estndar mediante el cual Windows pasa los parmetros a la funcin a travs de la pila.
1.
De hecho, no lo estaba en la versin de Windows.PAS incluida en Delphi 3. Esta omisin fue corregida en Delphi 4.
6 Captulo I
Delphi, algunas funciones de este tipo, han sido importadas con parmetros definidos como var o const. Estos tipos de Parmetros aceptan un puntero a un buffer, pero nunca pueden recibir nil, limitando de este modo la utilizacin de la funcin dentro de Delphi. Corno ocurre casi siempre con Delphi, el problema es muy fcil de resolver Simplemente vuelva a importar la funcin, segn hemos descrito antes. Las funciones que han sido importadas incorrectamente se identifican en el libro en las descripciones individuales de cada funcin.
Funciones de respuesta
Otro concepto muy importante de la programacin Windows es el de funcin de respuesta (callback limetion). Una funcin de respuesta es una funcin dentro de la aplicacin que no es llamada directamente por ninguna otra funcin o procedimiento de la aplicacin, sino que es llamada por el sistema operativo. Esto le permite a Windows comunicarse directamente con la aplicacin, pasndole los parmetros requeridos por la funcin de respuesta en cuestin. La mayora de las funciones de enumeracin requieren algn tipo de funcin de respuesta definida por la aplicacin que reciba la informacin que se enumera. Las funciones de respuesta individuales tienen parmetros especficos que deben ser declarados exactamente por la aplicacin. Esto es necesario para que Windows pase a la funcin la informacin correcta en el orden correcto. Un buen ejemplo de funcin que utiliza una funcin de respuesta es EnumWindows. Esta funcin recorre todas las ventanas de nivel superior en la pantalla, pasando el manejador de cada ventana a la funcin de respuesta definida por la aplicacin. El proceso contina hasta que todas las ventanas hayan sido enumeradas o la funcin de respuesta devuelva FALSE. La funcin de respuesta utilizada por EnumWindows se define corno:
EnumWindowsProc( hWnd: HWND; IParam: LPARAM ): BOOL; {manejador de ventana de alto nivel} {datos definidos por la aplicacin} {devuelve TRUE o FALSE}
Una funcin con este prototipo deber definirse dentro de la aplicacin, y un puntero a ella deber pasarse como parmetro a la funcin Enum Windows. El sistema operativo llamar a la funcin de respuesta una vez por cada ventana de nivel superior en la pantalla, pasando cada vez el manejador de una de ellas como parmetro. Es importante destacar que la directiva stdcall debe ser aadida al prototipo de la funcin de respuesta, ya que ese es el mecanismo estndar de traspaso de parmetros que utiliza Windows. Por ejemplo, la funcin de respuesta anterior deber tener el siguiente prototipo:
function EnumWindowsProc(hWnd: HWND; lParam: LPARAM) BOOL; stdcall;
Este poderoso mecanismo de software permite en muchos casos que una aplicacin recupere informacin sobre el sistema que es almacenada slo internamente por
Parmetros de funciones
La gran mayora de las funciones del API de Windows simplemente reciben los parmetros estticos que se le envan y realizan cierta tarea en base a los valores de los parmetros. Sin embargo, ciertas funciones devuelven valores que debern ser almacenados en un buffer, y este buffer deber pasarse a la funcin en forma de puntero. En la mayora de los casos en que la descripcin de una funcin especfica que sta devuelve algn valor a travs de un buffer de cadena terminada en carcter nulo o de una estructura de datos, estos buffers o estructuras debern ser reservados por la aplicacin antes de llamar a la funcin. En muchos casos, la documentacin de un parmetro puede especificar que ste puede contener uno o ms valores de una tabla. Esos valores se definen en forma de constantes, y pueden combinarse utilizando el operador or. Un valor concreto de ese parmetro generalmente identifica una mscara de bits, donde el estado de cada bit tiene un significado concreto para la funcin. Es por eso que las constantes pueden combinarse mediante operaciones de manipulacin de bits. Por ejemplo, la funcin CreateWindow tiene un parmetro llamado dwStyle que puede aceptar un nmero variable de constantes combinadas mediante el operador or. Para pasar ms de una constante a la funcin, al parmetro deber asignrsele una valor como "WS CAPTION or WS_CHILD or WS CLIPCHILDREN". Ello har que se cree una ventana hija que tendr una barra de ttulo y no dibujar en el rea ocupada por sus ventanas hijas al redibujarse. A la inversa, cuando la documentacin de una funcin especfica que sta devuelve uno o ms valores definidos como constantes, el valor devuelto puede combinarse con cualquiera de las constantes utilizando el operador and para determinar si la constante est incluida en el valor de retorno. Si el resultado de la combinacin es igual a la constante (por ejemplo, if (Result and WS_CHILD) = WS_CHILD then...), la constante est incluida en el valor devuelto por la funcin.
Unicode
Originalmente, el software necesitaba nicamente un byte para definir un carcter de un conjunto de caracteres. Ello permita hasta 256 caracteres diferentes, lo que era ms que suficiente para el alfabeto, los dgitos, los signos de puntuacin y los smbolos matemticos comunes. Sin embargo, debido al desarrollo de la comunidad global y la subsiguiente internacionalizacin de Windows y el software para Windows, se necesitaba un nuevo mtodo para identificar caracteres. Muchos idiomas utilizan ms de 256 caracteres diferentes en su escritura, mucho ms de lo que puede describirse con un byte. Por todo ello surgi Unicode. Un carcter Unicode ocupa 16 bits, lo que
8 Captulo I
permite identificar 65.535 caracteres diferentes. Para acomodar el nuevo conjunto de caracteres, muchas funciones del API de Windows se ofrecen en dos versiones diferentes: ANSI y Unicode. Cuando revise el fichero Windows.PAS, ver funcione definidas con una 'A' o 'W' aadidas al final del nombre de la funcin, identificando as las versiones ANSI o Wide (Unicode) de la funcin. En este libro nos centraremos en la descripcin de las versiones ANSI de las funciones del API. Sin embargo, las funciones Unicode generalmente difieren nicamente en el tipo de las cadenas pasada a la funcin, por lo que el texto de este libro describir de forma adecuada el comportamiento de la versin Unicode de las funciones.