Anda di halaman 1dari 8

Delphi y el API de Windows I

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.

El API de Windows vs. la VCL


El equipo de desarrollo de Delphi hizo un trabajo excelente al encapsular en la VCL la amplia mayora de la funcionalidad del vasto API de Windows. Sin embargo, debido a las dimensiones de este API, sera imposible e imprctico encapsular cada una de sus funciones en un objeto de Object Pascal. Para alcanzar ciertos objetivos o resolver un problema especfico, un programador puede verse obligado a utilizar funciones de ms bajo nivel del API de Windows que sencillamente no estn encapsuladas en ningn objeto Delphi. Puede ser necesario, por otra parte, extender la funcionalidad de un objeto Delphi, y si este objeto encapsula alguna parte concreta del API de Windows, la extensin deber realizarse, probablemente, utilizando tambin en gran medida los recursos del API.

2 Captulo I

Tipos de datos de Windows


Las funciones del API de Windows utilizan ciertos tipos de datos que pueden no ser familiares para los programadores ocasionales de Delphi. Estos tipos se importan de ficheros de cabecera originales en C que definen la estructura de las funciones del API de Windows. En su gran mayora, estos nuevos tipos de datos son sencillamente tipos de datos de Pascal que han sido renombrados para hacerlos similares a los tipos de datos originalmente utilizados en lenguajes de programacin anteriores. Esto se hizo as para facilitar que los programadores experimentados comprendieran los tipos de parmetros y valores de retorno de las funciones del API, y que los prototipos de las funciones fuesen muy parecidos a los mostrados en la documentacin del API de Windows, para evitar posibles confusiones. La siguiente tabla muestra los tipos de datos ms comunes de Windows y sus equivalentes en Object Pascal. Tabla 1-1: Tipos de datos de Windows
Tipo Windows
LPSTR LPCSTR DWORD BOOL PBOOL PByte PINT PSingle PWORD PDWORD LPDWORD UCHAR PUCHAR SHORT UINT PUINT ULONG PULONG PLonglnt Plnteger PSmalllnt PDouble LCID LANGID

Tipo Object Pascal


PAnsiChar PAnsiChar LongWord LongBool ^BOOL ^Byte ^Integer ^Single ^Word ^DWORD PDWORD Byte ^ Byte Smallint LongWord UINT Cardinal ^ULON G ^LongInt ^Integer ^Smallint ^Double DWOR D Word

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.

Delphi y el API de Windows 3

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.

PHandle WPARAM LPARAM LRESULT HWND

^THandle Longlnt Longlnt Longlnt Integer

HHOOK ATOM H GLO B A L

Integer Word T H and l e

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 Integer Integer I nt eg e r lnteger Integer lnteger Integ er Integer

Integer Integer

4 Captulo I

Tipo Windows
HMODULE HRSRC HKL HFILE H CURS O R COLORREF

Tipo Object Pascal


HINST Integer Integer Integer H I CO N DWORD

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

Delphi y el API de Windows 5

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.

Importacin de funciones de Windows


El API de Windows es enorme. Define funciones para casi cualquier utilidad o accin que un programador podra imaginar. Debido al generoso volumen del API de Windows, algunas funciones simplemente han sido "olvidadas" y no han sido importadas por las libreras de Delphi. Por cuanto todas las funciones del API de Windows son sencillamente funciones exportadas de DLLs, importar una nueva funcin del API de Windows es un proceso relativamente simple, siempre que se conozcan los parmetros de la misma. Importar una nueva funcin del API de Windows es exactamente igual a importar cualquier otra funcin de una DLL. Por ejemplo, supongamos que la funcin BroadcastSystemMessage descrita en el captulo "Funciones de Gestin de Mensajes" no estuviese importada en el cdigo fuente incluido en Delphi1. Para importar esa funcin y poder utilizarla en una aplicacin, bastara con declararla como:
function BroadcastSystemMessage(Flags: DWORD; Recipients: PDWORD; . uiMessage: UINT; wParam: WPARAM; 'Paran ]: LPARAM): Longlnt; stdcall; implementation function BroadcastSystemMessage; external user32 name 'BroadcastSystemMessage' ;

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.

Funciones importadas incorrectamente


Algunas funciones han sido importadas incorrectamente en el cdigo fuente de Delphi. Esas excepciones se sealan en las descripciones individuales de las funciones. En la mayora de los casos, las funciones que han sido incorrectamente importadas tienen relacin con la posibilidad de pasar el valor nil como valor a un parmetro de tipo puntero, generalmente para recuperar el tamao necesario para un buffer que la aplicacin debe reservar dinmicamente una vez conozca la longitud necesaria. En

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

Delphi y el API de Windows 7


Windows y que de otro modo sera totalmente inalcanzable. Para un ejemplo completo de utilizacin de funciones de respuesta, consulte la funcin EnumWindows, y muchas otras funciones a lo largo del libro.

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.

Anda mungkin juga menyukai