Você está na página 1de 825

Ayres, John y otros Los Tomos de Delphi: El ncleo del API Win32 No est permitida la reproduccin total o parcial

de esta obra, ni su tratamiento o transmisin por cualquier medio o mtodo sin el consentimiento explcito de la editorial. DERECHOS RESERVADOS Copyright 1999, Danysoft Internacional Avda. de Espaa, 17 28100 Alcobendas (Madrid) www.danysoft.com ISBN: 84-923926-2-2 Depsito Legal: MTraducido de: The tomes of Delphi: Win32 Core API 1998 Wordware Publishing, Inc. ISBN 1-55622-556-3

Delphi es una marca registrada de Inprise Corporation. Windows es una marca registrada de Microsoft Corporation.

Quiero dedicar este libro a las siguientes personas y divinidades, que han ejercido una profunda influencia en mi vida. Ante todo, a Dios, de quien he estado mucho ms cerca en los ltimos aos, por haberme dado la inteligencia necesaria para navegar a travs de la confusa y a veces desquiciante documentacin del API de Windows y sacar sentido de ella; en segundo lugar, a mi familia, que ha tenido que soportar mi ausencia de las actividades familiares durante el tiempo que ha durado este proyecto; y finalmente, pero de forma muy especial, a mi esposa y compaera del alma, Marci, que garantiz que yo tuviese ropa limpia por las maanas, comida a medioda y cena por las noches, y en general se hizo cargo de todas mis responsabilidades domsticas para que yo pudiese concentrarme en el libro. Ella me dio aliento en los momentos en los que el peso del proyecto se haca insostenible, y por eso es responsable directa de que este trabajo se haya finalizado. No merezco una esposa tan devota y amante, y agradezco a Dios cada da por haberme dado tan perfecta compaera. Cario, te lo dedico a t!.

A Desire y Ryan por su amor y apoyo infinitos; no podra pedir mejores hijos. No es fcil tener un padre obsesionado por el trabajo. Gracias por ser tan comprensivos y permitirme soar por un rato. A mis padres por su amor y apoyo de toda la vida. Finalmente, a Don C. Allred por cuidar de m. Estoy empezando a levantar el vuelo, pap; ojal estuvieses aqu para verlo.

Dedico mi trabajo en este libro al pasado y al futuro. Desde el fondo de mi alma, agradezco a mi esposa, padres y hermano por su apoyo constante durante estos aos. Ese apoyo me ha permitido llegar a un punto en mi vida en el que me siento todo lo feliz que un hombre puede serlo. En relacin con el futuro, deseo que nuestro trabajo en este libro contribuya a hacer un mundo mejor, en el que mi primer hijo pronto nacer. En cuanto al presente, es lo que uno obtiene de l...

A mis hijas, Jennifer y Amanda, que son la luz de mi vida.

Quiero dedicar este libro a mis padres, Melvin y Judith Harrison, por todos los sacrificios que han tenido que hacer para darnos a m y a mis hermanos un entorno seguro en el que crecer, e inculcarnos la idea de que podemos hacer cualquier cosa que nos propongamos. Tambin deseo agradecer a Daniel Roberts y Stethman Grayson por todo el conocimiento sobre Windows que me han aportado y por ser tan buenos amigos.

Deseara agradecer a todos los coautores de este libro haberme ofrecido la oportunidad de contribuir a esta pequea obra maestra, y muy en especial a John Ayres. Tambin deseo dar las gracias a mi esposa, Sherry, y a mis tres hijos, Keith, Kimberly y Amber, que tuvieron que hacer su vida sin m durante meses, pero al final lo hemos superado todoahora tenemos una vida!.

Dedico este libro a mi familia y amigos.

A mi esposa, Lisa, por haber comprendido mi trabajo nocturno en el libro en fechas tan cercanas a nuestra boda, y a mis cuatro gatos, que me hicieron compaa durante esas noches.

Sobre los autores. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XVII Agradecimientos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XIX Prlogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XXI

Descripcin de los captulos . . . . . . . . . . . . . . . . . . . . . . . XXIV Convenios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XXVI Descripciones de funciones . . . . . . . . . . . . . . . . . . . . . . . XXVI Cdigo fuente de los ejemplos . . . . . . . . . . . . . . . . . . . . . XXVII A quin est orientado este libro . . . . . . . . . . . . . . . . . . . . XXVII El API de Windows vs. la VCL . . . . . . Tipos de datos de Windows . . . . . . . . Manejadores . . . . . . . . . . . . . . Constantes . . . . . . . . . . . . . . . Cadenas de caracteres . . . . . . . . . Importacin de funciones de Windows . . Funciones importadas incorrectamente Funciones de respuesta . . . . . . . . . . Parmetros de funciones . . . . . . . . . . Unicode. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 2 4 4 4 5 5 6 7 7

Obtencin del logotipo . . . . . . . . . . . . . . . . . . Categoras de productos . . . . . . . . . . . . . . . . . Pasando el test . . . . . . . . . . . . . . . . . . . . . . Fiabilidad del Producto (Requisitos Bsicos) . . . . Experiencia de usuario . . . . . . . . . . . . . . . . Requisitos y sugerencias generales de accesibilidad. Compatibilidad de la aplicacin . . . . . . . . . . .

12 13 14 15 16 31 35

Creando ventanas: Los pasos bsicos . . . . . . . . . . . . . . . . . . . . 37 El procedimiento de ventana . . . . . . . . . . . . . . . . . . . . . . . . . 39 Programacin nativa de ventanas. . . . . . . . . . . . . . . . . . . . . . 40

Tipos de ventanas . . . . . . . . . . . . . . . . La Interfaz de Documentos Mltiples (MDI) . Extendiendo la Funcionalidad . . . . . . . . . Funciones de Creacin y Registro de Ventanas CreateMDIWindow . . . . . . . . . . . CreateWindow . . . . . . . . . . . . . . CreateWindowEx . . . . . . . . . . . . DestroyWindow . . . . . . . . . . . . . RegisterClass. . . . . . . . . . . . . . . RegisterClassEx . . . . . . . . . . . . . UnregisterClass . . . . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

42 44 50 53 53 57 76 83 83 89 90

La cola de mensajes y el bucle de mensajes . . . . . . . . . . . . . . . . . 93 Ganchos de Ventanas. . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 Comunicacin entre procesos . . . . . . . . . . . . . . . . . . . . . . . . 95 Funciones de gestin de mensajes . . . . . . . . . . . . . . . . . . . . . . 95 BroadcastSystemMessage . . . . . . . . . . . . . . . . . . . . . . . 97 CallNextHookEx . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 CallWindowProc . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 DefFrameProc . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 DefMDIChildProc . . . . . . . . . . . . . . . . . . . . . . . . . . 107 DefWindowProc . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 DispatchMessage . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 GetMessage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 GetMessageExtraInfo. . . . . . . . . . . . . . . . . . . . . . . . . 114 GetMessagePos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 GetMessageTime . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 GetQueueStatus . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 InSendMessage . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 PeekMessage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 PostMessage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 PostQuitMessage . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 PostThreadMessage. . . . . . . . . . . . . . . . . . . . . . . . . . 125 RegisterWindowMessage. . . . . . . . . . . . . . . . . . . . . . . 127 ReplyMessage . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 SendMessage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 SendMessageCallback . . . . . . . . . . . . . . . . . . . . . . . . 131 SendMessageTimeout . . . . . . . . . . . . . . . . . . . . . . . . 133 SendNotifyMessage . . . . . . . . . . . . . . . . . . . . . . . . . 137 SetMessageExtraInfo . . . . . . . . . . . . . . . . . . . . . . . . . 139 SetWindowsHookEx . . . . . . . . . . . . . . . . . . . . . . . . . 139 TranslateMessage . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 UnhookWindowsHookEx . . . . . . . . . . . . . . . . . . . . . . 162 WaitMessage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162

Almacenamiento de la informacin. . . . Informacin especfica de las ventanas . . Subclasificando una ventana . . . . . . . Conocindolo todo . . . . . . . . . . . . Funciones de informacin sobre ventanas AnyPopup . . . . . . . . . . . . . . . ChildWindowFromPoint . . . . . . . ChildWindowFromPointEx . . . . . . EnableWindow . . . . . . . . . . . . EnumChildWindows . . . . . . . . . EnumProps . . . . . . . . . . . . . . EnumPropsEx . . . . . . . . . . . . . EnumThreadWindows . . . . . . . . EnumWindows . . . . . . . . . . . . FindWindow . . . . . . . . . . . . . FindWindowEx . . . . . . . . . . . . FlashWindow . . . . . . . . . . . . . GetActiveWindow . . . . . . . . . . GetClassInfo . . . . . . . . . . . . . GetClassInfoEx . . . . . . . . . . . . GetClassLong . . . . . . . . . . . . . GetClassName . . . . . . . . . . . . GetClientRect . . . . . . . . . . . . . GetDesktopWindow. . . . . . . . . . GetFocus . . . . . . . . . . . . . . . GetForegroundWindow . . . . . . . . GetNextWindow . . . . . . . . . . . GetParent . . . . . . . . . . . . . . . GetProp . . . . . . . . . . . . . . . . GetTopWindow . . . . . . . . . . . . GetWindow . . . . . . . . . . . . . . GetWindowLong . . . . . . . . . . . GetWindowRect. . . . . . . . . . . . GetWindowText. . . . . . . . . . . . GetWindowTextLength . . . . . . . . IsChild. . . . . . . . . . . . . . . . . IsIconic . . . . . . . . . . . . . . . . IsWindow . . . . . . . . . . . . . . . IsWindowEnabled. . . . . . . . . . . IsWindowUnicode . . . . . . . . . . IsWindowVisible . . . . . . . . . . . IsZoomed . . . . . . . . . . . . . . . RemoveProp . . . . . . . . . . . . . SetActiveWindow. . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

165 166 167 168 174 176 177 178 180 182 184 187 190 192 194 196 197 198 199 201 203 206 207 208 209 210 211 213 213 214 215 217 220 221 222 223 224 225 226 226 227 228 229 230

SetClassLong . . . . . . SetFocus . . . . . . . . SetForegroundWindow . SetParent . . . . . . . . SetProp . . . . . . . . . SetWindowLong . . . . SetWindowText . . . . . WindowFromPoint . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

231 232 234 234 236 236 239 239 241 241 242 242 242 242 243 243 243 245 248 252 256 259 261 261 265 266 267 268 268 269 270 270 271 273 275 277 278 280 282 283 284 285 286

Procesos . . . . . . . . . . . . . . . Hilos . . . . . . . . . . . . . . . . . Secciones Crticas . . . . . . . . . . Semforos . . . . . . . . . . . . . . Exclusin mutua. . . . . . . . . . . Eventos . . . . . . . . . . . . . . . Interbloqueos . . . . . . . . . . . . Niveles de prioridad . . . . . . . . . Funciones de procesos e hilos . . . CreateEvent . . . . . . . . . . CreateMutex . . . . . . . . . CreateProcess . . . . . . . . . CreateSemaphore . . . . . . . CreateThread . . . . . . . . . DeleteCriticalSection . . . . . DuplicateHandle . . . . . . . EnterCriticalSection . . . . . ExitProcess . . . . . . . . . . ExitThread . . . . . . . . . . GetCurrentProcess . . . . . . GetCurrentProcessId . . . . . GetCurrentThread. . . . . . . GetCurrentThreadId . . . . . GetExitCodeProcess . . . . . GetExitCodeThread. . . . . . GetPriorityClass . . . . . . . GetThreadPriority . . . . . . GetWindowThreadProcessId . InitializeCriticalSection. . . . InterlockedDecrement . . . . InterlockedExchange . . . . . InterlockedIncrement . . . . . LeaveCriticalSection . . . . . OpenEvent . . . . . . . . . . OpenMutex . . . . . . . . . .

OpenProcess . . . . OpenSemaphore. . . PulseEvent . . . . . ReleaseMutex . . . . ReleaseSemaphore . ResetEvent . . . . . ResumeThread . . . SetEvent . . . . . . . SetPriorityClass . . . SetThreadPriority . . Sleep. . . . . . . . . SuspendThread . . . TerminateProcess . . TerminateThread . . TlsAlloc . . . . . . . TlsFree . . . . . . . TlsGetValue . . . . . TlsSetValue . . . . . WaitForInputIdle . . WaitForSingleObject

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

287 290 291 292 293 294 294 295 296 297 298 299 299 301 303 305 305 306 307 308 311 312 313 313 314 315 316 316 320 320 321 322 325 329 330 330 332 333 334 336 338

Importacin/Exportacin de Funciones. . . Convenios de llamada . . . . . . . . . . . . El punto de entrada de la DLL . . . . . . . Funciones de libreras de enlace dinmico . DLLEntrypoint . . . . . . . . . . . . . DisableThreadLibraryCalls . . . . . . . FreeLibrary . . . . . . . . . . . . . . . FreeLibraryAndExitThread . . . . . . . GetModuleFileName . . . . . . . . . . GetModuleHandle. . . . . . . . . . . . GetProcAddress . . . . . . . . . . . . . LoadLibrary . . . . . . . . . . . . . . . LoadLibraryEx . . . . . . . . . . . . .

Ficheros de inicializacin . . . . . . . . . . . . . . . El registro . . . . . . . . . . . . . . . . . . . . . . . Funciones de registro y de ficheros de inicializacin GetPrivateProfileInt. . . . . . . . . . . . . . . . GetPrivateProfileSection . . . . . . . . . . . . . GetPrivateProfileSectionNames . . . . . . . . . GetPrivateProfileString . . . . . . . . . . . . . . GetPrivateProfileStruct . . . . . . . . . . . . . .

GetProfileInt . . . . . . . . GetProfileSection . . . . . . GetProfileString . . . . . . RegCloseKey . . . . . . . . RegCreateKeyEx . . . . . . RegDeleteKey . . . . . . . RegDeleteValue . . . . . . . RegEnumKeyEx . . . . . . RegEnumValue . . . . . . . RegFlushKey . . . . . . . . RegLoadKey . . . . . . . . RegOpenKeyEx. . . . . . . RegQueryInfoKey . . . . . RegQueryValueEx . . . . . RegReplaceKey . . . . . . . RegSaveKey . . . . . . . . RegSetValueEx . . . . . . . RegUnLoadKey. . . . . . . WritePrivateProfileSection . WritePrivateProfileString . . WritePrivateProfileStruct . . WriteProfileSection . . . . . WriteProfileString . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

339 340 341 342 342 346 347 349 351 354 355 357 359 361 364 365 367 368 369 372 373 375 377 381 382 382 382 383 384 384 385 385 386 386 387 387 389 390 391 392 395 395 396

API vs. Delphi . . . . . . . . . . . . . . . . . . La arquitectura de la memoria bajo Win32 . . . Categoras de funciones de reserva de memoria Heaps . . . . . . . . . . . . . . . . . . . . . . Las funciones de memoria de 16 bits . . . . . . La memoria virtual . . . . . . . . . . . . . . . Los tres estados de la memoria . . . . . . . . . Cunta memoria realmente hay?. . . . . . . . Mltiples heaps . . . . . . . . . . . . . . . . . Tratamiento de errores . . . . . . . . . . . . . Acceso desde hilos . . . . . . . . . . . . . . . Velocidad . . . . . . . . . . . . . . . . . . . . Funciones de gestin de memoria . . . . . . . CopyMemory . . . . . . . . . . . . . . . FillMemory . . . . . . . . . . . . . . . . GetProcessHeap . . . . . . . . . . . . . GlobalAlloc . . . . . . . . . . . . . . . . GlobalDiscard. . . . . . . . . . . . . . . GlobalFlags . . . . . . . . . . . . . . . . GlobalFree . . . . . . . . . . . . . . . .

GlobalHandle . . . . GlobalLock . . . . . GlobalMemoryStatus GlobalReAlloc . . . GlobalSize. . . . . . GlobalUnlock . . . . HeapAlloc . . . . . . HeapCreate . . . . . HeapDestroy . . . . HeapFree . . . . . . HeapReAlloc . . . . HeapSize . . . . . . IsBadCodePtr . . . . IsBadReadPtr . . . . IsBadStringPtr. . . . IsBadWritePtr . . . . LocalAlloc . . . . . LocalDiscard . . . . LocalFlags. . . . . . LocalFree . . . . . . LocalHandle. . . . . LocalLock . . . . . . LocalReAlloc . . . . LocalSize . . . . . . LocalUnlock . . . . MoveMemory . . . . VirtualAlloc . . . . . VirtualFree . . . . . VirtualProtect . . . . VirtualQuery . . . . ZeroMemory . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

397 398 399 401 404 405 406 409 410 411 411 413 414 415 416 417 419 421 422 422 423 424 425 428 429 430 431 436 437 440 442 443 444 444 447 448 448 449 450 450 451 453 456

Cmo funciona el portapapeles?. . . . . . . Conversin de formatos . . . . . . . . . . . . Entrega demorada . . . . . . . . . . . . . . . Visores del portapapeles . . . . . . . . . . . Funciones de manipulacin del portapapeles. ChangeClipboardChain . . . . . . . . . . CloseClipboard . . . . . . . . . . . . . . CountClipboardFormats . . . . . . . . . EmptyClipboard. . . . . . . . . . . . . . EnumClipboardFormats. . . . . . . . . . GetClipboardData . . . . . . . . . . . . . GetClipboardFormatName . . . . . . . .

GetClipboardOwner . . . . GetClipboardViewer . . . . GetOpenClipboardWindow. GetPriorityClipboardFormat IsClipboardFormatAvailable OpenClipboard . . . . . . . RegisterClipboardFormat . . SetClipboardData . . . . . . SetClipboardViewer . . . . El teclado . . . . . . . . . . . . El ratn . . . . . . . . . . . . . Funciones de entrada . . . . . . ActivateKeyboardLayout . ClipCursor . . . . . . . . DragDetect . . . . . . . . GetAsyncKeyState . . . . GetCapture . . . . . . . . GetCaretBlinkTime . . . . GetCaretPos. . . . . . . . GetClipCursor . . . . . . GetCursorPos . . . . . . . GetDoubleClickTime . . . GetInputState . . . . . . . GetKeyboardLayout . . . GetKeyboardLayoutList . GetKeyboardLayoutName GetKeyboardState . . . . GetKeyboardType . . . . GetKeyNameText. . . . . GetKeyState. . . . . . . . keybd_event . . . . . . . joyGetDevCaps . . . . . . joyGetNumDevs . . . . . joyGetPos . . . . . . . . . joyGetPosEx . . . . . . . joyGetThreshold . . . . . joyReleaseCapture . . . . joySetCapture . . . . . . . joySetThreshold . . . . . LoadKeyboardLayout . . MapVirtualKey . . . . . . MapVirtualKeyEx . . . . mouse_event . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

457 457 458 459 460 461 462 463 468 471 471 472 473 474 475 477 478 478 479 479 480 481 481 482 482 483 484 485 487 489 491 492 495 496 497 500 501 502 506 507 510 512 514

OemKeyScan . . . . . . ReleaseCapture . . . . . SetCapture. . . . . . . . SetCaretBlinkTime . . . SetCaretPos . . . . . . . SetCursorPos . . . . . . SetDoubleClickTime . . SetKeyboardState . . . . SwapMouseButton . . . UnloadKeyboardLayout VkKeyScan . . . . . . . VkKeyScanEx. . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

516 517 518 518 520 521 521 522 523 526 527 528 531 532 532 534 535 538 539 542 543 549 555 556 557 558 559 563 564 564 568 572 572 573 574 575 576 577 580 581 582 583 584

Creacin de ficheros . . . . . . . . . . Horas de ficheros . . . . . . . . . . . . Funciones de entrada/salida de ficheros CloseHandle. . . . . . . . . . . . . CompareFileTime . . . . . . . . . . CopyFile . . . . . . . . . . . . . . CreateDirectory . . . . . . . . . . . CreateDirectoryEx . . . . . . . . . CreateFile . . . . . . . . . . . . . . CreateFileMapping . . . . . . . . . DeleteFile . . . . . . . . . . . . . . DosDateTimeToFileTime . . . . . . FileTimeToDosDateTime . . . . . . FileTimeToLocalFileTime . . . . . FileTimeToSystemTime . . . . . . FindClose . . . . . . . . . . . . . . FindCloseChangeNotification . . . FindFirstChangeNotification . . . . FindFirstFile . . . . . . . . . . . . FindNextChangeNotification . . . . FindNextFile . . . . . . . . . . . . FlushFileBuffers . . . . . . . . . . FlushViewOfFile . . . . . . . . . . GetCurrentDirectory . . . . . . . . GetFileAttributes . . . . . . . . . . GetFileInformationByHandle. . . . GetFileSize . . . . . . . . . . . . . GetFileTime . . . . . . . . . . . . . GetFileType . . . . . . . . . . . . . GetFileVersionInfo . . . . . . . . . GetFileVersionInfoSize . . . . . . .

GetFullPathName . . . . . GetShortPathName . . . . GetTempFileName . . . . GetTempPath . . . . . . . LocalFileTimeToFileTime LockFile . . . . . . . . . MapViewOfFile. . . . . . MoveFile . . . . . . . . . OpenFileMapping. . . . . ReadFile . . . . . . . . . RemoveDirectory . . . . . SearchPath . . . . . . . . SetCurrentDirectory . . . SetEndOfFile . . . . . . . SetFileAttributes . . . . . SetFilePointer . . . . . . . SetFileTime . . . . . . . . SystemTimeToFileTime . UnlockFile . . . . . . . . UnmapViewOfFile . . . . VerQueryValue . . . . . . WriteFile . . . . . . . . . Tablas de tomos . . . . . . . . Conversiones de cadenas . . . . Formato de cadenas . . . . . . . Funciones de cadenas y tomos. AddAtom . . . . . . . . . CharLower . . . . . . . . CharLowerBuff . . . . . . CharNext . . . . . . . . . CharPrev . . . . . . . . . CharToOem . . . . . . . . CharToOemBuff . . . . . CharUpper . . . . . . . . CharUpperBuff . . . . . . CompareString . . . . . . DeleteAtom . . . . . . . . EnumSystemCodePages . EnumSystemLocales . . . FindAtom . . . . . . . . . FormatMessage . . . . . . GetACP . . . . . . . . . . GetAtomName . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

584 585 586 588 589 590 591 592 593 594 596 597 598 599 599 603 605 606 607 608 608 616 619 621 621 621 622 624 626 627 627 628 630 630 631 632 636 637 639 641 642 648 650

GetCPInfo . . . . . . . GetDateFormat . . . . GetOEMCP . . . . . . GetTimeFormat . . . . GlobalAddAtom . . . GlobalDeleteAtom . . GlobalFindAtom . . . GlobalGetAtomName . InitAtomTable. . . . . IsCharAlpha. . . . . . IsCharAlphaNumeric . IsCharLower . . . . . IsCharUpper. . . . . . lstrcat . . . . . . . . . lstrcmp . . . . . . . . lstrcmpi . . . . . . . . lstrcpy . . . . . . . . . lstrlen . . . . . . . . . MakeIntAtom . . . . . OemToChar . . . . . . OemToCharBuff . . . ToAscii . . . . . . . . wvsprintf . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

651 652 655 658 661 663 663 664 665 666 666 667 668 668 670 671 672 673 674 675 676 677 678 683 684 686 687 687 688 689 691 692 694 694 702 703 705 706 708 709 709 710 715

Caractersticas de accesibilidad . . . . Funciones de informacin del sistema ExpandEnvironmentStrings. . . . FreeEnvironmentStrings . . . . . GetCommandLine. . . . . . . . . GetComputerName . . . . . . . . GetDiskFreeSpace . . . . . . . . GetDriveType . . . . . . . . . . . GetEnvironmentStrings . . . . . . GetEnvironmentVariable . . . . . GetLocaleInfo . . . . . . . . . . . GetLocalTime . . . . . . . . . . . GetLogicalDrives . . . . . . . . . GetLogicalDriveStrings. . . . . . GetStartupInfo . . . . . . . . . . GetSystemDefaultLangID . . . . GetSystemDefaultLCID . . . . . GetSystemDirectory . . . . . . . GetSystemInfo . . . . . . . . . . GetSystemTime . . . . . . . . . .

GetSystemTimeAsFileTime GetTimeZoneInformation . GetUserDefaultLangID . . . GetUserDefaultLCID . . . . GetUserName . . . . . . . . GetVersionEx . . . . . . . . GetVolumeInformation . . . GetWindowsDirectory . . . SetComputerName . . . . . SetEnvironmentVariable . . SetLocaleInfo . . . . . . . . SetLocalTime . . . . . . . . SetSystemTime . . . . . . . SetVolumeLabel . . . . . . SystemParametersInfo . . . VerLanguageName . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

715 716 719 719 720 721 723 725 726 728 729 733 735 737 738 764 769 771 773 773 774 776 777 778 781 782 783 783 784 785 787 788 789 790

Emulando un temporizador . . . . . . . . Temporizacin precisa . . . . . . . . . . Funciones de temporizacin de Windows GetTickCount . . . . . . . . . . . . KillTimer . . . . . . . . . . . . . . QueryPerformanceCounter . . . . . QueryPerformanceFrequency . . . SetTimer . . . . . . . . . . . . . . Descripciones de errores . . . . Huellas audibles . . . . . . . . . Funciones de error de Windows Beep. . . . . . . . . . . . ExitWindows . . . . . . . ExitWindowsEx. . . . . . FatalAppExit . . . . . . . GetLastError . . . . . . . MessageBeep . . . . . . . SetLastError . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

John Ayres desarroll su amor por la programacin utilizando predecesores domsticos del PC como el Texas Instruments TI 99/4A y el Commodore 64. Entr en el mundo real tomando clases de C y Pascal en la University of North Texas, donde particip en un proyecto experimental sobre programacin de juegos dirigido por el Dr. Ian Parberry. Al terminar el colegio, comenz a trabajar como tcnico de soporte en Stream International, donde cre junto a Ken Harrison su primera aplicacin profesional en Delphi 1, un sistema de seguimiento de llamadas telefnicas. Luego pas a ser jefe de proyectos en Puzzled Software, y tambin trabaj para 7th Level, donde particip en el dearrollo de la serie de juegos educativos para nios de Lil Howie. Actualmente John trabaja en Ensemble, Inc. (Dallas, Texas), donde utiliza Delphi para crear aplicaciones cliente-servidor corporativas para clientes Fortune 500. Forma parte de la Junta de Directores del Grupo de Usuarios de Delphi de Dallas y contribuye regularmente a las publicaciones del grupo. Ha desarrollado numerosos componentes y utilidades shareware para Delphi, y escribe regularmente artculos para la revista Delphi Informant, incluyendo el artculo principal de la edicin de Febrero de 1997.

Dave Bowden es el director general de DemoShield Corporation (una divisin de InstallShield Corpo ration) donde se encarga del diseo y desarrollo del producto, ventas domsticas e internacionales, y alianzas comerciales estratgicas. Bowden tiene ms de diez aos de experiencia en el diseo y desarrollo de software, en reas como la programacin grfica y multimedia, el tratamiento digital de imgenes y el diseo de interfaces de usuario.

Larry Diehl es ingeniero de control de calidad en InstallShield Corporation, donde no slo es responsable de verificar la correccin del software, sino que adems ayuda en los aspectos relacionados con la comunicacin y gua al usuario en lo necesario para llevar al mercado aplicaciones lderes que satisfagan las necesidades de los usuarios de todo el mundo. En el transcurso de quince aos, Diehl ha utilizado varios lenguajes de programacin, pero actualmente utiliza exclusivamente Delphi para desarrollar tanto

las utilidades que su trabajo le exige como las aplicaciones shareware que desarrolla en su tiempo libre.

Phil Dorcas obtuvo el grado de Master en Ciencias Fsicas de Texas Tech en 1969, y desde entonces ha estado relacionado con la ingeniera elctrica y la programacin. Fue co-propietario y director de la segunda tienda de productos informticos de Texas. Ha trabajado como consultor y diseador de numerosos proyectos de hardware y software. Es autor de diversos textos de informtica que se utilizan en los colegios de Texas, y ha escrito columnas regulares en revistas. Phil ha utilizado Turbo Pascal desde su primera versin para CP/M, y ahora Delphi es su herramienta de desarrollo favorita.

Kenneth Harrison es responsable de desarrollo de Stream International. En su puesto actual disea y desarrolla aplicaciones en Delphi, Visual Basic y Access para optimizar el funcionamiento del centro de soporte tcnico. Ha estado trabajando en el campo de la informtica durante los ltimos diez aos. Kenneth es el webmaster del Grupo de Usuarios de Delphi de Dallas.

Rod Mathes ha estado programando en lenguajes tan diversos como Cobol, RPGII, dBase, RBase, Pascal y C++ durante los ltimos doce aos. Actualmente es programador de Delphi para Stream International, creando una amplia gama de productos para su uso interno. Es uno de los miembros de la Junta de Directores del Grupo de Usuarios de Delphi de Dallas.

Ovais Reza trabaja como analista/programador en First American. Es un programador experimentado en C/C++ y Delphi, graduado de la Western Michigan University y miembro activo del Grupo de Usuarios de Delphi de Dallas. Adems de la programacin y la filosofa oriental, Ovais es aficionado a Los Simpsons y los episodios viejos de Star Trek. Recientemente ha comenzado a prepararse para obtener un doctorado en redes neuronales.

Mike Tobin ha estado programando en Delphi desde la versin 1.0. Mike comenz estudios de criminalstica, pero al darse cuenta de que prefera ser un hacker, los abandon para entrar en la industria del software. Actualmente es ingeniero de sistemas para American General en Dallas y es Director de Comunicaciones del Grupo de Usuarios de Delphi de Dallas. Le gusta disfrutar de su tiempo libre en compaa de su novia Lisa y de sus cuatro gatos, Elisabeth, Alexander, Einstein y Copernicus.

El trabajo en equipo. Este concepto nos lleva a pensar en otros conceptos abstractos como victoria, cumplimiento o conquista. El trabajo en equipo es el ingrediente secreto detrs de innumerables triunfos a travs de la historia, y as ha sido en el caso de este libro. Los ocho autores hemos puesto muchas horas largas y duras en este proyecto, pero ste no podra haber llegado a buen final sin la ayuda y generosidad de muchas otras personas. Para dar crdito a aquellos que merecen mucho ms, los autores desean colectivamente agradecer a las siguientes personas por su contribucin al libro: Marian Broussard, nuestra redactora. Incansable, nos indic todos los errores gramaticales y ayud a corregir diversas inconsistencias en el libro. Sin escatimar su tiempo, contribuy voluntariamente a ayudar a un grupo de escritores noveles a llevar de forma clara y correcta sus ideas al papel. Joe Hecht, nuestro mentor e dolo. Joe siempre respondi amablemente a todas las preguntas que le hicimos, hurg en nuestro cdigo y seal nuestros errores cuando tenamos problemas, y nos indic la direccin correcta cuando la documentacin de Microsoft era algo confusa. Jim Hill y todos los amigos de Wordware Publishing, que se arriesgaron con un grupo de escritores entusiastas aunque sin experiencia. Jim nos puso al tanto de todos los detalles, nos indic el camino a seguir, y hasta nos llev a comer a todos peridicamente. Marci Ayres, que verific gran cantidad de cdigo, conversin de formato de imgenes, formateo de documentos y otras labores de soporte. Lisa Tobin, que realiz tareas adicionales de verificacin. Por supuesto, los agradecimientos no estaran completos sin mencionar al equipo de desarrollo de Delphi de Inprise Corp., por ofrecernos tan maravilloso entorno de desarrollo. Finalmente, John Ayres quisiera dar las gracias a todo el equipo encargado de teclear y pulir los detalles, haciendo sacrificios y ayudando a crear un producto del que todos nos sentimos muy orgullosos; a Rusty Cornet por engancharme a ese entorno de desarrollo llamado Delphi; a Deb bie Vilbig y a Darla Corley, por darme el tiempo necesario para poder aprender Delphi y crear un sistema de respuesta de llamadas cuando tena que haber estado haciendo mi trabajo habitual; a Sarah Miles, por proporcionarme un prstamo a bajo inters que me permiti comprar la mquina con la que est escrito este libro; y a Suzy Weaver & Brian Donahoo por confiar en un antiguo

empleado y proporcionarme un lugar tranquilo y encantador para trabajar los fines de semana.

El API de Windows es la base sobre la cual se implementa la mayora de las aplicaciones modernas. Es el corazn y el alma de las aplicaciones de bases de datos, multimedia, e incluso de muchas aplicaciones para redes. Todas las aplicaciones Windows se apoyan en el API para llevar a cabo desde la tarea ms simple hasta la ms esotrica. Todos los buenos programadores que conozco tienen un conocimiento slido del API de Windows. Es el lenguaje en el que se expresa ms elocuentemente la arquitectura de Windows como sistema operativo, y que guarda los secretos que los programadores necesitan conocer si desean construir aplicaciones potentes y eficientes. Puedo mencionar al menos tres razones por las que cualquier programador serio debe conocer el API de Windows: Es ocasionalmente posible crear una aplicacin robusta sin tener un buen dominio del API de Windows. Sin embargo, llega el momento en el transcurso del desarrollo de la mayora de los proyectos en el que se hace sencillamente imprescindible hacer uso de los recursos del API de Windows para resolver un problema especfico. Usualmente eso se produce porque la herramienta que se est utilizando no ofrece cierta caracterstica o posibilidad que se necesita, o porque la caracterstica no est implementada adecuadamente. En tales casos, se hace necesario utilizar el API de Windows para implementar por s mismo la funcionalidad necesaria. Otra razn para utilizar el API de Windows se hace evidente cuando se desea crear un componente o utilidad que otros puedan luego utilizar. Si Ud. desea crear un componente, control ActiveX o una simple utilidad que pueda ser necesaria a otros desarrolladores, probablemente necesitar utilizar los recursos del API de Windows. Sin recurrir al API de Windows, tales proyectos, por lo general, no pueden ser llevados a cabo. Por ltimo, la tercera y ms convincente razn para aprender el API de Windows es que ese conocimiento le ayudar a comprender cmo debe Ud. disear sus aplicaciones. Hoy por hoy disponemos de muchas herramientas de alto nivel que nos permiten crear proyectos a un nivel de abstraccin muy alto. Sin embargo, todas esas herramientas estn implementadas encima del API de Windows, y es difcil, si no imposible, entender cmo utilizarlas eficazmente sin comprender la arquitectura en la que ellas se apoyan. Si Ud. domina el API de Windows, entonces sabe lo que el sistema operativo puede hacer por Ud., y bajo qu lneas generales se ejecutan esos servicios.

Armado de tales conocimientos, puede utilizar las herramientas de alto nivel a su disposicin de una manera ms juiciosa y efectiva. Me produce especial placer escribir el prlogo para esta serie de libros sobre el API de Windows porque est orientada a su utilizacin desde la mejor herramienta de desarrollo disponible en el mundo: Delphi. Delphi ofrece al programador acceso total al API de Windows. Es una herramienta diseada para permitir el uso de todas aquellas posibilidades que han hecho de Windows el sistema operativo predominante en el mundo. Equipado con estos libros sobre el API de Windows y una copia de Delphi, Ud. podr desarrollar cualquier tipo de aplicacin que desee, y estar seguro de que la est desarrollando de una manera ptima. Ningn otro compilador puede llevarle ms cerca del sistema operativo, ni permitirle explotar al mximo sus posibilidades. Por su parte, estos libros constituyen el puente entre Delphi y el API de Windows. Los lectores podrn utilizarlos para crear las aplicaciones ms potentes soportadas por el sistema operativo. Me quito el sombrero ante los autores, que al crear estos libros han ofrecido un gran servicio a la comunidad de programadores.

Charlie Calvert Director de Relaciones con los Desarrolladores Inprise Corporation.

Ningn otro sistema operativo en la historia ha causado tanta controversia o confusin en la industria del software como Windows. Por supuesto, tampoco ningn otro sistema operativo en la historia ha hecho millonarios a tantos. Nos guste o no, Windows es hoy el sistema operativo predominante. Es difcil ignorar una base de usuarios tan amplia, y cada vez son menos las ofertas de empleo en las que no se exige que el programador tenga conocimientos de la programacin para Windows. En los comienzos, la nica opcin que tena el programador para desarrollar aplicaciones para Windows era C/C++. La era del predominio de este lenguaje nos dej toneladas de documentacin sobre el API de Windows, llenas de informacin abstracta e incompleta, y de ejemplos tan arcaicos y esotricos como el lenguaje C en s mismo. Y entonces apareci Delphi. Con l naci una nueva era de la programacin para Windows, que hizo posible crear aplicaciones complejas en plazos inconcebibles hasta ese momento. Aunque Delphi intenta aislar al programador de la arquitectura de Windows subyacente, los programadores de Delphi se han dado cuenta de que algunos obstculos de programacin no pueden ser salvados sin acudir a las funciones de bajo nivel del API de Windows. Y aunque algunos libros han tocado el tema de la utilizacin del API de Windows desde Delphi, ninguno ha sido dedicado a presentar el tema en profundidad. Por eso surgi la idea de escribir esta serie. Este libro (en unin de los restantes tomos de la serie) constituye un manual de referencia sobre cmo utilizar las funciones del API Win32 desde Delphi. Como tal, no es un libro introductorio acerca de la programacin en Windows o en Delphi, ni tampoco una coleccin de trucos para resolver problemas especficos en Delphi. Hasta la fecha, este libro es la referencia ms completa y exacta del API de Windows para el programador de Delphi. No es una referencia completa, por cuanto el API de Windows incluye miles de funciones que llenaran varios volmenes de mayores dimensiones que el que tiene ahora en sus manos. Sin embargo, cubre las reas ms comunes e importantes del API de Windows. Adicionalmente, todas las funciones que se describen en este libro estn disponibles bajo Windows 95, 98 y NT 4.0, y lo estarn en futuras versiones de Windows.

Este captulo introduce al lector en el tema central de Los Tomos de Delphi: El ncleo del API Win32. Presenta temas y tcnicas generales de programacin para Windows, y explica los detalles relacionados con la utilizacin del API Win32 desde Delphi.

Este captulo describe los requisitos que exige Microsoft para que el logotipo Diseado para Windows pueda ser otorgado a un producto. Se presentan los requisitos segn las categoras de software, y se indican pruebas que pueden ayudar a su aplicacin a pasar el examen de VeriTest.

Crear una ventana es una de las acciones fundamentales de cualquier aplicacin para Windows. Este captulo cubre las funciones de bajo nivel para el registro de clases de ventana y la creacin de ventanas. Los ejemplos muestran tcnicas para crear ventanas y controles utilizando funciones del API, y cmo extender la funcionalidad de los controles de ventana de Delphi.

Windows permite a las aplicaciones comunicarse entre s y con el sistema mediante el uso de mensajes, y este captulo cubre las funciones que se utilizan para manipularlos y enviarlos. En los ejemplos de este captulo encontrar cmo implementar la comunicacin entre procesos mediante mensajes definidos por el usuario, y cmo instalar ganchos de sistema.

El programador puede necesitar consultar en su cdigo los valores de ciertos atributos de una ventana. Este captulo describe las funciones que se utilizan para recuperar informacin acerca de las ventanas, tales como posicin, tamao y atributos. Los ejemplos muestran cmo subclasificar una clase de ventana y cmo cambiar los atributos de una ventana en ejecucin.

Los entornos multitarea permiten que una aplicacin despliegue otras aplicaciones, o incluso otro hilo de ejecucin dentro de s misma. Este captulo cubre las funciones del API para crear y manipular procesos e hilos. En los ejemplos se muestra cmo crear y destruir hilos, cmo lanzar un proceso externo, y cmo utilizar los variados recursos que ofrece el sistema operativo para sincronizar hilos y procesos.

Las libreras de enlace dinmico (DLLs) conforman el ncleo de la arquitectura de Windows, que no podra funcionar sin ellas. Este captulo describe las funciones que

permiten a una aplicacin cargar e importar funciones de una DLL. Se presentan ejemplos de cmo cargar dinmicamente una DLL, o de cmo ofrecer un punto de entrada definido por el usuario para una DLL.

Las aplicaciones bien diseadas necesitan almacenar informacin acerca del estado de la aplicacin en la ltima sesin de trabajo y otros datos persistentes. Este captulo describe las funciones del API para manipular el registro de Windows y los ficheros INI.

Slo las aplicaciones ms sencillas no necesitan reservar memoria dinmicamente. Este captulo describe la gestin de la memoria bajo Windows y las funciones que ofrece el API para reservar y liberar memoria virtual y de sistema. Los ejemplos muestran cmo utilizar las funciones de gestin de heaps, cmo reservar bloques de memoria virtual u obtener informacin sobre el estado de la memoria.

La capacidad de compartir informacin entre aplicaciones mediante cortar y pegar es una expectativa natural de los usuarios de Windows. Este captulo cubre las funciones que se utilizan para manipular y visualizar el contenido del portapapeles.

Sin la posibilidad de recibir entrada del usuario, la mayora de las aplicaciones seran prcticamente intiles. Este captulo cubre las funciones que se utilizan para recibir entrada del usuario a travs del teclado, el ratn y la palanca de juegos.

La mayora de las aplicaciones necesitan leer y escribir informacin en dispositivos de almacenamiento externo. Este captulo cubre las funciones que se utilizan para manipular ficheros en disco y mapeados en memoria. Los ejemplos muestran cmo crear ficheros, manipular sus atributos, leer y escribir a bajo nivel, o realizar bsquedas de ficheros.

Todas las aplicaciones necesitan visualizar informacin, usualmente en forma de cadenas de caracteres. Este captulo cubre las funciones de manipulacin de cadenas (incluyendo las funciones de formato), y las funciones que ofrece el API para crear y eliminar tomos globales.

Frecuentemente es til recuperar informacin especfica acerca del sistema o del hardware sobre el que una aplicacin est ejecutndose. Este captulo describe las funciones que permiten consultar esa informacin al sistema. Los ejemplos muestran

cmo recuperar informacin sobre el sistema operativo, o recuperar y modificar parmetros del sistema.

Este captulo describe las funciones que ofrece el API de Windows para crear y eliminar temporizadores. Entre los ejemplos se incluye uno que muestra cmo utilizar el temporizador de alta resolucin para medir el rendimiento del cdigo.

La gestin de los errores es un elemento imprescindible de cualquier proyecto de programacin. Este captulo cubre las funciones que ofrece el API de Windows para la gestin de errores y la depuracin.

A lo largo de todo el libro se hace uso de ciertos convenios de escritura. Por ejemplo, todo el cdigo de los ejemplos aparece en un tipo de letra ms pequeo y de ancho fijo:
function begin end String

Para ser consistentes con otras publicaciones sobre Delphi, los ejemplos utilizan los convenios de escritura de Borland, que incluye el uso de maysculas y minsculas mezclados en los identificadores, minsculas para las palabras claves, y dos espacios de indentacin por cada nivel. Las constantes que aparecen en el cdigo estn en maysculas, como por ejemplo TRUE y FALSE. Note adems que en la misma lnea en que se describe el nombre de una funcin se ofrece el nombre de la unidad en la que la funcin est situada. El nombre de esta unidad deber incluirse en la clusula uses de cualquier mdulo en el que se desee utilizar esta funcin. Sin embargo, la mayora de las funciones de este libro estn declaradas en el fichero Windows.Pas, que es aadido automticamente a las clusulas uses por Delphi.

Las descripciones de las funciones del API de Windows han sido colocadas de modo que se ofrezca una cantidad de informacin creciente al lector. Esto debe permitir al lector dar un vistazo rpido para ver la descripcin de la funcin y el significado de sus parmetros, o continuar leyendo la explicacin detallada de la funcin, un ejemplo de su utilizacin, y los valores aceptables para los parmetros. Cada descripcin de funcin incluye la sintaxis exacta incluida en el cdigo fuente de Delphi, una descripcin de qu hace la funcin, una descripcin detallada de sus parmetros, el valor que devuelve, una lista de funciones relacionadas con sta, y un

ejemplo de su utilizacin. Las constantes que se utilizan en los parmetros de la funcin se describen en tablas situadas a continuacin del ejemplo. Aunque todo libro llega al punto en el que los autores escriben cdigo sin probar para cumplir con los plazos de entrega, los autores no queran que los ejemplos sufrieran por las limitaciones de tiempo. Los autores han hecho un gran esfuerzo para asegurarse de que todos los ejemplos de cdigo que acompaan al libro funcionan, y de que el cdigo que se muestra en el libro es copia fiel del cdigo final del ejemplo. Sin embargo, tenga en cuenta que la mayora de los ejemplos se apoyan en botones, cuadros de edicin u otros componentes visuales residentes en formularios, lo cual puede no ser evidente en algunos listados. Cuando tenga dudas, consulte el cdigo fuente.

Aunque cada libro llega a un punto donde los autores estn enloquecidos, revisando constantemente en busca de errores antes de la fecha lmite de publicacin, los autores de este libro no han querido que el cdigo fuente de los ejemplos sufriera debido a las limitaciones de tiempo. A diferencia de otros libros, queremos estar seguros de que el cdigo fuente funcionar correctamente en todas las situaciones. Por ello, los autores han realizado un esfuerzo adicional para asegurarse de que el cdigo fuente es correcto. Adems en Danysoft hemos puesto en el siguiente rea de nuestra Web : http://editorial.danysoft.com , informacin de los libros publicados y un enlace para que capture el cdigo fuente completo, totalmente actualizado y corregido ante posibles cambios (ms informacin en el Apndice B, pgina 793).

Debido al estilo de manual de referencia, y la ausencia de explicaciones para principiantes acerca de la programacin para Windows o Delphi, este libro est indicado para programadores con cierta experiencia de trabajo en Delphi y conocimientos bsicos sobre la programacin para Windows. Ello no quiere decir que un programador principiante en Delphi no obtendr beneficios de la lectura de este libro; los ejemplos ampliamente documentados deben ofrecer suficientes explicaciones incluso al ms nefito programador de Delphi. Como cualquier manual de referencia, este libro no est hecho para ser ledo secuencialmente. Sin embargo, los captulos han sido dispuestos en orden creciente de complejidad, comenzando por las funciones ms bsicas del API de Windows y avanzando progresivamente hacia las ms complejas. Si est Ud. buscando una introduccin a la programacin en Delphi, o un tutorial para aprender paso a paso la programacin bajo Windows, hay otros buenos libros que pueden ayudarle a empezar. Si debe resolver un problema difcil y su nica esperanza es el API de Windows, si desea extender la funcionalidad de los componentes y objetos de Delphi, o si desea acceder a una buena coleccin de ejemplos de programacin con el API Win32 desde Delphi, entonces este libro es para Ud. No encontrar una gua

ms completa y exacta acerca de la utilizacin del API de Windows para el programador de Delphi.

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 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.

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 los 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.

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, como 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.

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.

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 como 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.

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 Delphi 1. Para importar esa funcin y poder utilizarla en una aplicacin, bastara con declararla como:
function stdcall implementation function external name

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.

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

De hecho, no lo estaba en la versin de Windows.PAS incluida en Delphi 3. Esta omisin fue corregida en Delphi 4.

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. Como 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.

Otro concepto muy importante de la programacin Windows es el de funcin de respuesta (callback function). 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 como: EnumWindowsProc( hWnd: HWND; lParam: 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 EnumWindows. 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 stdcall

Este poderoso mecanismo de software permite en muchos casos que una aplicacin recupere informacin sobre el sistema que es almacenada slo internamente por

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.

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 especifica 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 especifica 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.

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 caracter Unicode ocupa 16 bits, lo que

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 funciones 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 pasadas a la funcin, por lo que el texto de este libro describir de forma adecuada el comportamiento de la versin Unicode de las funciones.

El diseo del software y la experiencia humana no existan en los albores de la industria del software. En aquellos tiempos, las aplicaciones interactuaban con los usuarios a travs de lneas de comandos y seales externas. Los datos se presentaban en formatos ambiguos, que frecuentemente confundan a los usuarios y hacan del uso de un ordenador una experiencia difcil y frustrante. Estos mtodos de presentacin y representacin de los datos cambiaron a finales de los aos 70, cuando la Divisin de Desarrollo de Xerox en el Centro de Investigacin de Palo Alto cre el sistema Star. Este nuevo entorno operativo marc el inicio de una nueva generacin en el diseo de software y de interfaces de usuario. Sus innovaciones en forma de ventanas, iconos y mens abrieron el camino a los sistemas operativos de hoy. El diseo de software se ha descrito frecuentemente como un proceso similar al diseo arquitectnico, donde el diseador trabaja dentro de un entorno bien definido para ofrecer una solucin que sea agradable, interesante y fcil de utilizar para las personas que interacten con ella. En 1991 la revista Dr. Dobbs Journal public el artculo Manifiesto del Diseo de Software de Mitchell Kapor, en el que el autor indicaba que el diseo del software y de la interaccin con el usuario es el mayor problema de la industria del software. Al sugerir que hace falta algo ms que ser un buen programador para crear buen software, Kapor sent las pautas de desarrollo de una nueva industria de diseo de software y describi las tcnicas y metodologas que deban ser enseadas e implementadas en todo buen diseo de software. Un buen ejemplo de aplicacin de esta metodologa pudo apreciarse en los ordenadores y el sistema operativo de Apple Macintosh. Los diseadores de Apple sentaron una base muy slida de requisitos, herramientas y entornos de desarrollo para crear software para los Macintosh. Como resultado, los usuarios se dieron cuenta de que si aprendan a utilizar una aplicacin, el aprender a utilizar otras se haca mucho ms sencillo. El usuario poda contar con descubrir experiencias similares en cualquier aplicacin. Tales estndares resultaron en costes ms bajos de preparacin y mejores curvas de aprendizaje, y realmente elevaron al ordenador hacia nuevos niveles de eficiencia y productividad. En 1981 Microsoft (con los mismos objetivos en mente)

comenz el desarrollo del Interface Manager, posteriormente renombrado como Microsoft Windows. Esta primera versin mejorada del sistema operativo DOS incluy mens al estilo de Multiplan y Word en la parte inferior de la pantalla. Despus de mucho debate, en 1982 el aadido al sistema operativo evolucion hasta incluir un sistema de mens desplegables y dilogos que emulaban la apariencia del sistema implementado haca diez aos en Xerox Star. En noviembre de 1985 Microsoft Windows versin 1.0 se puso a disposicin del pblico como un aadido opcional para los sistemas basados en DOS. Aunque la versin 1.0 estaba muy lejos de lo que son hoy Windows 98 y Windows NT, prepar la escena para lo que vendra despus. Al aumentar la complejidad del sistema operativo, la necesidad de lineamientos de desarrollo ms precisos se hizo evidente. Fue entonces cuando Microsoft cre los programas de obtencin de logotipos para los diferentes sistemas operativos. Estos programas, que comenzaron a funcionar en 1994, fueron diseados de forma muy similar a la que propona Mitchell Kapor en su manifiesto; su objetivo es guiar a los desarrolladores de aplicaciones, de la misma forma que las guas de construccin orientan a los arquitectos e ingenieros en la creacin de un edificio. Con todo esto en mente, es importante considerar que el Programa de Logotipos de Microsoft es percibido de dos maneras muy diferentes, una segn el punto de vista del desarrollador y la otra, segn el punto de vista del consumidor. Para el desarrollador, el logotipo Diseado para Windows supuestamente debe ayudar a los consumidores a identificar los productos que han sido creados pensando en el sistema operativo y la facilidad de uso en mente. Al promover estos patrones de desarrollo, Microsoft asegura al consumidor un cierto grado de funcionalidad, un alto nivel de integracin con el sistema operativo, acceso fcil a todas las caractersticas, y la personalizacin sencilla de los elementos de interfaz, tanto para los usuarios con deficiencias fsicas o visuales, como para los usuarios que simplemente tienen gustos especiales. En la mente del consumidor, el logotipo de Microsoft en un producto de software se percibe como una especie de sello de aprobacin o confirmacin de la calidad del producto. Los Laboratorios Underwriters, Consumers Digest, PC Magazine, Windows Magazine y otras publicaciones existen para dar al consumidor la tranquilidad necesaria en relacin con sus compras de hardware y software. Cuando el consumidor ve esos logotipos en un producto, concluye con toda la razn que una organizacin profesional ha probado el producto en cuestin y ha verificado que funciona de la manera esperada. Lo mismo es aplicable al logotipo Diseado para Windows. An cuando los consumidores tienden a pensar en el logotipo como en una aprobacin del producto individual, lo cierto es que tanto Microsoft como VeriTest abiertamente sealan que el logotipo es nicamente un indicador de que el producto ha pasado las pruebas a las que se ha sometido y que tiene todas las caractersticas necesarias para disponer del logotipo. La prueba como tal no es un control de calidad ni una confirmacin de la calidad del producto. Antes de comenzar el desarrollo de cualquier producto de software, debe llevarse a cabo una cierta planificacin previa. Durante esta etapa de diseo esquemtico, los equipos de desarrollo, marketing y gestin del proyecto deben reunirse y decidir

exactamente qu beneficios y limitaciones pueden asociarse al desarrollo de una aplicacin que pueda optar a la obtencin del logotipo de Windows. Algunas de las preguntas que deben responderse en esta fase son: Nos ayudar el logotipo a vender ms software?. Son las caractersticas exigidas por Microsoft importantes para nuestros usuarios?. Cules son los costes financieros y temporales asociados a la adicin de caractersticas que permitan optar al logotipo?. Es imprescindible disponer del logotipo para garantizar el xito del producto?. Ofrece nuestra competencia aplicaciones que llevan el logotipo?. Durante el proceso de respuesta a estas preguntas es posible detectar que algunos de los criterios para la obtencin del logotipo no son aplicables o no ayudaran a mejorar un producto individual. Sabiendo esto de antemano, es importante identificar en una fase temprana del desarrollo el mercado potencial del producto y determinar si el logotipo beneficiar las ventas y la promocin del producto. Una buena regla a tener en cuenta es que si el producto va a ponerse a disposicin del pblico en tiendas de venta directa o si se va a hacer una amplia campaa de publicidad, es conveniente tener el logotipo. Esta afirmacin se basa en estudios sobre consumidores que indican que, cuando a stos se les ofrece la oportunidad de elegir entre dos productos similares, el producto que dispone del logotipo es elegido con mayor frecuencia. Este no es el caso necesariamente para productos que van a distribuirse a travs de canales no asociados a la venta directa. Es fcil darse cuenta de que, al considerar todos estos elementos, los equipos de desarrollo, marketing y gestin del proyecto debern decidir si llevar el logotipo tendr un beneficio econmico que justifique el esfuerzo, tiempo y gastos adicionales relacionados con dotar al producto de las caractersticas necesarias para optar por el logotipo. Lo importante es darse cuenta de que este programa no es algo en lo que obligatoriamente toda empresa creadora de software deba involucrarse. Los desarrolladores deben asegurarse de que los directores de marketing, gestores de proyectos y personal de direccin en general sepan en qu se estn metiendo al hacerse cargo de los requisitos adicionales que el logotipo supone. Hay numerosos ejemplos de aplicaciones existentes hoy que no tienen relacin alguna con el logotipo Diseado para Windows. Antes de tomar una decisin, debern leerse detenidamente las excepciones y clusulas de exencin mencionadas en el manual para la creacin de aplicaciones compatibles con el logotipo, para ver qu implicaciones pueden tener estos nuevos requisitos para el desarrollo del producto. Para facilitar el funcionamiento de su Programa de Logotipos, Microsoft solicit ayuda a VeriTest, lder de la industria desde hace mucho tiempo en la evaluacin y verificacin imparcial del software. VeriTest, apoyndose en el manual Microsofts Logo Handbook for Software Applications, verifica cada aplicacin que recibe en base a los criterios asociados a cada categora de productos especfica. Una vez que el producto es analizado, los resultados son enviados al desarrollador, bien con una

evaluacin satisfactoria o con una lista de reas en las que el producto no cumple con los requisitos, de modo que el equipo de desarrollo haga los cambios pertinentes y vuelva a enviar de nuevo el producto para su verificacin. Este captulo no es una reconstruccin total del documento de Microsoft para obtener un logotipo para Windows NT o Windows 95/98. Es una simple gua destinada a informar a los desarrolladores sobre los requisitos para obtener el logotipo e indicar algunas consideraciones especiales que debern tenerse en cuenta antes de darse a la tarea de obtener el logotipo de Microsoft. Este captulo cubre algunos de los requisitos para acceder a las pruebas, y profundiza en los temas relacionados con la integracin del producto con el sistema operativo, la instalacin del producto, la ayuda al usuario, y las consideraciones de diseo de la aplicacin y su interfaz de usuario. Aunque mucha de la informacin que aqu ofrecemos es una extensin del documento original de Microsoft, no tiene como objetivo sustituirlo. Para obtener informacin ms detallada acerca de los logotipos Diseado para Windows, dirjase a la pgina web de VeriTest en: http://www.veritest.com Este sitio contiene el documento oficial Logo Handbook for Software Applications, as como informacin adicional en relacin con los diferentes tipos de logotipo y cmo obtenerlos. De inters especial en este sitio son las diez causas ms comunes de que una aplicacin no satisfaga las pruebas de compatibilidad. Revise este documento, ya que contiene elementos importantes a tener en cuenta antes de enviar formalmente una aplicacin para su revisin. En este captulo nos concentraremos fundamentalmente en las exigencias del programa Diseado para Windows para las aplicaciones comerciales de escritorio.

Para obtener el logotipo para un producto deber seguir un conjunto de pasos. El primero y ms importante es el de revisar los criterios descritos en el manual antes de enviar la aplicacin para su prueba. De esta forma, cualquier problema potencial puede resolverse incluso antes de la solicitud formal. Una vez que el equipo de desarrollo considera que el producto es compatible con el logotipo, deber realizar una pre-evaluacin de la aplicacin utilizando el Installation Analyzer que suministra VeriTest y puede descargarse gratuitamente desde su sitio web. Esta herramienta ha sido diseada para ofrecer a los equipos de desarrollo alguna ayuda a la hora de identificar problemas potenciales relacionados con el registro de Windows, la instalacin y desinstalacin del software, y los ficheros INI de Windows y del sistema. Una vez que las pruebas iniciales han sido superadas, quedan tres procesos burocrticos para concluir el proceso de envo. Estos son: 1. Rellenar los Acuerdos de Licencia: Rellene apropiadamente los Acuerdos de Licencia de Microsoft y el Acuerdo de Verificacin de VeriTest. Estos documentos debern ser enviados apropiadamente cumplimentados junto al producto a verificar.

2. Completar el cuestionario en lnea de VeriTest: VeriTest tiene un cuestionario en lnea que deber ser rellenado antes de enviar la aplicacin.

Este cuestionario es muy importante. En este cuestionario es donde se debern sealar las caractersticas especiales de la aplicacin que se enviar. Mientras ms informacin se ofrezca, mejor y ms rpidamente ser verificado el producto. 3. Envo del producto: Enve la aplicacin y toda su documentacin a VeriTest para su verificacin formal. El envo deber constar de lo siguiente: 1. La aplicacin a certificar. 2. Resultados de las pruebas preliminares. 3. Acuerdo de Verificacin de VeriTest. 4. Acuerdos de Licencia de Logotipo de Windows NT y Windows 95/98. 5. Un cheque a nombre de VeriTest para las pruebas iniciales. La tarifa es (en el momento de la impresin de este libro) de $950, con un cargo adicional de $300 para pruebas adicionales en nuevas versiones del producto. Las tarifas varan dependiendo del tipo de logotipo. Para una informacin ms actualizada, consulte el sitio web de VeriTest. Para obtener el logotipo para un producto se imponen una serie de requisitos muy estrictos que la aplicacin deber satisfacer. Los criterios van desde que la aplicacin sea un ejecutable de 32 bits hasta la inclusin de tecnologa OLE. Es importante destacar que no todas las aplicaciones se chequearn segn los mismos criterios, sino que stos dependen de la categora a la que la aplicacin pertenece. A continuacin se enumeran las diferentes categoras de productos, con una breve descripcin de cada una.

Apl. Basadas en Ficheros

Apl. no Basadas en Ficheros

Utilidades

El ncleo de la funcionalidad de estos productos est asociado a la creacin, manipulacin y almacenamiento de ficheros. Ejemplo: Microsoft Word El ncleo de la funcionalidad de estos productos NO est asociado a la creacin, manipulacin y almacenamiento de ficheros. Estas aplicaciones estn exentas de cumplir los requisitos relacionados con OLE, el convenio universal de nombres (UNC) y los nombres de fichero largos. Ejemplo: Navegador de Internet Las utilidades son aplicaciones que realizan tareas muy especficas no relacionadas con la creacin, edicin y almacenamiento de ficheros. Estas aplicaciones debern ofrecer alguna funcionalidad

adicional tanto a Windows 95/98 como a Windows NT para optar por el logotipo. Ejemplo: Scandisk o WinSight Herramientas de Desarrollo Las herramientas de desarrollo son aquellas aplicaciones que producen ficheros ejecutables a partir de un lenguaje interpretado o compilado. Las herramientas de desarrollo debern ser capaces de producir a su vez aplicaciones capaces de pasar las pruebas de compatibilidad. Ejemplo: Delphi o Visual Basic Extensiones (Add-ons) Las extensiones aumentan la funcionalidad de una aplicacin normal, pero no son ejecutables. Estos tipos de productos debern ser utilizados por una aplicacin de 32 bits que ostente el logotipo, y tendrn que ser probadas tanto en unin de su aplicacin matriz como por separado. Ejemplo: Asistentes, Plantillas y Macros

Las extensiones pueden ser distribuidas bien como parte del programa que ellas extienden o de forma independiente. No tienen que ser ficheros EXE para pertenecer a esta categora. Suites de Aplicaciones Las suites de aplicaciones son colecciones de aplicaciones que se utilizan de forma conjunta, o que cuando se utilizan de forma conjunta integran un conjunto de soluciones uniforme. Todas las aplicaciones individuales debern cumplir los requisitos particulares de su categora. Ejemplo: Microsoft Office Programas que involucran grficos interactivos y que son grficamente ricos durante su funcionamiento. Van desde los juegos de vdeo hasta las herramientas de desarrollo multimedia. Ejemplo: DemoShield

Juegos y Multimedia

En ciertos casos Microsoft puede colocar a la aplicacin en una categora diferente, cambiando por tanto los criterios segn los que la aplicacin es probada. Estos cambios dependen de las circunstancias que rodean a la aplicacin en cuestin, en qu parte del test la aplicacin est fallando, y si esa caracterstica puede no ser tomada en cuenta dada la poca importancia o significado que tiene para la aplicacin concreta.

Despus que un producto ha sido enviado a VeriTest para su verificacin, ser sometido a un test integral diseado para esa categora de productos. En general esta prueba cubre las siguientes reas: Fiabilidad del producto

Experiencia de usuario Compatibilidad de la aplicacin Dentro de cada una de estas reas hay subcategoras individuales que prueban diferentes elementos de la aplicacin. Cada una de esas subcategoras incluye requisitos o excepciones que pertenecen a los diferentes grupos listados anteriormente. Es importante determinar estos requisitos o exenciones en una fase temprana del desarrollo, de modo que no se utilicen de forma ineficiente esfuerzos y tiempo de desarrollo.

Para ayudar al desarrollador a prevenir tales fallos durante las pruebas del producto, se ofrece una visin ms profunda de algunas de las reas de problemas. Esta informacin no est disponible en el manual de Microsoft y deber ser tenida en cuenta durante la planificacin y el desarrollo del proyecto.

La fiabilidad del producto y los requerimientos bsicos cubren toda una variedad de temas. En general, la aplicacin a ser probada debe ser funcional y estable bajo Windows 95/98 y Windows NT 4.0. Esto significa que cuando VeriTest ejecute la aplicacin, sta no se cuelgue o cause excepciones o fallos en el sistema operativo. Esta parte de la prueba tambin incluye requisitos bsicos a la aplicacin que tienen que ver con la naturaleza compilada de la aplicacin y sus DLL dependientes, y con la distribucin del producto. Requisito de 32 Bits: La aplicacin debe ser un ejecutable de 32 bits creado con un compilador de 32 bits. Debe ser un ejecutable portable del tipo PE_Win32. Hay algunas excepciones a esta regla, generalmente aplicables a sistemas heredados y que requieren la compatibilidad hacia atrs. Todas las partes EXE y DLL ms importantes de la aplicacin debern ser de 32 bits. Slo se admiten DLLs de soporte que sean de 16 bits si no existe su equivalente de 32 bits, o si stas no constituyen una parte importante de la aplicacin ni incluyen las funciones primordiales de la aplicacin.

Para probar apropiadamente la capacidad de una aplicacin para funcionar bajo un sistema operativo congestionado, se recomienda que el desarrollador utilice la aplicacin Stress, situada en el SDK Win32. Para determinar si la aplicacin funciona correctamente, ejecute Stress y luego active todas las funciones de su aplicacin de un modo normal. Anote los resultados anormales e intente diagnosticar el problema despus de verificar que la aplicacin funciona correctamente si el sistema no est sobrecargado.

Otras pruebas que deben realizarse antes de enviar a una aplicacin a VeriTest son: 1. Cambio de modo de vdeo mientras la aplicacin est ejecutndose. 2. Impresin y todas las funciones de E/S. 3. Funcionamiento mientras aplicaciones de 16 y 32 bits estn ejecutndose simultneamente. 4. En Windows 98 solamente, ejecute la utilidad de informacin de sistema situada en el CD para verificar los recursos disponibles antes y despus de ejecutar la aplicacin. Con ello se puede detectar si la aplicacin causa algn tipo de goteo de memoria. En Windows NT, utilice el Monitor del sistema para verificar cualquier comportamiento anormal.

Distribucin del producto: El requisito de distribucin tiene que ver con el software incluido en el disco de instalacin del producto. En estos das es comn al comprar una aplicacin de 32 bits, encontrar una versin de 16 en el mismo soporte. Si ese es el caso, el requisito es que el programa de instalacin informe al usuario que existen dos versiones del software en el disco, y que ms adelante informe qu versin se est tratando de instalar. Si por casualidad el usuario elige instalar la versin de 16 bits, el programa de instalacin deber informar que la versin que se est instalando no es compatible con el logotipo, o que funcionar bajo el entorno, pero no ha sido diseada para l. La instalacin del producto se discute con ms profundidad en la seccin Experiencia de Usuario. En el caso de que el soporte de la instalacin contenga una suite de aplicaciones, todas ellas debern haber obtenido el logotipo antes para que la caja que las contiene lo lleve. Esto significa que todas las aplicaciones del paquete debern ser capaces de pasar el examen de compatibilidad en su respectiva categora de productos. Si una aplicacin no pasa las pruebas, el logotipo ser denegado para la suite hasta que los problemas con esa aplicacin concreta hayan sido resueltos, o la aplicacin sea eliminada de la suite. Aqu se incluyen los casos de demos de productos o versiones limitadas de aplicaciones.

Bajo el nombre Experiencia de usuario se agrupa un conjunto de pruebas, pertenecientes a cuatro subcategoras, que cubren: instalacin de la aplicacin, desinstalacin, interfaz de usuario/shell, y Convenio Universal de Nombres (UNC) y nombres de fichero largos. El objetivo de estas pruebas es el de garantizar que el software pueda ser utilizado por cualquier usuario, y que se ofrecen a ste las opciones y parmetros necesarios para hacer agradable su experiencia de utilizacin del producto.

Instalacin del software: En la categora de experiencia de usuario se incluye una gran cantidad de informacin relacionada con la instalacin del software y la funcionalidad que debe estar disponible al usuario durante la instalacin. Aunque existen diversas herramientas para la generacin de instalaciones compatibles con el logotipo, muchos desarrolladores no se toman el trabajo de investigar los requisitos de instalacin, y por ello sus aplicaciones fallan en esta parte del test. Por lo tanto, la instalacin del software es analizada en detalle para asegurar que todas las opciones sean cubiertas, y de que adems se cumplen algunos lineamientos gen erales para producir mejores instalaciones de software. Un objetivo de una buena instalacin es el de implantar la aplicacin en el ordenador del usuario, ofrecindole las indicaciones, preguntas e informacin adecuadas para que el software sea directamente utilizable al finalizar la instalacin. El otro objetivo de una buena instalacin es el de distribuir los ficheros de una manera organizada, de modo que el usuario pueda localizarlos rpida y fcilmente. Finalmente, una buena instalacin configurar e instalar todos los ficheros de soporte necesarios para que la aplicacin funcione y reduzca la redundancia entre ficheros comunes, de modo que el software sea ms fcil de actualizar y mantener.

Existen varias aplicaciones en el mercado para asistir al desarrollador en el proceso de creacin de instalaciones. Varios ejemplos de tales aplicaciones se ofrecen en el CD que acompaa al libro. Todas ellas son capaces de producir instalaciones compatibles con el logotipo.

Requisitos de instalacin: Interfaz: El programa de instalacin deber ofrecer al usuario final una interfaz grfica para seleccionar las opciones de instalacin y rutas de destino de los ficheros necesarias para una instalacin correcta del software. Gua de Instalacin: El programa de instalacin deber llevar al usuario a travs del proceso de instalacin u ofrecer un mecanismo que permita que la instalacin se produzca en modo desatendido. Indicar al usuario copiar los ficheros y luego descomprimirlos no garantiza el cumplimiento de este requisito. Para cumplir con este requisito el programa de instalacin deber ofrecer una respuesta por defecto para cada una de las preguntas de la instalacin, de forma que el usuario pueda simplemente aceptar los valores por defecto e instalar la aplicacin correctamente. Aunque no son obligatorios, a continuacin mencionamos algunos otros detalles de diseo que el desarrollador deber tener en consideracin al crear una buena instalacin.

Al disear una instalacin deber ofrecerse la posibilidad de seleccionar el tipo de instalacin deseado por el usuario. Los tipos de instalacin comunes son: Tpica: Esta instalacin implantar los ficheros y opciones comunes, con sus valores implcitos. Este tipo de instalacin copiar nicamente los ficheros ms comunes para el funcionamiento de la aplicacin, y deber ser el tipo de instalacin por defecto. Compacta: La instalacin compacta slo copiar los ficheros imprescindibles para que la aplicacin funcione. Esta opcin se ofrece para aquellos usuarios con una cantidad limitada de espacio disponible en disco o que utilicen equipos porttiles. Personalizada: La instalacin personalizada se disea para los usuarios avanzados que deseen tener un control total sobre las opciones y posibilidades que se instalarn de la aplicacin. Esta opcin deber permitir que el usuario especifique la localizacin de los ficheros, la configuracin de los parmetros, y qu caractersticas se instalarn. CD-ROM: La instalacin de CD-ROM se parece mucho a la Compacta, siendo la diferencia que el usuario instalar solamente los ficheros imprescindibles para que la aplicacin funcione, pero mantendr la posibilidad de acceder a los restantes ficheros, situados en el CD, durante la ejecucin de la aplicacin. Otras caractersticas adicionales que permiten lograr una instalacin ms amigable son: 1. Informacin sobre los recursos de sistema necesarios y los disponibles antes de la instalacin. 2. Ofrecer indicaciones visuales o auditivas durante la instalacin que alerten al usuario sobre cualquier problema o del simple hecho de que necesita insertar un nuevo disco. 3. Ofrecer soporte para los convenios de nombres UNC. 4. Ofrecer un mecanismo para detener el proceso de instalacin. Si est Ud. creando su propio programa de instalacin con Delphi, los siguientes fragmentos de cdigo muestran cmo obtener la cantidad de espacio libre en una unidad de disco. Espacio disponible en disco: Para obtener la informacin sobre el espacio libre en una unidad de disco, utilice la funcin del API de Windows GetDiskFreeSpace. Una llamada a esta funcin devuelve el nmero de clusters libres, adems del nmero de sectores por cluster y el de bytes por sector. La cantidad de espacio libre debe calcularse en base a la informacin devuelta por esta funcin. El cdigo est basado en la

existencia de un formulario con un botn y dos etiquetas. Los clculos se efectan cuando el botn es pulsado.
procedure var String

2
begin

div

div end

Otra manera de obtener la misma informacin es acudiendo a la funcin DiskFree. Este cdigo asume que se tiene un formulario con un botn y una etiqueta. El clculo se realiza cuando el botn es pulsado.
procedure var const begin div end

En Delphi 3, la funcin DiskFree slo informaba de forma correcta sobre la cantidad de espacio libre si esta cantidad no sobrepasaba los 2 GB. Deteccin del Sistema Operativo: La instalacin deber automticamente detectar la versin del sistema operativo sobre el que se est instalando la aplicacin, e instalar los ficheros necesarios para el funcionamiento correcto de la aplicacin en dicho entorno.

Existen dos mtodos para obtener la versin del sistema operativo en Delphi. Uno de ellos consiste en utilizar la funcin GetVersionEx del API de Windows. Esta funcin admite un solo parmetro del tipo TOSVersionInfo, que se pasa por referencia. Ese registro contiene toda la informacin sobre la versin del sistema operativo, incluyendo el nmero de versin mayor y menor, nmero de construccin, identificador de plataforma, y descripcin del sistema operativo en uso. El registro TOSVersionInfo se define de la siguiente manera: TOSVersionInfo = record dwOSVersionInfoSize: DWORD; {tamao del registro} dwMajorVersion: DWORD; {nmero mayor de versin} dwMinorVersion: DWORD; {nmero menor de versin} dwBuildNumber: DWORD; {nmero de construccin} dwPlatformId: DWORD; {banderas de plataforma} SzCSDVersion: array[0..127] of AnsiChar; {info adicional} end; Para utilizar esta funcin, inicialice el campo dwOSVersionInfo al tamao del registro, segn se muestra a continuacin:
procedure var begin end

A partir de aqu, presente la informacin devuelta por la llamada al usuario en algn control visual, o simplemente utilice esa informacin para asegurar la instalacin de los ficheros de la aplicacin que sean especficos de una plataforma determinada. Existe una segunda forma de obtener la misma informacin que implica menos trabajo. Como el Programa de Logotipos est diseado nicamente para sistemas operativos y aplicaciones de 32 bits, el registro est presente tanto en la plataforma Win dows 95/98 como en Windows NT 4.0. Por lo tanto, el tipo de sistema operativo puede leerse del registro de sistema. Esto se lleva a cabo mediante el siguiente cdigo:

Debe aadir la unidad Registry a la clusula Uses para que el cdigo compile.
var String

begin

if end

then

Accesos directos: Ninguno de los accesos directos creados por el programa de instalacin deber producir errores del tipo Fichero inexistente o de otro tipo al ser ejecutados. Debern ofrecerse accesos directos para facilitar el acceso a la aplicacin. Un buen sitio para colocar accesos directos es la carpeta de Programas. Para determinar la localizacin de esta carpeta, acceda en el registro del sistema a la subclave Shell Folders bajo la clave: HKEY_CURRENT_USERS\ Software\ Microsoft\Windows\CurrentVersion\Explorer. De esa misma subclave puede obtenerse la informacin de las rutas del men de Inicio, el grupo de Inicio y del Escritorio. Todas ellas son buenas opciones de lugares en los que colocar accesos directos a la aplicacin. Reproduccin automtica: Los productos que se distribuyen en CD-ROM debern hacer uso de la facilidad de reproduccin automtica para arrancar el programa de instalacin u otro programa que gue al usuario durante la instalacin. Adems, el instalador deber - para otros tipos de soporte diferentes del CD-ROM - permitir que el instalador sea lanzado desde la opcin Agregar o quitar programas del Panel de Control de Windows 98/NT.

Danysoft Internacional ofrece un producto llamado DemoShield, que es utilizado por numerosas empresas para crear visualizadores de CDs - aplicaciones grficas que permiten navegar por el software y contenido adicional del CD. Aunque este mtodo de presentacin de los datos no es un requisito obligatorio, constituye una mejora a la experiencia de utilizacin de un software y se est convirtiendo en la norma de distribucin de software.

Para un funcionamiento adecuado de esta caracterstica, deber existir un fichero de nombre Autorun.inf en el directorio raz del CD-ROM. Dentro

de este fichero se colocar una sola clave con el nombre del programa a ser ejecutado de forma automtica. Eso se expresa de la siguiente forma: [autorun] open = <nombreFichero> [autorun] open = <ruta\nombreFichero> <opciones, si se desea> Si no se suministra una ruta lgica, el programa buscar el fichero a ejecutar en el directorio raz del CD-ROM. Con el segundo mtodo, la ruta indicada deber ser relativa a la raz de la unidad de CD-ROM (o sea, sin incluir letra de unidad), y puede incluir opciones para la ejecucin del programa. La reproduccin automtica est pensada como un mecanismo para mejorar la experiencia de utilizacin de un programa haciendo ms fcil el uso del medio de soporte. Es importante al disear aplicaciones que harn uso de esta caracterstica ofrecer una retroalimentacin visual rpida, dado que el hardware sobre el que se ejecuta la instalacin puede ser ms lento de lo que podra preveerse inicialmente. Un buen mtodo de prueba para garantizar esto es disear la aplicacin a ejecutarse automticamente para que responda y se cargue rpidamente desde un CD de doble velocidad (2X). Si el tiempo de carga y presentacin es aceptable en este dispositivo hoy ya obsoleto, entonces ser ms que aceptable en cualquier hardware ms novedoso.

Una retroalimentacin rpida es esencial, debido a la demora asociada normalmente a la activacin de la reproduccin automtica. Si la aplicacin demora mucho en cargar, el usuario podra estar esperando durante cierto tiempo sin indicacin alguna de que el programa est funcionando correctamente.

Directorio por defecto: El programa de instalacin deber ofrecer un directorio de instalacin dentro de unidad:\Archivos de programa como localizacin por defecto de los ficheros de la aplicacin. La manera ms sencilla de localizar este directorio es de nuevo leer un valor del registro del sistema. La subclave a buscar es ProgramFilesDir, situada bajo la clave CurrentVersion en: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Una buena estrategia de instalacin es crear ms de un directorio para la aplicacin y sus ficheros de soporte. Este directorio es para los ficheros que

la aplicacin utilizar, pero a los que el usuario final no acceder directamente. Separar los ficheros facilita el mantenimiento del sistema tanto para el desarrollador como para el usuario final. Cualquier fichero que juegue un papel de soporte para mltiples aplicaciones deber colocarse en el directorio de sistema de Windows. Un buen ejemplo de tales componentes es la librera de tiempo de ejecucin de Visual Basic. La colocacin correcta de tales componentes es crucial. Para gestionar de forma adecuada este proceso es importante verificar si el fichero existe en el directorio de sistema. En caso de que ya exista, se debern comparar las fechas, tamaos de fichero y versin. Siempre pregunte al usuario si desea reemplazar tales ficheros, y ofrzcale la opcin de no instalar ningn fichero que ya exista. Si el nuevo fichero no es ms reciente que el fichero ya presente en el sistema, NO reemplace el fichero ya existente. Si se instalan nuevos ficheros en el directorio de sistema, es una buena idea (aunque no es obligatorio) registrar esos nuevos ficheros en la subclave SharedDLL del registro, bajo la clave HKEY_LOCAL_MACHINE.

Si la aplicacin utiliza componentes de ncleo del sistema definido por Microsoft, el programa de instalacin deber incrementar en uno el contador de referencias de cada componente utilizado. La accin inversa deber efectuarse durante la desinstalacin. Para obtener una lista de los componentes del ncleo, visite el sitio web de VeriTest.

Mejoras/Sugerencias: El proceso de instalacin es la primera impresin que se llevar el usuario de su aplicacin. Por lo tanto, es importante que la instalacin transcurra sin incidencias, permitiendo al usuario tener un control total sobre los cambios que se estn produciendo en su mquina. A continuacin le ofrecemos unas cuantas sugerencias importantes de cara a obtener una instalacin superior. 1. Si la aplicacin deber poder utilizarse en entornos de red, recuerde nombrar sus ficheros segn el convenio estndar de DOS 8+3 (8 caracteres para el nombre, 3 para la extensin), de forma que esos ficheros puedan ser fcilmente compartidos en redes que no soporten nombres largos de fichero. Evite utilizar ficheros INI en las aplicaciones que se instalan. El registro de Windows es un mecanismo muy superior para almacenar las opciones seleccionadas por el usuario. Adems, el registro est diseado para ser accedido a travs de una conexin de red, lo que

2.

facilita el mantenimiento del software y evita tener que estar buscando ficheros INI. 3. 4. 5. Antes de crear accesos directos, informe al usuario y permtale decidir si desea crearlos o no y dnde. Las instalaciones deben soportar el Convenio Universal de Nombres (UNC). Utilice el registro para almacenar informacin relativa a la aplicacin y a los ficheros de los que sta depende, y recuperar informacin sobre el sistema y sus dispositivos. Los posibles usos del registro incluyen: Informacin de estado del programa: Coloque aqu cualquier informacin que anteriormente se almacenaba en ficheros INI: el estado de las ventanas del programa, su situacin en pantalla e informacin sobre la versin del producto. Claves primarias: SubClave: HKEY_LOCAL_MACHINE y HKEY_CURRENT_USER Software

Informacin especfica del ordenador: Estas subclaves se ofrecen como sitio para almacenar y recuperar informacin de configuracin del sistema como la resolucin de pantalla, la versin de Windows, o el estado del salvapantallas. Claves primarias: SubClave: HKEY_LOCAL_MACHINE Hardware, Config y Network

Informacin especfica del usuario: Estas subclaves son el lugar donde se coloca la informacin del sistema y cualquier informacin sobre el hardware para un acceso sencillo a ella desde la aplicacin. Claves primarias: SubClave: HKEY_CURRENT_USER Hardware, Config y Network

Informacin sobre la ruta de la aplicacin: Una vez que se establezca la informacin sobre la ruta de la aplicacin en el registro, Windows establecer esa ruta como actual cada vez que la aplicacin se ejecute. Esta clave es utilizada tambin por Windows para localizar la aplicacin si no puede encontrarla en la ruta actual. Esta funcionalidad se utilizar en caso de que el usuario escriba nicamente el nombre de la aplicacin como respuesta a la opcin Ejecutar de la barra de tareas.

Claves primarias: SubClave:

HKEY_LOCAL_MACHINE Software/Microsoft/Windows/CurrentVersion /App Paths/<NombreEjecutable>

Extensiones de ficheros: Las aplicaciones basadas en ficheros debern registrar las extensiones de los ficheros que el usuario editar mediante la aplicacin. Al registrar una extensin de ficheros, el programa de instalacin deber verificar que la extensin no est ya registrada. Claves primarias: SubClave: HKEY_CLASSES_ROOT <Extensin>

Desinstalacin del software: Igualmente importante para una experiencia de usuario satisfactoria es la eliminacin de las aplicaciones instaladas. Durante esta parte del test, las rutinas de desinstalacin de la aplicacin son probadas con vistas a asegurar que todos los componentes de la aplicacin son eliminados. Aqu se incluyen los accesos directos, ficheros GID, ficheros README, valores del registro, y el resto de los ficheros asociados a la aplicacin. Al igual que el programa de instalacin, la desinstalacin deber ser un ejecutable de 32 bits capaz de eliminar los ficheros y efectuar los cambios necesarios en el registro del sistema sin necesidad de intervencin del usuario.

Durante una desinstalacin, si se va a eliminar una DLL o fichero de soporte compartido, es importante verificar el valor del contador de referencias de esa DLL o fichero. Si el contador no es cero, el programa de desinstalacin debe decrementar el contador en uno y continuar.

Requisitos de desinstalacin: Aadir/Quitar: El programa de desintalacin deber ser accesible desde la opcin Aadir/Quitar programas del Panel de Control. Esto se exige para garantizar que los usuarios dispongan de un mecanismo consistente para eliminar las aplicaciones. Para garantizar que el programa de desintalacin funcione correctamente desde Aadir/Quitar programas, el programa de desinstalacin debe registrarse en el registro de sistema de Windows. La clave para este registro es: HKEY_LOCAL_MACHINE /Software/Microsoft/Windows/CurrentVersion /Uninstall/<NombreAplicacin>

Dentro de esta clave se almacenan los valores: DisplayName = <NombreAplicacin> UninstallString = <ruta del desinstalador y opciones> Tanto DisplayName como UninstallString debern ser asignados para que el programa de desinstalacin aparezca en la opcin Aadir/Quitar programas del Panel de Control. UninstallString debe ser una lnea de comandos completa destinada a lanzar el programa de desinstalacin.

En UnistallString pueden utilizarse opciones de lnea de comandos si se desea. Eliminacin de software: El programa de desinstalacin debe eliminar todos los ficheros que fueron copiados al disco duro cuando el programa se instal por primera vez. Todos los ficheros que hayan sido creados posteriormente a la instalacin del sistema debern mantenerse. Este requisito incluye la eliminacin de los accesos directos colocados en el men Inicio por la instalacin. Registro: El programa de desinstalacin deber eliminar todas las claves del registro asociadas al producto que se est desinstalando. Sin embargo, no eliminar claves que puedan estar asociadas con otras aplicaciones. Otros requisitos adicionales en este sentido son: 1. Prohibir la eliminacin de los componentes del ncleo de Windows 95/98/NT. Para obtener una lista de estos componentes, visite el sitio web de Microsoft. 2. Garantizar el ajuste del valor del contador de referencias asociado a todos los componentes compartidos utilizados por la aplicacin que se est eliminando. 3. Si el contador de referencias de un componente compartido es cero, el programa debe dejar ese valor en cero. Esta tcnica permite que los programas de instalacin no incrementen el valor del contador si el componente compartido ya se encontraba en el sistema pero no estaba instalado.

Se imponen requisitos adicionales a los productos que van a ser desinstalados de redes. Si la aplicacin est siendo desarrollada para Windows 2000, consulte los requisitos adicionales asociados a este sistema operativo.

Interfaz de usuario/Shell: Uno de los criterios ms importantes segn los cuales VeriTest examina una aplicacin es si sta satisface los requerimientos de Microsoft en relacin con la usabilidad e integracin de la interfaz. Esta seccin describe diversos requisitos relacionados con los colores de sistema, tipos de letra, resolucin de pantalla, sonidos, acceso desde el teclado y otros elementos. Es en las pruebas de este tipo donde las aplicaciones fallan ms frecuentemente, debido a un pobre soporte a la accesibilidad y la personalizacin de la interfaz de usuario. El objetivo fundamental de este tipo de pruebas es medir la habilidad de la aplicacin para tratar con cambios globales de interfaz, as como de ofrecer acceso a las funciones y controles de la aplicacin. En esta seccin haremos nfasis en los elementos de un buen diseo para garantizar la accesibilidad del software, ampliando los temas que se mencionan en el Microsoft Logo Handbook, e intentaremos ofrecer una visin objetiva del por qu estos requisitos son importantes. Para una informacin ms detallada sobre cmo hacer el software ms accesible, consulte los documentos de Microsoft relativos a la accesibilidad. Colores de Interfaz: La calificacin de la parte del test de certificacin relacionada con la interfaz de usuario depende en gran medida de cmo la aplicacin responde a las funciones del API de Windows GetSystemMetrics, SystemParameterInfo y GetSysColors. Mediante las propiedades de las clases de la VCL, Delphi ofrece al desarrollador respuestas automticas a estas llamadas, permitiendo a los TForm, TButton y otros objetos nativos de la VCL actualizarse automticamente cuando las variables de sistema cambien. Si se modifican los valores por defecto de los colores de estos componentes en tiempo de diseo, posteriormente cuando se cambie la configuracin de colores del sistema mediante el applet correspondiente del Panel de Control o pulsando el botn derecho sobre el escritorio, los objetos NO se actualizarn y mantendrn el color que tengan cableado en el fichero DFM. A continuacin se ofrece una lista de objetos nativos de la VCL y su configuracin de colores por defecto. Si las propiedades correspondientes se mantienen con sus valores por defecto, entonces la interfaz de usuario se actualizar automticamente en tiempo de ejecucin. Manteniendo los valores de las propiedades Color y Brush en sus valores implcitos, no ser necesario escribir cdigo para gestionar los cambios de configuracin mediante llamadas a las funciones antes mencionadas. Si por alguna razn estos valores por defecto son modificados, la aplicacin deber disponer de un mecanismo para el ajuste de la interfaz. Consulte el captulo Funciones de Informacin sobre el Sistema para conocer los prototipos de estas funciones y ejemplos detallados de su utilizacin.

Slo se listan los controles VCL que ofrecen una propiedad para establecer el color. Para los controles personalizados, consulte los valores predefinidos de las propiedades Color o Brush.

Para aquellos componentes cuyo color es clWhite puede ser necesario ofrecer un mecanismo para cambiar el color de esos elementos. clWhite es un color fijo, que no se modificar cuando se editen las propiedades del sistema. A primera vista puede parecer que satisfacer estos requisitos causa molestias innecesarias. De hecho, pueden parecer incluso triviales para el desarrollador corriente. Sin embargo, para las personas que sufren de discapacidades visuales estos requisitos son muy importantes, y pueden significar la diferencia entre quedarse con el software o devolverlo. Un excelente ejemplo de aplicacin que goza de atractivo indudable pero que rompe con estas reglas de interfaz es el software de acceso a redes de CompuServe (versin 3.01, por ejemplo). Este programa utiliza una mezcla de azules como color principal de la interfaz. Aunque esto pudo haber parecido atractivo durante el diseo, es frustrante para un usuario con deficiencias visuales. Sin nign medio para cambiar ese esquema de colores, el usuario se ve forzado a utilizar el producto as o a recurrir a una versin anterior del software, con lo que la opcin de actualizacin pierde todo su atractivo. Autocomprobacin: Para verificar que la aplicacin satisface los requisitos relacionados con los colores de la interfaz de usuario, realice Ud. mismo las siguientes pruebas: 1. Ejecute la aplicacin en su modo normal de operacin. En ese momento, pulse el botn derecho del ratn sobre el escritorio o active el Panel de Control y seleccione Pantalla. En la pestaa de Apariencia, pulse sobre el botn que est en primer plano y cambie su color. Como resultado, todos los objetos 3D en la aplicacin debern cambiar de color. Si ello no ocurriese, entonces es que las configuraciones de color de algunos de los controles han sido modificadas y debern ser devueltas a su valor por defecto. Consulte la tabla de la pgina anterior. Para una prueba ms completa de compatibilidad de color, lance de nuevo el dilogo de propiedades de pantalla y seleccione la opcin Negro en Alto Contraste. Este cambio afectar dramticamente la apariencia de Windows, ofreciendo un medio excelente para probar la aplicacin. En este modo, pruebe todas las opciones del software. Los problemas potenciales que pueden presentarse son controles que desaparecen, funciones que no trabajan o mensajes de sistema. Si alguna de las funciones de la aplicacin deja de operar correctamente, entonces ser necesario ajustar las propiedades de color.

2.

3.

Verifique que un color NUNCA sea el nico medio de comunicar informacin al usuario. Si el color de los objetos o del texto es la nica manera de comunicar informacin, entonces permita que estos elementos puedan editarse, para ser ajustados a las necesidades o preferencias de los usuarios.

Sonido: El sonido es un mecanismo muy importante para la comunicacin con el usuario final. Los sonidos pueden utilizarse para indicar advertencias del sistema, alertas sobre errores o la finalizacin satisfactoria de una tarea. Aunque el sonido es un medio vital de comunicacin con el usuario, no debe ser el nico, de la misma forma que no debe serlo el color. Hay otras alternativas que el desarrollador puede utilizar en lugar de conjuntamente con el sonido para atraer la atencin del usuario. Todos estos mtodos deben tener prioridad sobre las seales auditivas: 1. 2. Utilice un tipo de letra brillante, configurable segn las preferencias del usuario para atraer su atencin sobre un rea de la ventana. Haga parpadear el ttulo de la aplicacin en caso de algn error, o si se est esperando por una accin del usuario. Esto puede lograrse en Delphi de la siguiente forma: Este cdigo asume que se tiene un formulario con un botn y un temporizador. La propiedad Enabled del temporizador deber tener valor True y el ttulo del botn es inicialmente Flashing (Parpadeando). Este cdigo provocar que la barra de tareas parpadee igualmente. Este es un buen mtodo para atraer la atencin del usuario si una aplicacin es minimizada.
procedure begin if else end procedure begin end not then

3.

Ofrezca la posibilidad de personalizar los sonidos que la aplicacin genera en caso de advertencias o errores. Ofrezca diferentes opciones y hgalas fcilmente accesibles mediante un dilogo de preferencias. Evite reinventar los controles grficos comunes. Microsoft suministra numerosos iconos o grficos en tamaos 16 x 16 y 24 x 24

4.

pxeles. Desde el sitio web de Microsoft es posible descargar los grficos de los botones en ambos formatos. 5. Ofrezca soporte a la tecnologa SoundSentry de Microsoft. Se trata de un mecanismo que automticamente presenta una indicacin visual al usuario cuando un sonido es emitido por el altavoz del sistema. Aunque no es un requisito obligatorio, se trata de una caracterstica til tanto al desarrollador como al usuario, y que es apreciada por los usuarios que necesitan esa funcionalidad. Para ms informacin sobre el soporte de sonido y la accesibilidad del software, consulte la pgina web de Microsoft. Gen eral: Hay varias cosas que un desarrollador puede hacer para lograr un software ms accesible. Mientras que algunas de las cosas que hemos comentado aqu no son requisitos obligatorios para la obtencin del logotipo, se trata de caractersticas que hacen la utilizacin del software una experiencia ms agradable para todos los usuarios. Ms an, como muchos de estos elementos han sido identificados y resueltos, sin duda se convertirn en requisitos obligatorios en futuros programas de logotipo. Para ms informacin sobre los requisitos de accesibilidad de Microsoft y el Kit de Desarrollo Active Accessibility consulte el sitio Web de Microsoft.

Ofrezca acceso mediante teclado a cada uno de los controles de la aplicacin. Esto incluye los mens desplegables y emergentes. Requisito obligatorio para el logotipo. Asegrese de que los rdenes de tabulacin tienen sentido y estn implementados de forma que faciliten la navegacin de cualquier formulario o dilogo. Utilice identificadores textuales en aquellos casos en que se utilicen colores. De ese modo se tendr un mtodo secundario de identificar el color deseado. Utilice controles estndar de Windows siempre que sea posible. Esos controles han sido diseados para interactuar correctamente con otras herramientas de accesibilidad. Ofrezca soporte a fuentes grandes y pequeas. Se deber garantizar que el texto de cualquier control u objeto se actualice cuando cambien los parmetros de configuracin del sistema. Requisito obligatorio para el logotipo. No se deber incrustar en la aplicacin fuentes de menos de 10 puntos. Al utilizar iconos o elementos grficos en una aplicacin, ofrezca una descripcin textual de la tarea o funcin que se ejecutar si el elemento es seleccionado. Asegrese de que los controles internos se reorganicen o cambien de tamao de forma que estn accesibles siempre que la ventana principal de la aplicacin sea

redimensionada. Evite el uso de barras de desplazamiento en la ventana de la aplicacin siempre que sea posible. No utilice tcnicas genricas de navegacin para lanzar un procedimiento o funcin asociado a un control. La navegacin general debe utilizarse nicamente para acceder a los controles o caractersticas de un formulario. Documente todas las funciones de acceso desde teclado para la aplicacin. Esto incluye la documentacin impresa, la documentacin en lnea y el sistema de ayuda interactivo. Requisito obligatorio para el logotipo. No presente informacin importante del programa o del sistema nicamente mediante el color o el sonido. Cualquier mensaje que requiera la atencin del usuario deber ser llevado al usuario mediante mltiples mtodos de atraer la atencin. Evite la dependencia de la aplicacin de un dispositivo especfico de entrada. Los usuarios debern tener la posibilidad de utilizar el teclado, el ratn u otro dispositivo de entrada que se adapte mejor a sus necesidades. Aunque no es obligatorio, construya el ndice de los ficheros de ayuda de la aplicacin de forma que la pulsacin de F1 lance siempre una ayuda especfica asociada al comando seleccionado, o implemente la ayuda sensible al contexto. Esta forma de ayuda normalmente se presenta en forma de un smbolo ? asociado al puntero del ratn y produce indicaciones en lnea para el elemento que se seleccione. Autocomprobacin: Para comprobar si la aplicacin satisface los requisitos de accesibilidad, realice las siguientes acciones y registre cualquier problema que debera ser resuelto antes de enviar la aplicacin para su verificacin. 1. Con la aplicacin ejecutndose bajo Win dows 95/98 NT, intente cambiar el tamao de la ventana principal de la aplicacin. Si algunos comandos quedan fuera del alcance visual, asegrese de que existe una manera de personalizar la interfaz de usuario de modo que en esa disposicin particular de los controles se pueda trabajar normalmente. Esto se presenta ms frecuentemente en casos de barras de herramientas encajables o redimensionables o mens emergentes con muchas opciones. Ejecute la aplicacin normalmente. Intente utilizarla sin hacer uso del ratn. Puede accederse a todas las funciones del programa mediante el teclado? En caso negativo, debern aadirse nuevos elementos de men y atajos de teclado. Verifique que la aplicacin responde a los ajustes de colores, tipos de letra y tamaos. Si algunas etiquetas, ttulos de botones u otros elementos quedan distorsionados o invisibles, deber realizar modificaciones en el programa, de modo que dichos controles funcionen segn lo esperado. Consulte el captulo Funciones de Informacin sobre el Sistema para ms detalles sobre las funciones de configuracin de los parmetros del sistema. Consulte la seccin de autocomprobacin relativa a los colores y elementos grficos acerca de las pruebas relacionadas con dichos elementos.

2.

3.

4.

Para obtener una lista completa de los problemas relacionados con la accesibilidad y sus soluciones, consulte el sitio web de accesibilidad de Microsoft. Tambin es de inters el sitio web de Microsoft Above and Beyond the Windows 95 Logo (Ms all del Logotipo para Windows 95), en el que se ofrece an ms informacin sobre cmo pulir sus aplicaciones antes de enviarlas a VeriTest para su verificacin formal. Finalmente, Microsoft ofrece en su Web informacin dedicada especialmente al desarrollo para Win32, que contiene gran cantidad de informacin relacionada con el buen diseo de aplicaciones, conjuntamente con kits de desarrollo, herramientas y especificaciones software que facilitan el desarrollo. Para acceder a toda esa informacin, visite: http://www.microsoft.com Asistencia al Usuario: Los sistemas de ayuda redondean y completan la experiencia del usuario de un software determinado. Siempre llega el momento en que un usuario cualquiera necesita ayuda acerca de una aplicacin. Los sistemas de ayuda inmediata e interactiva son hoy un elemento comn en las aplicaciones. Tales sistemas deben disearse de forma tal que ofrezcan al usuario la retroalimentacin que stos necesitan para resolver sus dudas de un modo rpido y eficiente. Existen diversos tipos de sistemas de ayuda que un usuario cualquiera podra esperar de una aplicacin Windows. Estos sistemas van desde ofrecer ayuda inmediata sobre una funcin o control particular hasta aquellos que implican la bsqueda en un fichero de referencias cruzadas. Todas las aplicaciones compatibles con el logotipo ofrecen algn tipo de implementacin de un sistema de ayuda. En trminos de mecanismos efectivos de ayuda no existen frmulas que indiquen cundo un tipo de sistema es superior a otro. Las mejores aplicaciones utilizan diferentes sistemas, segn el contexto, la interfaz del producto individual y la cantidad de informacin que se prev necesaria para indicar al usuario cmo utilizar el objeto en cuestin. Por lo tanto, una buena mezcla de diferentes sistemas de ayuda ofrece la mejor experiencia de usuario y permite cubrir de modo ms completo todos los tpicos que requieren la programacin de ayuda. Varios sistemas de ayuda: Indicaciones al vuelo (tooltips): Las indicaciones son mensajes cortos que se muestran en tiempo real con el objetivo de ofrecer informacin concisa sobre una funcin, opcin o control que ha sido o est a punto de ser seleccionado. Estas indicaciones se aaden al objeto o aplicacin Delphi introduciendo una cadena de caracteres en la propiedad Hint del objeto y activando su propiedad ShowHint. Las indicaciones se muestran cuando el puntero del ratn se sita sobre el objeto por un perodo determinado de tiempo, y se esconden cuando el usuario mueve el puntero del ratn, interacta con el control o simplemente transcurre un intervalo de inactividad.

Barra de estado: Una barra de estado es un elemento permanente de la interfaz de usuario sobre la que se muestran mensajes textuales en la medida en que el usuario interacta con la aplicacin. Las barras de estado pueden tambin mostrar informacin continua sobre el estado de la aplicacin, por ejemplo sobre las coordenadas del ratn o el progreso de la operacin de una tarea. Sensible al contexto: La ayuda sensible al contexto responde a las preguntas Qu es esto? y Qu hace esto?. Esta forma de ayuda es una extensin de las indicaciones y a la vez un mecanismo ms sencillo que el de un sistema de ayuda basado en bsquedas. La ayuda sensible al contexto permite al usuario seleccionar los objetos y funciones dentro de la aplicacin y obtener informacin ms detallada acerca de la utilizacin del elemento especificado. Esta ayuda suele ser ms concisa que la que ofrece un fichero de ayuda formal, pero es un paso superior en relacin con las indicaciones o barras de estado. Referencia en lnea: La referencia en lnea es un mecanismo fcil de utilizar que ofrece al usuario informacin detallada acerca del control o proceso en cuestin y los efectos de su utilizacin. Una buena integracin entre los ficheros de ayuda y la ayuda sensible al contexto depende de la asociacin a un fichero de ayuda a travs de la propiedad HelpFile de la aplicacin y el valor de la propiedad HelpContext de cada objeto individual. La integracin con los ficheros de ayuda a este nivel permite al usuario obtener de forma rpida informacin adicional que no ofrecen otros mecanismos de ayuda. Los ficheros de ayuda garantizarn la bsqueda y el enlace de caractersticas y funcionalidades relacionadas en base a palabras claves determinadas por el creador de la ayuda. Asistentes (wizards): Los asistentes son otro tipo de sistema de ayuda que gua al usuario a travs de los diferentes pasos de un proceso detallado. Los asistentes se presentan con frecuencia como dilogos que interrogan al usuario acerca del resultado deseado, y luego producen un resultado final a partir de las respuestas del usuario. Ayuda interactiva: Los sistemas de ayuda interactivos ofrecen informacin de modo muy similar a cmo lo hace un fichero de ayuda basado en referencias cruzadas, pero ofrecen al usuario la posibilidad de interactuar con el programa de ayuda. Este tipo de ayuda es muy deseable en caso de tutoriales o ayuda de tipo Mustrame..., donde el sistema de ayuda mostrar al usuario con ejemplos la manera apropiada de utilizar una funcin o control de una aplicacin.

La parte final de las pruebas de compatibilidad con el logotipo tiene que ver con la compatibilidad de la aplicacin. Este concepto est relacionado con las caractersticas que permiten a las aplicaciones funcionar de forma conjunta. Las reas generales sujetas a verificacin son la implementacin de la tecnologa OLE, los controles ActiveX, y algunas reas de comunicaciones en el caso de aplicaciones para telefona. OLE es una funcionalidad de software exigida en muchos de los tipos de aplicaciones que se pueden someter a las pruebas para el logotipo. Mediante esta tecnologa se hace posible que los usuarios ignoren la fuente original de un documento, integrndolo en lo que se conoce como documento compuesto. Para ms informacin acerca de OLE, su funcionalidad y los requisitos para compatibilidad con el logotipo, consulte el sitio web de Microsoft y su documentacin al respecto. Aunque a lo largo de este captulo hemos presentado una visin ms profunda de los requisitos para la obtencin del logotipo de Microsoft, el mismo no intenta sustituir al documento formal. Consulte el manual oficial Logo Handbook for Software Applications para conocer ms detalles sobre los requisitos y exenciones asociadas a las diferentes categoras de productos.

La creacin de ventanas es una parte fundamental de cualquier programa para Windows. Casi todos los elementos de cualquier interfaz de usuario son ventanas, tanto las ventanas de la aplicacin propiamente dichas como los controles que aceptan entrada de ratn o teclado. Las funciones de creacin de ventanas son tambin las ms complejas y propensas a errores de todo el API de Windows. Los programadores ocasionales de Delphi no necesitarn nunca la informacin contenida en este captulo, ya que Delphi hace un buen trabajo ocultando todos los detalles relacionados con la creacin de ventanas. Sin embargo, conocer los pasos necesarios para crear una ventana en Windows puede dar al desarrollador los conocimientos necesarios para extender la funcionalidad bsica de Delphi y conseguir cosas que no estn encapsuladas en la VCL. La creacin de una ventana exige que el programador siga una secuencia de pasos compleja y detallada. En general, crear una ventana implica registrar una clase en el sistema operativo, seguido de una llamada a una funcin compleja que realmente construye la ventana a partir de la clase. Una clase de ventana identifica un conjunto de atributos que definen la apariencia y el comportamiento bsicos de una ventana. Estos atributos se utilizan como plantilla a partir de la cual se puede crear luego cualquier cantidad de ventanas con caractersticas similares. Existen clases predefinidas para cada uno de los elementos estndar de interfaz de usuario de Windows, tales como cuadros de edicin, botones, etc. Sin embargo, para crear un nuevo tipo de ventana, por ejemplo el correspondiente a la ventana principal de una aplicacin, el programador debe registrar una clase de ventana. La encapsulacin por parte de Delphi del API de Windows hace este proceso transparente para el programador. Sin embargo, pueden darse casos en los que nos veamos obligados a crear ventanas a la vieja usanza.

Crear una ventana usando las funciones de bajo nivel del API de Windows es una tarea que exige atencin a muchos detalles, pero en el fondo directa. El programador deber ejecutar tres pasos al crear una ventana:

Registrar una nueva clase de ventana. Si se desea crear una ventana de una de las clases predefinidas de Windows, este paso se omite. La ventana es creada mediante una llamada a alguna funcin de creacin de ventanas. Finalmente, la ventana es mostrada en pantalla. Este paso se omite si la bandera (opcin) de estilo WS_VISIBLE fue utilizada en el parmetro dwStyle de la creacin. Si una ventana es creada satisfactoriamente, la funcin de creacin devuelve un manejador. Este manejador de ventana es utilizado en toda una variedad de funciones del API para realizar tareas con la ventana asociada al manejador. Cualquier control descendiente de TWinControl es una ventana que se crea mediante una de las funciones de creacin de ventanas, y por tanto tiene un manejador de ventana, accesible mediante la propiedad de slo lectura Handle del control. Este manejador puede ser enviado a cualquier funcin del API de Windows que requiera un manejador de ventana como parmetro. El siguiente ejemplo muestra cmo crear una ventana siguiendo los pasos anteriormente descritos.

function var begin or

nil

end procedure var begin if not begin then

end

Nil

if begin end else begin end end

then

Cada clase de ventana tiene una funcin asociada a ella conocida como el procedimiento de ventana. Se trata de una funcin de respuesta que Windows utiliza para comunicarse con la aplicacin. Esta funcin determina cmo la ventana interacta con el usuario y qu es mostrado en su rea cliente. Las ventanas de una clase

determinada utilizarn el procedimiento de ventana asociado a esa clase. Vase el Listado 3-2 como ejemplo de uso de un procedimiento de ventana. Delphi crea automticamente procedimientos de ventana que ofrecen la funcionalidad apropiada a partir del tipo de ventana. Sin embargo, un programador puede necesitar modificar o extender ese comportamiento. La funcionalidad de una ventana puede modificarse subclasificando el procedimiento de ventana y programando uno nuevo. Esta tcnica es mostrada en el captulo Funciones de informacin sobre ventanas. El procedimiento de ventana es ms o menos como una gran instruccin case que detecta determinados mensajes especficos a los que el programador desea asociarles una cierta funcionalidad. Cada mensaje con una accin asociada tendr su caso correspondiente en la instruccin case. En Delphi, los mensajes se manifiestan a travs de los eventos de cualquier control particular, como OnKeyPress u OnResize. Los mensajes que no son gestionados de manera especfica debern ser pasados a una rutina llamada DefWindowProc. Las ventanas hijas MDI utilizan el procedimiento DefMDIChildProc, mientras que los marcos MDI utilizan DefFrameProc. Estos procedimientos suministran el comportamiento bsico para cualquier ventana, como el cambio de tamao o posicin, etc.

Delphi es totalmente capaz de pasar por encima de la funcionalidad que ofrece la VCL, permitiendo al programador crear una aplicacin Windows completa exclusivamente en Object Pascal. El siguiente ejemplo muestra cmo pueden escribirse tales programas. Note que la unidad principal deber ser eliminada del proyecto, y el siguiente cdigo se coloca directamente en el fichero fuente del proyecto.

program uses

function stdcall begin case of begin end end

end function var begin or

nil

end var begin if not begin end then nil

or

nil

if begin end

then nil

while begin end end

do

Las constantes de estilo disponibles para los parmetros dwStyle y dwExStyle de las funciones CreateWindow y CreateWindowEx ofrecen una variedad prcticamente infinita de tipos de ventana. En general, las ventanas se pueden clasificar en tres categoras: Superpuesta (Overlapped): Este es el tipo ms comn de ventana, y se utiliza generalmente para la ventana principal de la aplicacin. Este tipo de ventana incluye la bandera WS_OVERLAPPED en el parmetro dwStyle, puede ser redimensionada por el usuario en tiempo de ejecucin, e incluye una barra de ttulo, men de sistema y botones de maximizacin y minimizacin. Este tipo de ventanas aparecer en la barra de tareas. Hija (Child): Este es el segundo estilo ms usual. Todos los controles de ventana y las ventanas hijas MDI entran en esta categora. Este tipo de ventanas incluye la bandera de estilo WS_CHILD en el parmetro dwStyle. Las ventanas hijas MDI incluyen la bandera WS_EX_MDICHILD en el parmetro dwExStyle. La ventana cuyo manejador se suministra en el parmetro hWndParent de la llamada a la funcin de creacin de ventana ser la ventana madre (parent win dow) de la ventana hija creada. La ventana madre ofrece la superficie sobre la que la ventana hija es visualizada. O sea, una ventana hija siempre est completamente contenida dentro de su ventana madre. La

ventana hija siempre se muestra sobre el rea cliente de su ventana madre, y la parte de la ventana hija que cae ms all de los lmites de su ventana madre es recortada (clipped). Las ventanas hijas no aparecen en la barra de tareas. Cuando una ventana madre es destruida, todas sus ventanas hijas tambin son destruidas. Emergente (Popup): Los cuadros de dilogo comunes y hojas de propiedades pertenecen a esta categora. Este tipo de ventanas incluye la opcin de estilo WS_POPUP en el parmetro dwStyle. La ventana madre de una ventana emergente es siempre la ventana del escritorio. El parmetro hWndParent se utiliza para especificar la ventana propietaria (owner window) para las ventanas emergentes. Una ventana emergente sin propietaria se mantendr visible incluso cuando la ventana principal de la aplicacin sea minimizada, y aparecer en la barra de herramientas. Si se suministra un manejador de ventana en el parmetro hWndParent, la ventana asociada con ese manejador se convertir en la propietaria de la ventana emergente. La ventana emergente entonces se esconder cuando su propietaria sea minimizada, reaparecer cuando su propietaria sea restaurada, se mantendr encima de su ventana propietaria incluso en el caso de que sta sea maximizada u obtenga el foco, y no aparecer en la barra de tareas. Este tipo de ventanas es ideal para barras de herramientas o ventanas de paletas.

Cualquier ventana puede tener el estilo WS_OVERLAPPED , pero los estilos WS_CHILD y WS_POPUP son mutuamente excluyentes. Si el parmetro hWndParent de una ventana superpuesta contiene el manejador de otra ventana, esta ventana actuar como propietaria de la ventana superpuesta, que toma las caractersticas de una ventana emergente con propietaria. Como la ventana madre es responsable de ofrecer un rea de visualizacin para sus ventanas hijas, cuando la ventana madre de cualquier ventana es destruida, todas las ventanas asociadas que pertenecen a esa ventana madre son tambin destruidas. La Figura 3-3 ilustra los diferentes tipos de ventana.

Las aplicaciones MDI constan de una ventana-marco, que acta como ventana principal de la aplicacin, y de una ventana cliente, que ofrece el rea de trabajo sobre la que se despliegan las ventanas de documento, que son ventanas hijas MDI. En estas ventanas hijas MDI es donde el usuario realiza su trabajo. Delphi encapsula la mayora de esta funcionalidad a travs de la propiedad FormStyle de los formularios. Simplemente asignando a esta propiedad el valor fsMDIForm se pueden crear las ventanas marco y cliente; estableciendo el valor fsMDIChild se crean las ventanas hijas MDI. Sin embargo, hay ocasiones en que un programador necesita crear una aplicacin MDI utilizando llamadas a funciones del API de Windows. En ese caso, se deber seguir la siguiente secuencia de pasos: Se debe registrar una nueva clase de ventana. Esta clase se utilizar para crear la ventana marco MDI, y no puede ser ninguna de las clases predefinidas de Windows. A continuacin, se crea la ventana marco MDI utilizando una de las funciones de creacin de ventanas. Mostrar la ventana marco MDI en pantalla. Este paso se omitir si la opcin WS_VISIBLE fue utilizada en el parmetro dwStyle al crear la ventana. Crear una variable de tipo TClientCreateStruct, y rellenar los campos del registro con la informacin apropiada. Crear la ventana cliente MDI utilizando una de las funciones de creacin de ventanas. Se debe utilizar el nombre de clase predefinido de Windows MDICLIENT, y pasar el manejador de la ventana marco en el parmetro hWndParent, y la variable de tipo TClientCreateStruct en el parmetro lpParam. Se deben utilizar las opciones WS_CLIPCHILDREN y WS_CHILD en el parmetro dwStyle. Mostrar la ventana cliente MDI en pantalla. Este paso se omitir si la opcin WS_VISIBLE fue utilizada en el parmetro dwStyle al crear la ventana. Registrar las clases que se utilizarn para las ventanas hijas MDI. Crear la ventana hija MDI. Esto se logra creando una variable de tipo TMDICreateStruct, rellenando los campos del registro, y enviando un mensaje WM_MDICREATE a la ventana cliente MDI, pasndole un puntero al registro TMDICreateStruct en el parmetro lPa ram del mensaje, o utilizando la funcin del API CreateMDIWindow. Mostrar la nueva ventana hija MDI en pantalla. Este paso se omitir si la opcin WS_VISIBLE fue utilizada en el parmetro dwStyle al crear la ventana. El siguiente ejemplo muestra cmo crear una aplicacin MDI utilizando tcnicas nativas de programacin Windows.

Program uses

var

const

function stdcall var begin case begin

of

Nil or or

if begin

then nil end

end begin end

end

end function var begin or

end function var begin or

nil

end begin if not then

begin nil end

or

Nil

3
if begin end else begin nil end then

if not begin end

then nil

if begin end else begin

then

nil end while begin end end do

La manera convencional de crear ventanas hijas MDI es enviando el mensaje WM_MDICREATE a la ventana MDICLIENT. Sin embargo, este mensaje no puede utilizarse para crear ventanas hijas MDI desde un hilo diferente. Utilice la funcin CreateMDIWindow para salvar esta limitacin. Se puede tambin utilizar esta funcin para permitir que cada ventana hija MDI funcione en su propio hilo de ejecucin. Es posible combinar la funcionalidad de la VCL con la potencia de las funciones de ms bajo nivel del API de Windows. El siguiente ejemplo demuestra cmo utilizar las funciones del API de Windows para crear ventanas hijas MDI en una aplicacin en la que una ventana Delphi sirve como ventana marco MDI. Tenga en cuenta que el

formulario principal deber tener asociado el estilo fsMDIForm, y que la propiedad ClientHandle en ese caso contiene el manejador de la ventana MDICLIENT.

function var begin or

nil

end procedure begin if not begin end end procedure var begin then

with begin

do

or end

end

Cuando Delphi crea un control que encapsula alguna de las clases predefinidas de Windows, como un cuadro de edicin o un botn, el cdigo asociado a ese objeto VCL hace una llamada a la funcin del API CreateWindowEx para crear la ventana en s. El mtodo CreateParams es llamado inmediatamente antes de CreateWindowEx. En ese mtodo, una estructura de datos del tipo TCreateParams es inicializada con informacin que luego ser utilizada como parmetros de entrada de la llamada a la funcin CreateWindowEx. El registro TCreateParams se define de la siguiente forma: TCreateParams = record Caption: PChar; Style: LongInt; ExStyle: LongInt; X: Integer; Y: Integer; Width: Integer; Height: Integer; WndParent: HWND; Param: Pointer; WindowClass: TWndClass; WinClassName: array[0..63] of Char; end; {ttulo de la ventana} {opciones de estilo} {opciones extendidas} {pos. horizontal inicial} {pos. vertical inicial} {ancho inicial} {altura inicial} {manejador de ventana madre} {datos de creacin adicionales} {info sobre clase de ventana} {nombre de la clase}

El miembro WindowClass es del tipo TWndClass, y contiene informacin sobre los parmetros de la llamada a la funcin RegisterClass. Consulte las funciones CreateWindow, CreateWindowEx, RegisterClass y RegisterClassEx para obtener una descripcin completa del significado de esos parmetros. El desarrollador puede redefinir el mtodo CreateParams, especificando la informacin que desea que se utilice al crear ese tipo concreto de control o ventana. De esta forma, un programador puede extender la funcionalidad de los controles estndar de Delphi a nivel del API. El siguiente ejemplo muestra cmo un desarrollador puede crear un control de edicin de mltiples lneas y con justificacin derecha para la edicin de datos numricos a partir de un objeto de la clase TEdit, modificando las opciones en el miembro Style del registro.

unit interface uses

type class private protected public procedure constructor published end procedure implementation procedure begin inherited or or or or end constructor begin inherited var var override override

end procedure begin end end

Esta tcnica puede utilizarse igualmente para formularios. El siguiente ejemplo muestra cmo crear un formulario que tenga un borde elevado, segn muestra la Figura 3-6.

type class private public procedure end var implementation var override

procedure begin inherited

var

or end

En el presente captulo se describen las siguientes funciones de creacin y registro de ventanas:

CreateMDIWindow( lpClassName: PChar; lpWindowName: PChar; dwStyle: DWORD; X: Integer; Y: Integer; nWidth: Integer; nHeight: Integer; hWndParent: HWND; hInstance: HINST; lParam: LPARAM ): HWND;

{puntero al nombre de la clase hija MDI} {puntero al nombre de la ventana} {opciones de estilo de ventana} {posicin horizontal inicial} {posicin vertical inicial} {ancho inicial de la ventana} {altura inicial de la ventana} {manejador de la ventana madre, cliente MDI} {manejador de instancia de mdulo} {valor definido por la aplicacin} {devuelve un manejador de la nueva ventana}

Esta funcin crea ventanas hijas MDI, y su efecto es similar al de enviar un mensaje WM_MDICREATE a una ventana cliente MDI. Para ms informacin sobre la creacin de ventanas, consulte la funcin CreateWindow. Esta funcin debe utilizarse para crear ventanas hijas MDI en hilos de ejecucin independientes.

Windows 95 soporta un mximo de 16.364 manejadores de ventana.

lpClassName: Un puntero a una cadena de caracteres terminada en nulo y sensible a las diferencias entre maysculas y minsculas, que especifica la clase de ventana de la ventana hija MDI. Esta clase es registrada mediante la funcin RegisterClass. lpWindowName: Un puntero a una cadena de caracteres terminada en nulo y sensible a las diferencias entre maysculas y minsculas, que es mostrada en la barra de ttulo de la ventana hija MDI. dwStyle: Un nmero de 32 bits que especifica los estilos que la ventana utiliza. Si la ventana cliente MDI incluye la opcin de estilo MDIS_ALLCHILDSTYLES , este parmetro puede incluir cualquier combinacin de los estilos genricos, que se detallan en la tabla asociada a la funcin CreateWindow. En caso contrario, puede utilizarse cualquier combinacin de estilos de la tabla que se muestra a continuacin. La combinacin de dos o ms estilos se obtiene utilizando el operador booleano or, como por ejemplo en WS_MINIMIZE or WS_HSCROLL. X: La posicin horizontal inicial de la esquina superior izquierda de la ventana hija MDI. Esta posicin es relativa al rea cliente de la ventana cliente MDI. Utilizando la constante CW_USEDEFAULT se indica a Windows que utilice la posicin horizontal por defecto para la ventana. Y: La posicin vertical inicial de la esquina superior izquierda de la ventana hija MDI. Esta posicin es relativa al rea cliente de la ventana cliente MDI. Utilizando la constante CW_USEDEFAULT se indica a Windows que utilice la posicin vertical por defecto para la ventana. nWidth: El ancho inicial de la ventana hija MDI. Si se utiliza la constante CW_USEDEFAULT, Windows asigna a la ventana hija MDI un ancho implcito definido internamente. nHeight: La altura inicial de la ventana hija MDI. Si se utiliza la constante CW_USEDEFAULT, Windows asigna a la ventana hija MDI una altura implcita definida internamente.

hWndParent: Manejador de la ventana cliente MDI que se convierte en madre de la ventana hija. hInstance: El manejador de instancia de la aplicacin o mdulo que crea esta ventana. lParam: Un valor de 32 bits definido por la aplicacin.

Si la funcin se ejecuta satisfactoriamente, devuelve un manejador de la nueva ventana hija MDI; en caso contrario, devuelve cero.

CreateWindow, CreateWindowEx, WM_MDICREATE

function var begin or

nil

end procedure var begin if not begin end then

or or or or

if begin end else begin end end

then

CreateWindow( lpClassName: PChar; lpWindowName: PChar; dwStyle: DWORD; X: Integer; Y: Integer; nWidth: Integer; nHeight: Integer; hWndParent: HWND; hMenu: HMENU; hInstance: HINST; lpParam: Pointer ): HWND;

{puntero a nombre de la clase de ventana} {puntero al nombre de la ventana} {opciones de estilo de la ventana} {posicin horizontal inicial} {posicin vertical inicial} {ancho inicial de la ventana} {altura inicial de la ventana} {manejador de ventana madre} {manejador de men o de ventana hija} {manejador de instancia de mdulo} {puntero a informacin adicional} {devuelve el manejador de la nueva ventana}

La funcin CreateWindow crea una ventana superpuesta, emergente o hija a partir de una clase de ventana predefinida o de una nueva clase de ventana, definida por el programador mediante una llamada a RegisterClass. Esta funcin puede utilizarse para crear cualquier tipo de ventana, incluyendo la ventana principal de la aplicacin y ventanas hijas o controles de interfaz de usuario utilizados por sta. Es posible indicar la posicin y tamao inicial de la ventana, y especificar un propietario, ventana madre o men. Antes de retornar, esta funcin enva un mensaje WM_CREATE al procedimiento de ventana. Para ventanas superpuestas, emergentes e hijas esta funcin tambin enva los mensajes WM_GETMINMAXINFO y WM_NCCREATE. Si se especifica la opcin de estilo WS_VISIBLE, CreateWindow enviar todos los mensajes necesarios para la activacin y presentacin en pantalla de la ventana.

Windows 95 soporta un mximo de 16.364 manejadores de ventana.

lpClassName: Un puntero a una cadena de caracteres terminada en nulo y sensible a las diferencias entre maysculas y minsculas, o bien un valor de tomo entero, que describe un nombre de clase predefinida o creada mediante la funcin RegisterClass.

Consulte la Tabla 3-3 para conocer los nombres de las clases predefinidas. Si se especifica un tomo, ste debe haber sido creado mediante una llamada a GlobalAddAtom. El tomo, un valor de 16 bits menor que $C000, debe colocarse en la palabra ms baja de lpClassName, y la palabra ms alta deber ser cero. lpWindowName: Un puntero a una cadena de caracteres terminada en nulo y sensible a las diferencias entre maysculas y minsculas, que es mostrada en la barra de ttulo de la ventana. Si la ventana es un control, ste ser el texto mostrado en el control. dwStyle: Un nmero de 32 bits que describe las opciones de estilo que la ventana utiliza. Las constantes de estilo disponibles se listan en la Tabla 3-4. Las opciones de estilo se combinan mediante el operador booleano or, como por ejemplo en WS_HSCROLL or WS_VSCROLL. X: La posicin horizontal inicial de la esquina superior izquierda de la ventana. Para las ventanas superpuestas o emergentes, esta coordenada es relativa a la pantalla. Para las ventanas hijas, esta coordenada es relativa a la esquina superior izquierda del rea cliente de la ventana madre. Si se utiliza la constante CW_USEDEFAULT, Windows determina automticamente la posicin inicial del extremo superior izquierdo, y el parmetro Y es ignorado. La constante CW_USEDEFAULT es vlida nicamente para ventanas superpuestas. Si se especifica para cualquier otro tipo de ventana se asignar cero a los parmetros X e Y. Y: La posicin vertical inicial de la esquina superior izquierda de la ventana. Para las ventanas superpuestas o emergentes, esta coordenada es relativa a la pantalla. Para las ventanas hijas, esta coordenada es relativa a la esquina superior izquierda del rea cliente de la ventana madre. Si una ventana superpuesta es creada con el estilo WS_VISIBLE y el parmetro X tiene el valor CW_USEDEFAULT, el parmetro Y es ignorado. nWidth: El ancho inicial de la ventana. Las ventanas superpuestas pueden utilizar la constante CW_USEDEFAULT, en cuyo caso el parmetro nHeight es ignorado. Si esta constante es utilizada, Windows selecciona un ancho y altura por defecto para la ventana. El ancho por defecto se extender desde la coordenada X inicial hasta el extremo derecho de la pantalla; la altura por defecto se extender desde la coordenada Y inicial hasta el inicio de la barra de tareas. Si se especifica el valor CW_USEDEFAULT para ventanas emergentes o hijas, a los parmetros nWidth y nHeight se les asignar el valor cero. nHeight: La altura inicial de la ventana. Si el parmetro nWidth tiene valor CW_USEDEFAULT, el parmetro nHeight es ignorado. hWndParent: El manejador de la madre o propietaria de la ventana. Se deber especificar un manejador vlido si se trata de una ventana hija o que tiene asignado una propietaria. Las ventanas hijas son confinadas al rea cliente de su ventana madre. Una ventana con propietaria es una ventana superpuesta o hija que ser destruida cuando su propietaria lo sea y escondida cuando su propietaria sea minimizada; siempre se muestra encima de su ventana propietaria. El parmetro puede ser nil si la ventana no

tiene una propietaria. Si no se especifica una ventana madre, la ventana no ser destruida automticamente cuando la aplicacin finalice. La funcin DestroyWindow deber utilizarse en ese caso para destruir la ventana. Este parmetro deber contener un manejador vlido si se hace uso de la opcin WS_CHILD; es opcional si se utiliza el estilo WS_POPUP. hMenu: Un manejador de objeto de men. Para una ventana superpuesta o emergente, el parmetro puede ser nil si se debe utilizar el men de la clase. Para los controles, a este parmetro se asigna un valor entero que servir como identificador del control que se crear. Todos los mensajes WM_COMMAND llevarn asociado ese identificador cuando se produzca alguna accin sobre el control. El identificador de ventana hija deber ser nico entre todas las ventanas hijas de una misma ventana madre. hInstance: La instancia de la aplicacin o mdulo que crea la ventana. lpParam: Un puntero a datos definidos por la aplicacin que se utiliza durante el proceso de creacin de la ventana. El procedimiento de ventana recibe un mensaje WM_CREATE cuando la funcin CreateWindow es llamada. El campo miembro lParam de este mensaje contendr un puntero a un registro de tipo TCreateStruct. El campo lpCreateParams del registro TCreateStruct contendr el puntero a los datos definidos por la aplicacin. Para las ventanas MDICLIENT, pase un puntero a un TClientCreateStruct en este parmetro. Si no se necesita informacin adicional para la creacin de la ventana, asigne nil a este parmetro. Un registro TClientCreateStruct contiene la informacin adicional necesaria para crear una ventana MDICLIENT. Delphi define ese tipo de la siguiente forma: TClientCreateStruct = packed record hWindowMenu: THandle; {manejador de men} idFirstChild: UINT; {identificador de la primera hija MDI} end; hWindowMenu: Es el manejador del men de ventana de la aplicacin MDI. idFirstChild: Contiene el identificador de la primera ventana hija MDI. Windows incrementa este identificador para cada ventana hija MDI que sea creada, y reasigna los identificadores cuando una ventana hija es destruida, de modo que el rango de identificadores sea contiguo. Estos identificadores se utilizan en los mensajes WM_COMMAND que se envan al marco MDI cuando una ventana hija es seleccionada del men de ventana, y deben ser diferentes para no provocar conflictos con otros identificadores de comandos. El registro TCreateStruct contiene todos los parmetros que han sido pasados a la funcin CreateWindow. El desarrollador puede utilizar esta informacin para llevar a cabo cualquier inicializacin adicional necesaria en el momento de la creacin de la ventana. El tipo TCreateStruct se define de la siguiente forma: TCreateStruct = packed record lpCreateParams: Pointer; {puntero a datos definidos por la aplicacin} hInstance: HINST; {manejador de instancia de mdulo}

hMenu: HMENU; hwndParent: HWND; cy: Integer; cx: Integer; y: Integer; x: Integer; style: LongInt; lpszName: PAnsiChar; lpszClass: PAnsiChar; dwExStyle: DWORD; end;

{manejador de men / identificador de ventana hija} {manejador de ventana madre} {altura inicial de ventana} {ancho inicial de ventana} {posicin vertical inicial} {posicin horizontal inicial} {opciones de estilo de la ventana} {puntero al nombre de la ventana} {puntero al nombre de la clase de ventana} {opciones de estilo extendidas}

El campo lpCreateParams es un puntero a datos definidos por la aplicacin (consulte el Listado 3-9 para un ejemplo de su utilizacin). El resto de los campos del registro contiene la informacin pasada a travs de los parmetros correspondientes a la funcin CreateWindow o CreateWindowEx.

Si la funcin se ejecuta satisfactoriamente, devuelve un manejador de la nueva ventana; en caso contrario, devuelve cero. Para obtener ms informacin sobre el error que se haya presentado, utilice la funcin GetLastError.

CreateDialog, CreateWindowEx, DestroyWindow, DialogBox, MessageBox, RegisterClass, ShowWindow, WM_COMMAND, WM_CREATE, WM_GETMINMAXINFO, WM_NCCALCSIZE, WM_NCCREATE, WM_PAINT

El siguiente cdigo crea un control de edicin de mltiples lneas. El texto se centra horizontalmente dentro del control, y se incluye una barra de desplazamiento vertical.

procedure const var begin

3
or or or or or

Nil end

record end

var implementation function stdcall

var

begin case begin

of

end begin end end

end function var begin or

nil

end procedure var

begin if not begin end then

if begin end else begin end end

then

CreateWindowEx( dwExStyle: DWORD; lpClassName: PChar; lpWindowName: PChar; dwStyle: DWORD; X: Integer; Y: Integer; nWidth: Integer; nHeight: Integer; hWndParent: HWND; hMenu: HMENU; hInstance: HINST; lpParam: Pointer ): HWND;

{opciones de estilo extendidas} {puntero al nombre de la clase} {puntero al nombre de la ventana} {opciones de estilo} {posicin horizontal inicial} {posicin vertical inicial} {ancho inicial de la ventana} {altura inicial de la ventana} {manejador de ventana madre} {manejador de men o ident. de ventana hija} {manejador de instancia de mdulo} {puntero a informacin adicional} {devuelve el manejador de la nueva ventana}

Esta funcin es casi idntica a la funcin CreateWindow, pero ofrece al desarrollador acceso a opciones de estilo extendidas, que se aaden a los estilos listados en las tablas anteriores. Para ms informacin acerca de los estilos de ventana, estilos de controles y los mensajes enviados cuando una ventana es creada, consulte la funcin CreateWindow. En el cdigo fuente de Windows.Pas, la funcin CreateWindow no es importada de User32.DLL. En vez de eso, la funcin llama a CreateWindowEx, pasando un cero en la posicin del parmetro dwExStyle.

Windows 95 soporta un mximo de 16.364 manejadores de ventana.

dwExStyle: Un entero de 32 bits que especifica las opciones de estilo extendidas que la ventana utiliza. Las opciones de estilo extendidas se combinan mediante el operador booleano or, como por ejemplo en WS_EX_ABSPOSITION or WS_EX_CONTROLPARENT. Utilizar el estilo extendido WS_EX_RIGHT para los controles estticos o de edicin es equivalente a utilizar los estilos SS_RIGHT o ES_RIGHT, respectivamente. Utilizar ese estilo para botones es equivalente a utilizar BS_RIGHT y BS_RIGHTBUTTON. lpClassName: Un puntero a una cadena de caracteres terminada en nulo y sensible a las diferencias entre maysculas y minsculas, o bien un valor de tomo entero, que describen un nombre de clase predefinida o creada mediante la funcin RegisterClass. Consulte la Tabla 3-3 para conocer los nombres de las clases predefinidas. Si se especifica un tomo, ste debe haber sido creado mediante una llamada a GlobalAddAtom. El tomo, un valor de 16 bits menor que $C000, debe colocarse en la palabra ms baja de lpClassName, y la palabra ms alta deber ser cero. lpWindowName: Un puntero a una cadena de caracteres terminada en nulo y sensible a las diferencias entre maysculas y minsculas, que es mostrada en la barra de ttulo de la ventana. Si la ventana es un control, ste ser el texto mostrado en el control. dwStyle: Un nmero de 32 bits que describe las opciones de estilo que la ventana utiliza. Las constantes de estilo disponibles se listan en la Tabla 3-4. Las opciones de estilo se combinan mediante el operador booleano or, como por ejemplo en WS_HSCROLL or WS_VSCROLL. X: La posicin horizontal inicial de la esquina superior izquierda de la ventana. Para las ventanas superpuestas o emergentes, esta coordenada es relativa a la pantalla. Para las ventanas hijas, esta coordenada es relativa a la esquina superior izquierda del rea cliente de la ventana madre. Si se utiliza la constante CW_USEDEFAULT, Windows determina automticamente la posicin inicial del extremo superior izquierdo, y el parmetro Y es ignorado. La constante CW_USEDEFAULT es vlida nicamente para

ventanas superpuestas. Si se especifica para cualquier otro tipo de ventana se asignar cero a los parmetros X e Y. Y: La posicin vertical inicial de la esquina superior izquierda de la ventana. Para las ventanas superpuestas o emergentes, esta coordenada es relativa a la pantalla. Para las ventanas hijas, esta coordenada es relativa a la esquina superior izquierda del rea cliente de la ventana madre. Si una ventana superpuesta es creada con el estilo WS_VISIBLE y el parmetro X tiene el valor CW_USEDEFAULT, el parmetro Y es ignorado. nWidth: El ancho inicial de la ventana. Las ventanas superpuestas pueden utilizar la constante CW_USEDEFAULT, en cuyo caso el parmetro nHeight es ignorado. Si esta constante es utilizada, Windows selecciona un ancho y altura por defecto para la ventana. El ancho por defecto se extender desde la coordenada X inicial hasta el extremo derecho de la pantalla; la altura por defecto se extender desde la coordenada Y inicial hasta el inicio de la barra de tareas. Si se especifica el valor CW_USEDEFAULT para ventanas emergentes o hijas, a los parmetros nWidth y nHeight se les asignar el valor cero. nHeight: La altura inicial de la ventana. Si el parmetro nWidth tiene valor CW_USEDEFAULT, el parmetro nHeight es ignorado. hWndParent: El manejador de la madre o propietaria de la ventana. Se deber especificar un manejador vlido si se trata de una ventana hija o que tiene asignado una propietaria. Las ventanas hijas estn confinadas al rea cliente de su ventana madre. Una ventana con propietaria es una ventana superpuesta o hija que ser destruida cuando su propietaria lo sea y escondida cuando su propietaria sea minimizada; siempre se muestra encima de su ventana propietaria. El parmetro puede ser nil si la ventana no tiene una propietaria. Si no se especifica una ventana madre, la ventana no ser destruida automticamente cuando la aplicacin finalice. La funcin DestroyWindow deber utilizarse en ese caso para destruir la ventana. Este parmetro deber contener un manejador vlido si se hace uso de la opcin WS_CHILD; es opcional si se utiliza el estilo WS_POPUP. hMenu: Un manejador de objeto de men. Para una ventana superpuesta o emergente, el parmetro puede ser nil si se desea utilizar el men de la clase. Para los controles, a este parmetro se le asigna un valor entero que servir como identificador del control. Todos los mensajes WM_COMMAND llevarn asociado ese identificador cuando se produzca alguna accin sobre el control. El identificador de ventana hija deber ser nico entre todas las ventanas hijas de una misma ventana madre. hInstance: La instancia de la aplicacin o mdulo que crea la ventana. lpParam: Un puntero a datos definidos por la aplicacin que se utiliza durante el proceso de creacin de la ventana. El procedimiento de ventana recibe un mensaje WM_CREATE cuando la funcin CreateWindow es llamada. El campo miembro lParam de este mensaje contendr un puntero a un registro de tipo TCreateStruct. El campo lpCreateParams del registro TCreateStruct contendr el puntero a los datos

definidos por la aplicacin. Para las ventanas MDICLIENT, pase un puntero a un TClientCreateStruct en este parmetro. Si no se necesita informacin adicional para la creacin de la ventana, asigne nil a este parmetro. Consulte la funcin CreateWindow para ms informacin.

Si la funcin tiene xito, devuelve un manejador de la nueva ventana; en caso contrario, devuelve cero. Para obtener informacin sobre el error que pueda presentarse, utilice la funcin GetLastError.

CreateDialog, CreateWindow, CreateMDIWindow, DestroyWindow, DialogBox, MessageBox, RegisterClassEx, ShowWindow, WM_COMMAND, WM_CREATE, WM_GETMINMAXINFO, WM_NCCALCSIZE, WM_NCCREATE, WM_PAINT

El siguiente ejemplo muestra cmo crear una ventana con un borde hundido y un botn para ayuda sensible al contexto. Los botones de minimizacin y maximizacin deben ser eliminados para que no oscurezcan el botn de ayuda. Este ejemplo muestra adems cmo utilizar las funciones DestroyWindow, RegisterClassEx y UnregisterClass.

var

function var begin

or

nil

end procedure begin if not begin end or then

not not

and and

Nil

if begin end else begin

then

end end procedure begin

end

DestroyWindow( hWnd: HWND ): BOOL;

{manejador de ventana} {devuelve TRUE o FALSE}

Esta funcin se utiliza para destruir ventanas creadas con las funciones CreateWindow o CreateWindowEx, o cuadros de dilogo no modales creados con la funcin CreateDialog. Las ventanas hijas de la ventana especificada son destruidas primero; a continuacin se destruye el men de la ventana; se vacan las colas de mensaje de hilos, se destruyen los temporizadores activos, se elimina la propiedad del portapapeles, y se rompe la cadena de visores del portapapeles si la ventana a destruir est en el tope de dicha cadena. Si se utiliza esta funcin para destruir la ventana principal de una aplicacin, su ejecucin causar la finalizacin de esa aplicacin. Los mensajes WM_DESTROY y WM_NCDESTROY son enviados a la ventana antes de que sta sea destruida para desactivarla y quitarle el foco. Esta funcin NO puede utilizarse para destruir una ventana creada por un hilo diferente. Si la ventana que se va a destruir es una ventana hija y no fue creada con el estilo WS_EX_NOPARENTNOTIFY, se enviar un mensaje WM_PARENTNOTIFY a su ventana madre.

hWnd: Manejador de la ventana a destruir.

Si la ventana es destruida, la funcin devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin detallada sobre el error que pueda presentarse, utilice la funcin GetLastError.

CreateDialog, CreateWindow, CreateWindowEx, UnregisterClass, WM_DESTROY, WM_NCDESTROY, WM_PARENTNOTIFY

Consulte el Listado 3-10 (funcin CreateWindowEx).

RegisterClass( const lpWndClass: TWndClass ): ATOM;

{registro que describe una clase de ventana} {devuelve un tomo nico}

RegisterClass se utiliza para crear controles Windows personalizados y clases anteriormente no existentes para nuevas ventanas. La misma clase puede utilizarse en lo sucesivo para crear cualquier cantidad de ventanas de la aplicacin. Todas las clases de ventana que una aplicacin registra son olvidadas cuando la aplicacin finaliza.

lpWndClass:Un registro del tipo TWndClass, que se define de la siguiente forma: TWndClass = packed record Style: UINT; lpfnWndProc: TFNWndProc; cbClsExtra: Integer; cbWndExtra: Integer; hInstance: HINST; hIcon: HICON; hCursor: HCURSOR; hbrBackground: HBRUSH; lpszMenuName: PAnsiChar; lpszClassName: PAnsiChar; end; {opciones de estilo de la ventana} {puntero al procedimiento de ventana} {memoria extra para la clase} {memoria extra para las ventanas} {manejador de instancia de aplicacin} {manejador de icono} {manejador de cursor} {manejador de brocha para el fondo} {nombre del men} {nombre de la clase}

Style: Define algunos de los comportamientos implcitos de las ventanas de la clase. Las constantes de estilo disponibles se listan en la Tabla 3-6, y pueden ser combinadas mediante el operador or, como por ejemplo en CS_DBLCLKS or CS_NOCLOSE. lpfnWndProc: La direccin de una funcin de respuesta definida por la aplicacin, conocida como procedimiento de ventana, que procesa los mensajes que se enven a las ventanas de esta clase. La sintaxis de esta funcin de respuesta se define ms adelante. cbClsExtra: Especifica el nmero de bytes extra a reservar a continuacin de la estructura que describe la clase de ventana. Este espacio puede ser utilizado por el programador para almacenar cualquier informacin adicional que se requiera. Para acceder a esta zona de memoria se debern utilizar las funciones SetClassLong y GetClassLong. Windows inicializa esos bytes a cero. Slo Windows 95/98: La funcin RegisterClass fallar si el valor de este parmetro es superior a 40 bytes. cbWndExtra: Especifica el nmero de bytes extra a reservar a continuacin de la estructura que describe a cualquier instancia de la ventana. Este espacio puede ser utilizado por el programador para almacenar cualquier informacin adicional sobre la ventana que se requiera. Para acceder a esta zona de memoria se debern utilizar las funciones SetWindowLong y GetWindowLong. Windows inicializa esos bytes a ceros. Si una aplicacin utiliza el registro TWndClass para registrar un cuadro de dilogo creado mediante la directiva CLASS en un fichero de recursos, a este campo deber asignarse el valor DLGWINDOWEXTRA. Slo

Windows 95/98: La funcin RegisterClass fallar si el valor de este parmetro es superior a 40 bytes. hInstance: El manejador de la instancia que contiene el procedimiento de ventana de esta clase. hIcon: El manejador de un recurso de tipo icono que ser utilizado cuando una ventana de esta clase sea minimizada. Si se asigna cero a este campo, la ventana utilizar el icono con el logotipo de Windows. hCursor: El manejador de un recurso de cursor de ratn. Si se asigna cero a este campo, la aplicacin es la responsable de establecer un cursor cuando el ratn entre en el rea de la ventana. Por defecto se utilizar un cursor estndar de flecha. hbrBackground: El manejador de una brocha que ser utilizada para rellenar el fondo de cualquier ventana de esta clase. Cualquiera de los colores de sistema que se listan en la Tabla 3-7 pueden utilizarse en lugar del manejador de brocha. Las brochas de relleno de fondo son eliminadas automticamente cuando la clase es destruida. Si se asigna cero a este campo, la aplicacin ser la responsable de dibujar su fondo cuando se le solicite actualizar su rea cliente. Para determinar si el fondo debe ser rellenado, la aplicacin deber tratar el mensaje WM_ERASEBKGND, o bien comprobar el valor del campo fErase de la estructura TPaintStruct rellenada por la funcin BeginPaint. lpszMenuName: Un puntero a una cadena de caracteres terminada en cero que contiene el nombre del recurso de men (tal como aparece en un fichero de recurso) asociado a las ventanas de la clase. Si se utiliza un nmero entero para identificar al men, se deber llamar a la funcin MakeIntResource para convertirlo en una cadena. Asigne nil a este campo si las ventanas de esta clase no tienen un men implcito. lpszClassName: Bien un puntero a una cadena de caracteres terminada en cero que describe el nombre de la clase, o un tomo. Si se especifica un tomo, este deber haber sido creado mediante una llamada a GlobalAddAtom. El tomo, un entero de 16 bits, deber ir situado en la palabra baja de lpClassName, mientras que la palabra alta deber contener cero. Este valor se utiliza en el parmetro lpClassName de la funcin CreateWindow.

Si la funcin tiene xito, devuelve un tomo que identifica nicamente a la nueva clase de ventana. En caso contrario, la funcin devuelve cero. Para obtener informacin adicional sobre el error que pueda presentarse, utilice la funcin GetLastError.

function WindowProc( hWnd: HWND; uMsg: UINT; wParam: WPARAM;

{manejador de ventana} {identificador de mensaje} {informacin adicional (32 bits)}

lParam: LPARAM ): LongInt;

{ms informacin adicional (32 bits en Win32)} {devuelve un entero de 32 bits}

Se trata de una funcin de respuesta definida por la aplicacin, que procesar los mensajes que se enven a las ventanas de la clase, tradicionalmente mediante una sentencia case. Esta funcin podr realizar cualquier tratamiento que se estime necesario.

hWnd: El manejador de la ventana que recibe el mensaje. uMsg: El identificador del mensaje. wParam: Un valor de 32 bits que depende del tipo de mensaje recibido. lParam: Un valor de 32 bits que depende del tipo de mensaje recibido.

El valor que devuelve el procedimiento de ventana depende del mensaje que ha sido recibido y del resultado del tratamiento del mensaje.

CreateWindow, CreateWindowEx, GetClassInfo, GetClassLong, GetClassName, RegisterClassEx, SetClassLong, UnregisterClass

Consulte el Listado 3-9, correspondiente a la funcin CreateWindow.

RegisterClassEx( const WndClass: TWndClassEx ): ATOM;

{registro de clase de ventana extendida} {devuelve un tomo nico}

Esta funcin es idntica a RegisterClass, con la diferencia de que se aaden dos miembros adicionales al tipo TWndClass. Uno de ellos especifica el tamao en bytes del registro TWndClassEx, mientras que el otro permite que se especifique un icono pequeo que se utilizar en la barra de ttulo de las ventanas de la clase.

WndClass: Una variable de tipo TWndClassEx, que se define de la siguiente forma: TWndClassEx = packed record cbSize: UINT; Style: UINT; lpfnWndProc: TFNWndProc; cbClsExtra: Integer; cbWndExtra: Integer; hInstance: HINST; hIcon: HICON; hCursor: HCURSOR; hbrBackground: HBRUSH; lpszMenuName: PAnsiChar; lpszClassName: PAnsiChar; hIconSm: HICON; end; {tamao del registro} {opciones de estilo de la clase} {puntero a procedimiento de ventana} {memoria extra para la clase} {memoria extra para las ventanas} {manejador de instancia de aplicacin} {manejador de icono} {manejador de cursor} {manejador de brocha para fondo} {nombre del men} {nombre de la clase} {manejador de icono pequeo}

Note que el registro TWndClassEx es idntico a TWndClass, con el campo cbSize aadido al inicio y el campo hIconSm al final. Consulte la funcin RegisterClass para ver la descripcin del resto de los miembros de esta estructura de datos. cbSize: Especifica el tamao en bytes del registro TWndClassEx, y puede siempre inicializarse con una construccin del tipo SizeOf(TWndClassEx). Consulte la funcin GetClassInfoEx para ms informacin. hIconSm: El manejador de un icono pequeo que ser mostrado en la barra de ttulo de las ventanas de la clase.

Si la funcin tiene xito, devuelve un tomo que identifica nicamente la nueva clase de ventana; en caso contrario, la funcin devuelve cero. Para obtener informacin adicional sobre cualquier error que pueda presentarse, utilice la funcin GetLastError.

CreateWindow, CreateWindowEx, GetClassInfoEx, GetClassLong, GetClassName, RegisterClass, SetClassLong, UnregisterClass

Consulte el Listado 3-10, correspondiente a la funcin CreateWindowEx.

UnregisterClass( lpClassName: PChar; hInstance: HINST ): BOOL;

{puntero al nombre de la clase} {manejador de instancia de mdulo} {devuelve TRUE o FALSE}

Esta funcin elimina una clase previamente registrada mediante las funciones RegisterClass o RegisterClassEx. La memoria reservada por esas funciones es liberada. Esta funcin se utiliza mientras la aplicacin est an ejecutndose. La aplicacin debe destruir todas la ventanas de la clase a eliminar antes de llamar a esta funcin. Cualquier clase de ventana que sea registrada por una aplicacin ser eliminada automticamente cuando la aplicacin finalice su ejecucin.

lpClassName: Un puntero a una cadena de caracteres terminada en nulo que contiene el nombre de la clase, o bien un tomo entero. Si se especifica un tomo, ste deber haber sido creado mediante una llamada a GlobalAddAtom. El tomo, un valor de 16 bits con un valor inferior a $C000, debe colocarse en la palabra baja de lpClassName, y la palabra alta deber contener cero. Las clases globales del sistema, tales como los cuadros de dilogo, no pueden ser eliminadas hInstance: El manejador de instancia del mdulo que cre la clase.

Si la funcin tiene xito, devuelve TRUE; en caso contrario, retorna FALSE. Esta funcin fallar si la clase no puede ser hallada o si existen ventanas de la clase. Para obtener informacin detallada sobre cualquier error que pueda producirse, utilice la funcin GetLastError.

RegisterClass, RegisterClassEx.

Consulte el Listado 3-10, asociado a la funcin CreateWindowEx.

Uno de los elementos claves que diferencian la programacin en Windows de la programacin en DOS es el concepto de aplicacin dirigida por eventos. La arquitectura centrada en la gestin de eventos se implementa en base a mensajes que se intercambian entre el sistema operativo y la aplicacin. Un mensaje indica a la aplicacin o al sistema operativo que algo ha sucedido, y que algn tipo de tratamiento debe tener lugar como resultado de ese evento. La amplia mayora de los mensajes que se envan a una aplicacin son el resultado directo de las acciones del usuario, como por ejemplo el movimiento del ratn, la pulsacin sobre un botn o barra de desplazamiento, o la activacin de otra aplicacin; pero los eventos internos que ocurren dentro del sistema pueden tambin provocar un mensaje, como ocurre por ejemplo cuando la configuracin del sistema cambia como consecuencia de la insercin o extraccin de una tarjeta de expansin. En el corazn de todo programa Win dows existe un bucle compacto que recupera esos mensajes y los despacha hacia los procedimientos de ventana correspondientes. Afortunadamente, Delphi se encarga automticamente de la gestin de estos mensajes a travs del objeto Application.

Cada hilo tiene su propia cola de mensajes. Una cola puede concebirse como una estructura de tipo FIFO (primero que entra, primero que sale), dado que los mensajes se procesan en el orden en que van siendo recibidos. Esto tiene lugar en el bucle de mensajes, situado en la funcin WinMain de cualquier aplicacin tradicional de Windows. Este bucle de mensajes se implementa en Delphi como el mtodo ProcessMessages de la clase TApplication. Esta funcin ejecuta un bucle cerrado que extrae continuamente mensajes de la cola de mensajes y los enva, despus del filtrado necesario, a sus procedimientos de ventana correspondientes. En la unidad Forms del cdigo fuente de la VCL puede verse que el bucle de mensajes de toda aplicacin Delphi se implementa de la siguiente forma:

procedure begin while end function var begin if begin if begin if if not not begin end end else end end

do

then then then and not and not

and not then

and

Una aplicacin podra establecer su propio bucle de mensajes simplemente creando un bucle que llame continuamente a GetMessage o PeekMessage, TranslateMessage si es necesario, y DispatchMessage, hasta que reciba un mensaje especfico que indique que el bucle debe finalizar. De hecho, esta es la forma en que Delphi implementa los cuadros de dilogo modales. An cuando el hilo principal de cualquier aplicacin obtiene automticamente una cola de mensajes, cada hilo individual que la aplicacin cree podr tener su propia cola de mensajes. Un hilo crea una cola de mensajes la primera vez que llame a cualquiera de las funciones en GDI32.DLL o USER32.DLL. Una vez que un hilo ha creado su propia cola de mensajes, deber implementar un bucle de mensajes basado en GetMessage o PeekMessage, y recibir los mensajes que se le enven mediante la funcin del API PostThreadMessage.

Una aplicacin puede interceptar los mensajes que le lleguen a ella o a otras aplicaciones utilizando las llamadas funciones gancho (hook functions). Una funcin gancho se instala mediante una llamada a SetWindowsHookEx y se desinstala mediante una llamada a UnhookWindowsHookEx. Mltiples funciones gancho podrn ser instaladas por una o varias aplicaciones, formando una cadena de funciones que interceptarn mensajes de tipos especficos. La ltima funcin gancho que se instale se convertir en la primera funcin en la cadena de ganchos, y recibir los mensajes antes que las otras funciones gancho que formen parte de la cadena. Una funcin gancho instalada recibir los mensajes indicados por el tipo de gancho de que se trate antes que el procedimiento de ventana de destino. Si una funcin gancho no gestiona un mensaje que ha recibido, deber enviarlo a las restantes funciones gancho en la cadena mediante una llamada a CallNextHookEx. Una funcin gancho que intercepta mensajes para una sola aplicacin puede residir en el cdigo fuente de dicha aplicacin. Sin embargo, una funcin gancho que intercepte mensajes de varias aplicaciones diferentes deber colocarse en una librera de enlace dinmico independiente.

Los mensajes permiten a las aplicaciones comunicarse entre s mediante el uso de las funciones PostMessage, SendMessage y otras similares. Dos aplicaciones pueden crear un nuevo identificador de mensajes simplemente aadiendo un mismo valor constante a WM_USER (por ejemplo, WM_NewMessage = WM_USER+1), y utilizar este nuevo identificador de mensaje para intercambiar informacin en ambas direcciones. Sin embargo, tenga en cuenta que PostMessage, SendMessage y otras funciones pueden emitir un mensaje a todas las ventanas del sistema. Si este mensaje definido por el usuario es enviado a todas las aplicaciones, es posible que otras aplicaciones puedan contener un gestor del mismo mensaje, lo cual podra causar resultados inesperados. Por esta razn, es preferible que el programador registre siempre los mensajes que vaya a utilizar para la comunicacin entre procesos a travs de la funcin RegisterWindowMessage. A partir de una cadena de caracteres nica, esto garantizar que solamente aquellas aplicaciones que registren la misma cadena utilizando RegisterWindowMessage recibirn el mensaje en cuestin.

En este captulo se describen las siguientes funciones de gestin de mensajes:

BroadcastSystemMessage( Flags: DWORD; Recipients: PDWORD; uiMessage: UINT; wParam: WPARAM; lParam: LPARAM ): LongInt;

{opciones de envo de mensaje} {opciones que indican destinatarios del mensaje} {identificador del mensaje} {valor de 32 bits especfico del mensaje} {valor de 32 bits especfico del mensaje} {devuelve un valor de 32 bits}

Esta funcin enva el mensaje especificado a todos los destinatarios indicados. A diferencia de las funciones SendMessage, mediante esta funcin pueden enviarse mensajes a aplicaciones, controladores y componentes del sistema operativo. Si no se especifica el valor BSF_QUERY en el parmetro Flags, la funcin ignora los valores de retorno que devuelvan los destinatarios.

Flags: Especifica las opciones de envo del mensaje. Puede tomar uno o ms de los valores listados en la Tabla 4-2. Recipients: Un puntero a una variable de tipo DWORD que contiene opciones que indican a quines se enviar el mensaje. Cuando la funcin retorna, esta variable contendr un valor que indicar qu destinatarios recibieron el mensaje. La variable contendr uno o ms de los valores que se listan en la Tabla 4-3. Si al parmetro se asigna el valor nil, el mensaje ser enviado a todos y cada uno de los componentes del sistema. uiMessage: El identificador del mensaje que se enva. wParam: Un valor de 32 bits dependiente del mensaje que se enva. lParam: Un valor de 32 bits dependiente del mensaje que se enva.

Si la funcin se ejecuta satisfactoriamente, devuelve un valor positivo; en caso contrario, devuelve 1. Si el parmetro Flags tiene el valor BSF_QUERY y al menos uno de los destinatarios devuelve el valor BROADCAST_QUERY_DENY al recibir el mensaje, la funcin devuelve cero.

RegisterWindowMessage, SendMessage

Consulte el Listado 4-2, correspondiente a la funcin CallWindowProc.

nil

CallNextHookEx( hhk: HHOOK; nCode: Integer; wParam: WPARAM; lParam: LPARAM ): LRESULT;

{manejador de la funcin gancho actual} {cdigo del gancho} {valor de 32 bits especfico de la funcin gancho} {valor de 32 bits especfico de la funcin gancho} {valor devuelto por el prximo gancho en la cadena}

Esta funcin pasa la informacin especificada a la siguiente funcin gancho de la cadena actual. A menos que se especifique lo contrario, llamar a CallNextHookEx es opcional. Una aplicacin puede llamar a esta funcin dentro de una funcin gancho antes o despus de procesar la informacin recibida. Si CallNextHookEx no es llamada, Windows no llamar a las siguientes funciones gancho de la cadena (aquellas que fueron instaladas antes que la funcin gancho actual).

hhk: El manejador que identifica a la funcin gancho actual. Es el valor que se recibi de SetWindowsHookEx cuando la funcin gancho fue instalada originalmente. nCode: Especifica el cdigo que fue pasado a la funcin gancho actual. Este cdigo ser usado por la siguiente funcin gancho para saber cmo tratar la informacin que recibe. wParam: Especifica el valor del parmetro wParam pasado a la funcin gancho actual. El significado de este valor depende del tipo de gancho asociado a la cadena de funciones gancho actual. lParam: Especifica el valor del parmetro lParam pasado a la funcin gancho actual. El significado de este valor depende del tipo de gancho asociado a la cadena de funciones gancho actual.

Si la funcin se ejecuta satisfactoriamente, devuelve el valor de retorno de la siguiente funcin gancho de la cadena. Este valor deber a su vez ser devuelto por la funcin gancho actual. El significado del valor de retorno depende del tipo de gancho asociado con la cadena de ganchos actual. Si la funcin falla, devuelve cero.

SetWindowsHookEx, UnhookWindowsHookEx

Consulte el Listado 4-15, asociado a la funcin SetWindowsHookEx.

CallWindowProc( lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM ): LRESULT;

{puntero a procedimiento de ventana anterior} {manejador de ventana} {identificador del mensaje a enviar} {valor de 32 bits especfico del mensaje} {valor de 32 bits especfico del mensaje} {devuelve un valor especfico del mensaje}

Esta funcin enva el mensaje especificado y sus parmetros asociados al procedimiento de ventana apuntado por el parmetro lpPrevWndFunc. Una aplicacin deber utilizar esta funcin en el procedimiento de ventana de cualquier ventana subclasificada para pasar los mensajes no tratados al procedimiento de ventana original.

lpPrevWndFunc: Puntero al procedimiento de ventana de la ventana que ha sido subclasificada. Este valor es devuelto por las funciones SetClassLong o SetWindowLong cuando una ventana es subclasificada, o puede obtenerse llamando a GetClassLong o GetWindowLong con el valor de ndice adecuado para recuperar la direccin del procedimiento de ventana. hWnd: Manejador de la ventana asociada con el procedimiento de ventana apuntado por el parmetro lpPrevWndFunc. Msg: El identificador del mensaje a enviar al procedimiento de ventana. wParam: Un valor de 32 bits dependiente del mensaje que se enva. lParam: Un valor de 32 bits dependiente del mensaje que se enva.

El valor devuelto por esta funcin es el resultado del tratamiento del mensaje, y vara en dependencia del mensaje de que se trate.

GetClassLong, GetWindowLong, SetClassLong, SetWindowLong

Esta aplicacin enva un mensaje:


procedure

var begin

or end procedure begin end

Y esta aplicacin recibe el mensaje:


function stdcall var

implementation function var begin if begin then

for begin end

to

do

end else end procedure begin

end procedure begin end

DefFrameProc( hWnd: HWND; hWndMDIClient: HWND;

{manejador del marco MDI} {manejador de la ventana cliente MDI}

uMsg: UINT; wParam: WPARAM; lParam: LPARAM ): LRESULT;

{identificador del mensaje a enviar} {valor de 32 bits especfico del mensaje} {valor de 32 bits especfico del mensaje} {devuelve un valor especfico del mensaje}

Esta funcin ofrece un tratamiento por defecto para cualquier mensaje no gestionado por el procedimiento de ventana de una ventana marco MDI. Los mensajes que no sean tratados especficamente por el marco MDI debern ser pasados a la funcin DefFrameProc.

hWnd: Manejador de la ventana marco MDI. hWndMDIClient: Manejador de la ventana cliente MDI. uMsg: Identificador del mensaje a enviar. wParam: Valor de 32 bits especfico del mensaje que se enva. lParam: Valor de 32 bits especfico del mensaje que se enva.

El valor que devuelve esta funcin es el resultado del tratamiento del mensaje que se enva y depende del mensaje en cuestin.

CallWindowProc, DefMDIChildProc, DefWindowProc

program uses var

const

function stdcall var begin case

of begin

Nil or or

if begin

then nil

end

end begin end else

end end function stdcall begin case of begin

end else end end function var begin or

nil

end function var begin or

nil

end begin if not begin end then nil

or

Nil

if begin end else

then

begin nil end if not begin end then nil

if begin end else begin

then

4
nil

end while begin end end do

DefMDIChildProc( hWnd: HWND; uMsg: UINT;

{manejador de ventana hija MDI} {identificador del mensaje a enviar}

wParam: WPARAM; lParam: LPARAM ): LRESULT;

{valor de 32 bits especfico del mensaje} {valor de 32 bits especfico del mensaje} {devuelve un valor especfico del mensaje}

Esta funcin ofrece un tratamiento por defecto a cualquier mensaje no tratado por una ventana hija MDI. Los mensajes que no sean gestionados explcitamente por el procedimiento de ventana de la ventana hija MDI debern ser pasados a la funcin DefMDIChildProc. Esta funcin asume que la ventana madre de la ventana representada por el manejador hWnd ha sido creada utilizando la clase MDICLIENT.

hWnd: El manejador de la ventana hija. uMsg: El identificador del mensaje a enviar. wParam: Valor de 32 bits especfico del mensaje que se enva. lParam: Valor de 32 bits especfico del mensaje que se enva.

El valor que devuelve esta funcin es el resultado del tratamiento del mensaje que se enva y depende del mensaje en cuestin.

CallWindowProc, DefFrameProc, DefWindowProc

Consulte el Listado 4-3, relativo a la funcin DefFrameProc.

DefWindowProc( hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM ): LRESULT;

{manejador de ventana} {identificador del mensaje a enviar} {valor de 32 bits especfico del mensaje} {valor de 32 bits especfico del mensaje} {devuelve un valor especfico del mensaje}

Esta funcin ofrece un tratamiento por defecto para cualquier mensaje que no sea gestionado por el procedimiento de ventana de una aplicacin. Los mensajes que no sean explcitamente tratados por el procedimiento de ventana de la aplicacin debern

ser pasados a la funcin DefWindowProc. Esta funcin asegura que todos los mensajes Windows son procesados.

hWnd: El manejador de la ventana. Msg: El identificador del mensaje a enviar. wParam: Valor de 32 bits especfico del mensaje que se enva. lParam: Valor de 32 bits especfico del mensaje que se enva.

El valor que devuelve esta funcin es el resultado del tratamiento del mensaje y depende del mensaje en cuestin.

CallWindowProc, DefFrameProc, DefMDIChildProc

Consulte el Listado 4-4, correspondiente a la funcin GetMessage.

4
DispatchMessage( const lpMsg: TMsg ): LongInt; {puntero a un registro de mensaje TMsg} {devuelve un valor especfico del mensaje}

Esta funcin enva (despacha) el mensaje especificado a un procedimiento de ventana. El valor que necesita el parmetro lpMsg es suministrado casi siempre por la funcin GetMessage. La funcin DispatchMessage es utilizada en el bucle de mensajes de cualquier aplicacin Windows.

lpMsg: Un puntero a un registro de descripcin de mensaje. Este registro se pasa generalmente como parmetro a las funciones GetMessage o PeekMessage antes de enviarlo a DispatchMessage. El registro TMsg se define de la siguiente forma: TMsg = packed record hwnd: HWND; message: UINT; wParam: WPARAM; lParam: LPARAM; {manejador de la ventana que recibe el mensaje} {identificador del mensaje} {valor de 32 bits especfico del mensaje} {valor de 32 bits especfico del mensaje}

time: DWORD; pt: TPoint; end;

{hora a la que el mensaje fue enviado} {posicin del cursor del ratn}

hwnd: El manejador de la ventana cuyo procedimiento de ventana recibe el mensaje. mes sage: El identificador del mensaje. wParam: Valor de 32 bits especfico del mensaje. lParam: Valor de 32 bits especfico del mensaje. Si el campo message tiene el valor WM_TIMER y el parmetro lParam del mensaje WM_TIMER es diferente de cero, lParam contendr un puntero a la funcin que ser llamada en vez del procedimiento de ventana. time: La hora a la que el mensaje fue enviado. pt: Un registro de tipo Tpoint que contiene la posicin del cursor del ratn en el momento en que el mensaje fue emitido, en coordenadas de pantalla.

El valor que devuelve esta funcin es el resultado del tratamiento del mensaje que se enva y depende del mensaje en cuestin.

GetMessage, PeekMessage, PostMessage, TranslateMessage

Consulte el Listado 4-4, correspondiente a la funcin GetMessage.

GetMessage( var lpMsg: TMsg; hWnd: HWND; wMsgFilterMin: UINT; wMsgFilterMax: UINT ): BOOL;

{puntero a registro de mensaje TMsg} {manejador de la ventana cuyos mensajes se recuperan} {lmite inferior del rango de mensajes a recuperar} {lmite superior del rango de mensajes a recuperar} {devuelve TRUE o FALSE}

Esta funcin recupera la informacin relativa al prximo mensaje situado en la cola de mensajes de un hilo. La informacin sobre el mensaje se almacena en el registro de tipo TMsg al que apunta el parmetro lpMsg. El mensaje recuperado es eliminado de la cola a menos de que se trate de un mensaje WM_PAINT, que es eliminado de la cola slo despus de que el mensaje sea procesado mediante las funciones BeginPaint y EndPaint. Se le puede indicar a GetMessage que recupere nicamente los mensajes

situados dentro de un rango especfico, pero si los parmetros wMsgFilterMin y wMsgFilterMax tienen ambos valor cero, GetMessage recuperar todos los mensajes disponibles. Las constantes WM_KEYFIRST y WM_KEYLAST pueden utilizarse para recuperar nicamente mensajes de entrada desde el teclado, y las constantes WM_MOUSEFIRST y WM_MOUSELAST, para recuperar nicamente los mensajes de ratn. Esta funcin no permite recuperar mensajes de ventanas pertenecientes a otros hilos o aplicaciones. En caso de que la cola de mensajes est vaca en el momento de la llamada a GetMessage, la funcin no retorna hasta que no se coloque un mensaje en la cola de mensajes.

lpMsg: Un puntero a un registro de informacin de mensaje. En este registro se recibe la informacin del mensaje recuperado de la cola de mensajes del hilo que hace la llamada. El registro TMsg se define de la siguiente forma: TMsg = packed record hwnd: HWND; message: UINT; wParam: WPARAM; lParam: LPARAM; time: DWORD; pt: TPoint; end; {manejador de la ventana que recibe el mensaje} {identificador del mensaje} {valor de 32 bits especfico del mensaje} {valor de 32 bits especfico del mensaje} {hora a la que el mensaje fue enviado} {posicin del cursor del ratn}

Note que el campo hWnd de los mensajes emitidos por el hilo activo mediante la funcin PostThreadMessage ser cero. Consulte la funcin DispatchMessage para conocer ms detalles sobre este registro. hWnd: El manejador de la ventana cuyos mensajes sern recuperados. Si este valor es cero, GetMessage recupera mensajes de cualquier ventana cuyo propietario sea el hilo actual, incluyendo los mensajes enviados a ste mediante la funcin PostThreadMessage. wMsgFilterMin: El identificador del mensaje de menor valor a ser recuperado. wMsgFilterMax: El identificador del mensaje de mayor valor a ser recuperado.

Si la funcin se ejecuta satisfactoriamente y no recupera el mensaje WM_QUIT, devuelve TRUE. Si la funcin falla, o recupera de la cola el mensaje WM_QUIT, entonces devuelve FALSE.

PeekMessage, PostMessage, PostThreadMessage, WaitMessage

program uses

function stdcall begin case of begin end begin

end else end end function var begin or

nil

end

var

begin if not begin end then nil

Nil

if begin end while begin end end

then nil

4
do

GetMessageExtraInfo: LongInt;

{devuelve un valor definido por la aplicacin}

Esta funcin devuelve el valor de 32 bits definido por la aplicacin asociado con el ltimo mensaje recuperado por las funciones GetMessage o PeekMessage. Este valor se especifica mediante la funcin SetMessageExtraInfo.

Si la funcin se ejecuta satisfactoriamente, devuelve el valor de 32 bits definido por la aplicacin asociado con el ltimo mensaje recuperado con las funciones GetMessage o PeekMessage. Si la funcin falla, devuelve cero.

GetMessage, PeekMessage, SetMessageExtraInfo

const type class procedure private public procedure end var implementation var message

procedure begin

end procedure begin var

end

GetMessagePos: DWORD;

{devuelve la posicin del ratn}

Esta funcin devuelve la posicin horizontal y vertical, en coordenadas de pantalla, del cursor del ratn en el momento en que se produjo el ltimo mensaje recuperado por la funcin GetMessage. La posicin horizontal del ratn se encuentra en la palabra baja del valor devuelto, y la posicin vertical en la palabra alta.

Si la funcin se ejecuta satisfactoriamente, devuelve la posicin horizontal y vertical del cursor del ratn en el momento en que se produjo el ltimo mensaje recuperado por la funcin GetMessage. Si la funcin falla, devuelve cero.

GetCursorPos, GetMessage, GetMessageTime, PeekMessage

Consulte el Listado 4-4, correspondiente a la funcin GetMessage.

GetMessageTime: LongInt;

{devuelve la hora en que el mensaje fue creado}

Esta funcin recupera el tiempo transcurrido, en milisegundos, desde el momento en que el sistema fue arrancado hasta el momento en que fue colocado en la cola de mensajes del hilo el ltimo mensaje recuperado por GetMessage.

Si la funcin se ejecuta satisfactoriamente, devuelve el tiempo transcurrido, en milisegundos, desde el momento en que el sistema fue arrancado hasta el momento en que fue colocado en la cola de mensajes del hilo el ltimo mensaje recuperado por GetMessage. Si la funcin falla, devuelve cero.

GetMessage, GetMessagePos, PeekMessage

Consulte el Listado 4-4, correspondiente a la funcin GetMessage.

GetQueueStatus( flags: UINT ): DWORD

{opciones de estado de la cola de mensajes} {devuelve el estado de la cola de mensajes}

Esta funcin devuelve un conjunto de banderas que indican los tipos de mensajes que se encuentran en la cola de mensajes del hilo que hace la llamada. Sin embargo, si el valor que esta funcin devuelve indica que hay un mensaje en la cola actualmente, esto no garantiza que las funciones GetMessage o PeekMessage devolvern el mensaje, por cuanto estas funciones realizan ciertos tipos de filtrado que pueden consumir internamente algunos mensajes.

flags: Especifica los tipos de mensajes a verificar en la cola de mensajes del hilo que hace la llamada. Este parmetro puede ser una combinacin de los valores que se muestran en la Tabla 4-4.

Si la funcin se ejecuta satisfactoriamente, devuelve un valor DWORD. La palabra alta de este valor contiene una combinacin de valores que indican los tipos de mensajes situados actualmente en la cola de mensajes. La palabra baja del valor de retorno contiene una combinacin de valores que indican los tipos de mensajes que han sido aadidos a la cola de mensajes desde la ltima llamada a cualquiera de las funciones GetQueueStatus, GetMessage o PeekMessage. Si la funcin falla, o no hay mensajes en la cola, la funcin devuelve cero.

GetInputState, GetMessage, PeekMessage

procedure var begin

end function begin if then if then if then if then if then if then if then if then if then end and and and and and and and and and String

InSendMessage: BOOL;

{devuelve TRUE o FALSE}

Esta funcin determina si el procedimiento de ventana est actualmente procesando un mensaje enviado por otro hilo mediante alguna de las funciones SendMessage.

Si la funcin se ejecuta satisfactoriamente y el procedimiento de ventana est procesando un mensaje que le ha sido enviado por otro hilo mediante alguna de las funciones SendMessage, devuelve TRUE. Si la funcin falla, o el procedimiento de ventana no est procesando un mensaje que le ha sido enviado por otro hilo mediante alguna de las funciones SendMessage, devuelve FALSE.

PostThreadMessage, PostMessage, ReplyMessage, SendMessage, SendMessageCallback, SendMessageTimeout

Consulte el Listado 4-11 (funcin RegisterWindowMessage) o el Listado 4-8 (PostMessage).

PeekMessage( var lpMsg: TMsg; hWnd: HWND; wMsgFilterMin: UINT; wMsgFilterMax: UINT; wRemoveMsg: UINT ): BOOL;

{puntero a registro de mensaje TMsg} {manejador de la ventana cuyos mensajes se recuperan} {lmite inferior del rango de mensajes a recuperar} {lmite superior del rango de mensajes a recuperar} {opciones de eliminacin de mensajes} {devuelve TRUE o FALSE}

Esta funcin recupera informacin acerca del prximo mensaje situado en la cola de mensajes del hilo. La informacin sobre el mensaje se almacena en el registro TMsg apuntado por el parmetro lpMsg. Se puede de manera opcional eliminar mensajes de la cola. Se le puede indicar a PeekMessage que recupere nicamente los mensajes situados dentro de un rango especfico, pero si los parmetros wMsgFilterMin y wMsgFilterMax tienen ambos valor cero, PeekMessage recuperar todos los mensajes

disponibles. Las constantes WM_KEYFIRST y WM_KEYLAST pueden utilizarse para recuperar nicamente mensajes de entrada desde el teclado, y las constantes WM_MOUSEFIRST y WM_MOUSELAST, para recuperar nicamente los mensajes de ratn. Esta funcin no permite recuperar mensajes de ventanas pertenecientes a otros hilos o aplicaciones. A diferencia de GetMessage, esta funcin retorna inmediatamente y no espera hasta que se coloque un mensaje en la cola si sta est vaca.

lpMsg: Un puntero a un registro de informacin de mensaje. En este registro se recibe la informacin del mensaje recuperado de la cola de mensajes del hilo que hace la llamada. El registro TMsg se define de la siguiente forma: TMsg = packed record hwnd: HWND; message: UINT; wParam: WPARAM; lParam: LPARAM; time: DWORD; pt: TPoint; end; {manejador de la ventana que recibe el mensaje} {identificador del mensaje} {valor de 32 bits especfico del mensaje} {valor de 32 bits especfico del mensaje} {hora a la que el mensaje fue enviado} {posicin del cursor del ratn}

Note que el campo hWnd de los mensajes emitidos por el hilo activo mediante la funcin PostThreadMessage ser cero. Consulte la funcin DispatchMessage para conocer ms detalles sobre este registro. hWnd: El manejador de la ventana cuyos mensajes sern recuperados. Si este valor es cero, PeekMessage recupera mensajes de cualquier ventana cuyo propietario sea el hilo actual, incluyendo los mensajes enviados a ste mediante la funcin PostThreadMessage. Si el valor de este parmetro es -1, PeekMessage recuperar nicamente los mensajes enviados al hilo mediante la funcin PostThreadMessage. wMsgFilterMin: El identificador del mensaje de menor valor a ser recuperado. wMsgFilterMax: El identificador del mensaje de mayor valor a ser recuperado. wRemoveMsg: Una bandera que indica si el mensaje debe o no ser eliminado de la cola de mensajes. Si el valor de este parmetro es PM_NOREMOVE, el mensaje no es eliminado de la cola. Si su valor es PM_REMOVE, el mensaje ser eliminado de la cola. Los mensajes de dibujo (WM_PAINT) normalmente no pueden ser eliminados; pero si un mensaje WM_PAINT indica una regin de actualizacin nula, PeekMessage puede eliminarlo de la cola.

Si la funcin se ejecuta satisfactoriamente y hay una mensaje disponible en la cola en el momento de la llamada, devuelve TRUE. Si la funcin falla, o no haba ningn mensaje disponible, devuelve FALSE.

GetMessage, PostMessage, PostThreadMessage, WaitMessage

procedure var begin if then

while not do begin

4
end end

PostMessage( hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM ): BOOL;

{manejador de ventana} {identificador del mensaje a enviar} {valor de 32 bits especfico del mensaje} {valor de 32 bits especfico del mensaje} {devuelve TRUE o FALSE}

Esta funcin coloca el mensaje indicado en la cola de mensajes del hilo propietario de la ventana especificada, retornando inmediatamente (sin esperar por el tratamiento del mensaje). Se debe ser cuidadoso al enviar mensajes cuyos parmetros contengan punteros: es posible que la funcin que emite el mensaje termine antes de que el hilo asociado a la ventana pueda procesarlo, y los punteros podran ser liberados antes de ser utilizados.

hWnd: Manejador de la ventana cuyo procedimiento de ventana recibe el mensaje especificado. Si este parmetro es cero, PostMessage funciona exactamente como una llamada a la funcin PostThreadMessage con el parmetro idThread igual al identificador del hilo que hace la llamada. Si este parmetro tiene el valor HWND_BROADCAST, el mensaje es enviado a todas las ventanas de alto nivel del sistema, incluyendo las ventanas deshabilitadas e invisibles. El mensaje no es enviado a las ventanas hijas. Las aplicaciones que necesiten enviar un mensaje definido por el usuario a otras aplicaciones mediante HWND_BROADCAST debern utilizar la funcin RegisterWindowMessage para obtener un identificador de mensaje nico. Msg: El identificador del mensaje a enviar. wParam: Valor de 32 bits especfico del mensaje que se enva. lParam: Valor de 32 bits especfico del mensaje que se enva.

Si la funcin se ejecuta satisfactoriamente, devuelve TRUE; en caso contrario, devuelve FALSE. Para obtener informacin adicional sobre el error que pueda producirse, utilice la funcin GetLastError.

GetMessage, PeekMessage, RegisterWindowMessage, SendMessage, SendMessageCallback, SendMessageTimeout, SendNotifyMessage

Esta aplicacin enva el mensaje:


procedure begin end procedure begin

end;

Esta aplicacin recibe el mensaje:


procedure var begin inherited if begin then var

if

then

for begin end

to

do

end end procedure begin end

PostQuitMessage( nExitCode: Integer );

{cdigo de finalizacin de aplicacin} {no devuelve nada}

Esta funcin coloca un mensaje WM_QUIT en la cola de mensajes del hilo que hace la llamada, causando la finalizacin de la aplicacin.

nExitCode: Un valor definido por la aplicacin que es pasado en el parmetro wParam del mensaje WM_QUIT. Este valor es devuelto a Windows cuando la aplicacin termina.

GetMessage, PeekMessage, PostMessage

procedure begin end

PostThreadMessage( idThread: DWORD; Msg: UINT; wParam: WPARAM; lParam: LPARAM ): BOOL;

{identificador del mensaje a enviar} {valor de 32 bits especfico del mensaje} {valor de 32 bits especfico del mensaje} {devuelve TRUE o FALSE}

Esta funcin coloca el mensaje especificado en la cola de mensajes del hilo identificado por el valor del parmetro idThread. La funcin retorna inmediatamente, sin esperar a que el hilo procese el mensaje. Un hilo crea una cola de mensajes la primera vez que hace una llamada a cualquier funcin de usuario o del GDI del API Win32. Cuando el hilo recupera mensajes mediante las funciones GetMessage o PeekMessage, el campo hWnd del registro de mensaje que se genera tendr valor cero.

idThread: El identificador del hilo al que el mensaje es enviado. Msg: El identificador del mensaje a enviar. wParam: Valor de 32 bits especfico del mensaje que se enva. lParam: Valor de 32 bits especfico del mensaje que se enva.

Si la funcin se ejecuta satisfactoriamente, devuelve TRUE; en caso contrario, devuelve FALSE. Para obtener informacin adicional acerca de cualquier error que se produzca, utilice la funcin GetLastError. GetLastError devolver ERROR_INVALID_THREAD_ID si el parmetro idThread no contiene un identificador de hilo vlido, o si el hilo no tiene una cola de mensajes asociada.

CreateThread, GetCurrentThreadId, GetMessage, GetWindowThreadProcessID, PeekMessage, PostMessage, SendMessage

const implementation function var begin while begin if begin do then stdcall

end end end procedure var begin nil if begin end then nil

end

RegisterWindowMessage( lpString: PChar ): UINT;

{puntero a cadena de mensaje} {devuelve un identificador de mensaje nico}

Esta funcin genera un nuevo identificador de mensaje que es nico para todo el sistema. Este nuevo identificador puede ser utilizado por cualquiera de las funciones PostMessage o SendMessage, lo que le convierte en un medio de comunicacin entre aplicaciones. Si dos aplicaciones diferentes registran la misma cadena de mensaje, cada aplicacin recibir el mismo identificador de mensaje. Este identificador ser vlido hasta que termine la sesin de Windows actual.

lpString: Un puntero a una cadena de caracteres terminada en cero que contiene el mensaje a ser registrado.

Si la funcin se ejecuta satisfactoriamente, devuelve un identificador de mensaje nico, situado en el rango que va desde $C000 hasta $FFFF. Si la funcin falla, devuelve cero.

PostMessage, PostThreadMessage, SendMessage, SendMessageCallback, SendMessageTimeout, SendNotifyMessage

Esta aplicacin enva el mensaje:


procedure begin end procedure var

begin

end

Esta aplicacin recibe el mensaje:


procedure begin inherited if begin then var

if end end procedure begin end procedure begin

then

end

ReplyMessage( lResult: LRESULT ): BOOL;

{valor resultante de procesar un mensaje} {devuelve TRUE o FALSE}

Esta funcin se utiliza para dar respuesta a un mensaje enviado al hilo que hace la llamada por otro hilo o aplicacin mediante alguna de las funciones SendMessage. Esto hace que el hilo que enva el mensaje retorne inmediatamente de la funcin SendMessage, como si el hilo que recibe el mensaje hubiera completado su tratamiento. Si el mensaje no ha sido enviado mediante alguna de las funciones SendMessage, o si ha sido enviado por el mismo hilo, esta funcin no produce efecto alguno.

lResult: Un valor que especifica el resultado del tratamiento del mensaje. Este valor es utilizado como valor de retorno de la funcin SendMessage a la que esta funcin est respondiendo, y puede especificar un valor definido por la aplicacin.

Si la funcin se ejecuta satisfactoriamente y el hilo que hace la llamada est procesando un mensaje que le ha sido enviado por otro hilo o aplicacin mediante alguna de las funciones SendMessage, entonces devuelve TRUE. Si la funcin falla, o el hilo que hace la llamada no est procesando un mensaje que le ha sido enviado por otro hilo o aplicacin mediante alguna de las funciones SendMessage, entonces devuelve FALSE.

InSendMessage, SendMessage, SendMessageCallback, SendMessageTimeout

Consulte el Listado 4-11, asociado a la funcin RegisterWindowMessage.

SendMessage( hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM ): LRESULT;

{manejador de ventana} {identificador del mensaje a enviar} {valor de 32 bits especfico del mensaje} {valor de 32 bits especfico del mensaje} {devuelve un valor especfico del mensaje}

Esta funcin enva el mensaje especificado al procedimiento de ventana de la ventana indicada, y no retorna hasta que el procedimiento de ventana llamado haya procesado el mensaje. Si la ventana especificada pertenece al hilo que hace la llamada, el procedimiento de ventana de la ventana es llamado inmediatamente, como si se tratase de una llamada a subrutina. Sin embargo, si la ventana pertenece a otro hilo, Windows transfiere el control a dicho hilo, enviando el mensaje al procedimiento de ventana apropiado; el hilo que hace la llamada queda bloqueado hasta que el mensaje sea procesado.

hWnd: Manejador de la ventana cuyo procedimiento de ventana recibe el mensaje especificado. Si este parmetro tiene el valor HWND_BROADCAST, el mensaje es enviado a todas las ventanas de alto nivel del sistema, incluyendo las ventanas deshabilitadas e invisibles. El mensaje no es enviado a las ventanas hijas. Las aplicaciones que necesiten enviar un mensaje definido por el usuario a otras aplicaciones mediante HWND_BROADCAST debern utilizar la funcin RegisterWindowMessage para obtener un identificador de mensaje nico. Msg: El identificador del mensaje a enviar. wParam: Valor de 32 bits especfico del mensaje que se enva. lParam: Valor de 32 bits especfico del mensaje que se enva.

Si la funcin se ejecuta satisfactoriamente, devuelve un resultado especfico del mensaje indicando el resultado del tratamiento del mensaje. Si la funcin falla, devuelve cero.

InSendMessage, PostMessage, RegisterWindowMessage, ReplyMessage, SendMessageCallback, SendMessageTimeout, SendNotifyMessage

Consulte el Listado 4-11, asociado a la funcin RegisterWindowMessage.

SendMessageCallback( hWnd: HWND; {manejador de ventana} Msg: UINT; {identificador del mensaje a enviar} wParam: WPARAM; {valor de 32 bits especfico del mensaje} lParam: LPARAM; {valor de 32 bits especfico del mensaje} lpResultCallBack: TFNSendAsyncProc; {puntero a funcin de respuesta definida por la aplicacin} dwData: DWORD {valor definido por la aplicacin} ): BOOL; {devuelve TRUE o FALSE}

Esta funcin enva el mensaje especificado al procedimiento de ventana de la ventana indicada por el parmetro hWnd. A diferencia de SendMessage, esta funcin retorna inmediatamente. Despus que el procedimiento de ventana en el hilo receptor finaliza el tratamiento del mensaje, el sistema llama a la funcin de respuesta definida por la aplicacin especificada en el parmetro lpResultCallBack, pasando el mensaje enviado, el resultado de su tratamiento y un valor definido por la aplicacin. La funcin de respuesta slo ser llamada cuando el hilo receptor llame a alguna de las funciones GetMessage, PeekMessage o WaitMessage. Se debe ser cuidadoso al enviar mensajes cuyos parmetros contengan punteros: es posible que la funcin que emite el mensaje termine antes de que el hilo asociado a la ventana pueda procesarlo, y los punteros podran ser liberados antes de ser utilizados.

hWnd: Manejador de la ventana cuyo procedimiento de ventana recibe el mensaje especificado. Si este parmetro tiene el valor HWND_BROADCAST, el mensaje es enviado a todas las ventanas de alto nivel del sistema, incluyendo las ventanas deshabilitadas e invisibles. El mensaje no es enviado a las ventanas hijas. Las aplicaciones que necesiten enviar un mensaje definido por el usuario a otras

aplicaciones mediante HWND_BROADCAST debern utilizar la funcin RegisterWindowMessage para obtener un identificador de mensaje nico. Msg: El identificador del mensaje a enviar. wParam: Valor de 32 bits especfico del mensaje que se enva. lParam: Valor de 32 bits especfico del mensaje que se enva. lpResultCallBack: Puntero a una funcin de respuesta (callback function) definida por la aplicacin. Si el parmetro hWnd tiene el valor HWND_BROADCAST, esta funcin ser llamada una vez para cada ventana de alto nivel en el sistema. dwData: Un valor definido por la aplicacin que ser enviado a la funcin de respuesta apuntada por lpResultCallBack.

Si la funcin se ejecuta satisfactoriamente, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

SendMessageCallbackProc( hWnd: HWND; Msg: UINT; dwData: DWORD; lResult: LRESULT );

{manejador de la ventana receptora} {identificador del mensaje} {valor definido por la aplicacin} {resultado del tratamiento del mensaje} {no devuelve nada}

La funcin de respuesta es llamada una vez por cada ventana que reciba el mensaje enviado, y puede realizar cualquier tarea que se entienda necesaria.

hWnd: El manejador de la ventana cuyo procedimiento de ventana recibe el mensaje. Msg: El identificador del mensaje que ha sido enviado al procedimiento de ventana asociado a la ventana identificada por hWnd. dwData: Un valor definido por la aplicacin. Este es el valor especificado por el parmetro dwData de la funcin SendMessageCallback. lResult: El resultado del tratamiento del mensaje, que ha sido devuelto por el procedimiento de ventana de la ventana receptora. Este valor es dependiente del tipo de mensaje procesado.

PostMessage, RegisterWindowMessage, SendMessage, SendMessageTimeout, SendNotifyMessage

procedure stdcall var implementation procedure begin

end procedure begin end

SendMessageTimeout( hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM fuFlags: UINT; uTimeout: UINT; var lpdwResult: DWORD ): BOOL;

{manejador de ventana} {identificador del mensaje a enviar} {valor de 32 bits especfico del mensaje} {valor de 32 bits especfico del mensaje} {opciones de envo} {tiempo lmite de espera en milisegundos} {variable que recibe el resultado del mensaje} {devuelve TRUE o FALSE}

Esta funcin enva el mensaje especificado al procedimiento de ventana asociado a la ventana indicada por el parmetro hWnd. Si la ventana pertenece a otro hilo, esta funcin no retorna hasta que el mensaje haya sido procesado o el tiempo lmite de espera especificado haya sido alcanzado. Si la ventana identificada por hWnd pertenece al hilo que hace la llamada, esta funcin se comporta exactamente igual que SendMessage, llamando directamente al procedimiento de ventana e ignorando el parmetro uTimeout.

hWnd: El manejador de la ventana cuyo procedimiento de ventana recibir el mensaje especificado. Si el valor de este parmetro es HWND_TOPMOST, el mensaje es enviado a todas las ventanas de ms alto nivel del sistema, incluyendo aquellas que estn deshabilitadas o invisibles. El mensaje no ser enviado a las ventanas hijas. Las aplicaciones que necesiten enviar mensajes de usuario a otras aplicaciones mediante HWND_TOPMOST debern utilizar la funcin RegisterWindowMessage para obtener un identificador de mensaje nico. Msg: El identificador del mensaje a enviar. wParam: Valor de 32 bits especfico del mensaje que se enva. lParam: Valor de 32 bits especfico del mensaje que se enva. fuFlags: Conjunto de opciones (banderas) que indican cmo el mensaje debe ser enviado. Los posibles valores de este parmetro se listan en la Tabla 4-5. uTimeout: Tiempo de espera mximo, en milisegundos, que se deber esperar por el retorno de la funcin. var lpdwResult: Puntero a una variable que recibir el resultado del tratamiento del mensaje. Este valor depende del tipo de mensaje de que se trate.

Si la funcin se ejecuta satisfactoriamente, devuelve TRUE; en caso contrario, devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

InSendMessage, PostMessage, SendMessage, SendMessageCallback, SendNotifyMessage

Esta aplicacin enva el mensaje:

OJO function stdcall var

implementation

function procedure begin end procedure var begin

external

name

4
end

Esta aplicacin recibe el mensaje:


var

implementation procedure var begin inherited if begin then

for begin end

to

do

end end procedure begin end

SendNotifyMessage( hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM ): BOOL;

{manejador de ventana} {identificador del mensaje a enviar} {valor de 32 bits especfico del mensaje} {valor de 32 bits especfico del mensaje} {devuelve TRUE o FALSE}

Esta funcin enva el mensaje especificado al procedimiento de ventana de la ventana indicada por el parmetro hWnd. Si la ventana pertenece a otro hilo, esta funcin retorna inmediatamente, sin esperar a que el mensaje haya sido procesado. Si la ventana identificada por hWnd pertenece al hilo que hace la llamada, esta funcin se comporta exactamente igual que SendMessage. Se debe ser cuidadoso al enviar mensajes cuyos parmetros contengan punteros: es posible que la funcin que emite el mensaje termine antes de que el hilo asociado a la ventana pueda procesarlo, y los punteros podran ser liberados antes de ser utilizados.

hWnd: Manejador de la ventana cuyo procedimiento de ventana recibe el mensaje especificado. Si el valor de este parmetro es HWND_BROADCAST, el mensaje es enviado a todas las ventanas de ms alto nivel del sistema, incluyendo aquellas que estuviesen deshabilitadas o invisibles. El mensaje no es enviado a las ventanas hijas. Las aplicaciones que necesiten enviar mensajes de usuario a otras aplicaciones mediante HWND_BROADCAST debern utilizar la funcin RegisterWindowMessage para obtener un identificador de mensaje nico. Msg: El identificador del mensaje a enviar. wParam: Valor de 32 bits especfico del mensaje que se enva. lParam: Valor de 32 bits especfico del mensaje que se enva.

Si la funcin se ejecuta correctamente, devuelve TRUE; en caso contrario, FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

PostMessage, PostThreadMessage, RegisterWindowMessage, SendMessage, SendMessageCallback, SendMessageTimeout

Esta aplicacin enva el mensaje:

procedure begin

end

Esta aplicacin lo recibe:


procedure var begin

for begin end

to

do

end

SetMessageExtraInfo( lParam: LPARAM ): LPARAM;

{valor de 32 bits definido por la aplicacin} {devuelve el valor anterior}

Esta funcin establece el valor de 32 bits definido por la aplicacin asociado con la cola de mensajes del hilo que hace la llamada. Este valor puede ser recuperado mediante una llamada a la funcin GetMessageExtraInfo.

lParam: Un valor de 32 bits definido por la aplicacin.

Si la funcin se ejecuta satisfactoriamente, devuelve el valor anterior que tena el valor de 32 bits definido por la aplicacin asociado a la cola de mensajes del hilo que hace la llamada; en caso contrario, devuelve cero.

GetMessageExtraInfo

Consulte el Listado 4-5, correspondiente a GetMessageExtraInfo.

SetWindowsHookEx( idHook: Integer; lpfn: TFNHookProc; hmod: HINST; dwThreadId: DWORD ): HHOOK;

{bandera de tipo de gancho} {puntero a la funcin gancho} {manejador del mdulo que contiene la funcin gancho} {identificador del hilo asociado} {devuelve un manejador de funcin gancho}

Esta funcin instala una funcin definida por la aplicacin en una cadena de funciones gancho. La funcin gancho puede utilizarse para monitorizar eventos, ya sea en el hilo identificado por el parmetro dwThreadId o en todos los hilos del sistema. Un uso comn de las funciones gancho es interceptar mensajes especficos para procesarlos antes de que el sistema o un procedimiento de ventana llegue a verlo. La funcin

gancho puede pasar la informacin de que dispone a la siguiente funcin en la cadena mediante una llamada a CallNextHookEx. Esta funcin puede ser llamada antes o despus de que se produzca cualquier tratamiento en la funcin gancho actual. Llamar a la siguiente funcin gancho de la cadena es totalmente opcional; sin embargo, si las siguientes funciones en la cadena de ganchos no son llamadas, las aplicaciones que las han instalado podrn comportarse de manera errtica. Las funciones gancho pueden asociarse a un nico hilo o a todo el sistema, en dependencia del valor del parmetro idHook. Para cualquier tipo de gancho especfico, los ganchos de hilo sern llamados en primer lugar, y luego los ganchos de sistema. Un gancho de sistema es un recurso compartido, que afecta a todas las aplicaciones una vez instalado. Todos los ganchos de sistema debern estar situados en libreras de enlace dinmico (DLLs). Antes de que una aplicacin finalice, deber llamar a UnhookWindowsHookEx para cada funcin gancho que haya instalado, liberando as los recursos de sistema asociados con la instalacin de los ganchos.

idHook: Un valor que indica el tipo de gancho a instalar. Este parmetro puede tomar cualquiera de los valores que se describen en la siguiente Tabla. lpfn: Puntero a la funcin gancho. Si el valor de dwThreadId es cero o contiene el identificador de un hilo creado por otro proceso, este parmetro debe apuntar a una funcin situada en una librera de enlace dinmico (DLL); en caso contrario, este parmetro puede apuntar a una funcin que forme parte del cdigo del proceso actual. El parmetro idHook identifica el tipo de funcin gancho a la que este parmetro apunta. Ms adelante se describen en detalle las caractersticas de cada posible tipo de funcin gancho. hmod: Manejador del mdulo (librera de enlace dinmico) que contiene la funcin gancho a la que apunta lpfn. Este parmetro deber ser cero si el parmetro dwThreadId identifica a un hilo creado por el proceso actual y lpfn apunta a una funcin gancho programada dentro del cdigo del proceso actual. dwThreadId: El identificador del hilo al que ser asociada la funcin gancho a instalar. Si este parmetro es cero, se trata de un gancho de sistema que ser asociado con todos los hilos existentes.

Si la funcin se ejecuta satisfactoriamente, devuelve el manejador de la funcin gancho recin instalada; en caso contrario, devuelve cero.

CallWndProcProc( nCode: Integer; wParam: WPARAM;

{cdigo de gancho} {indica si el mensaje viene del proceso actual}

lParam: LPARAM ): LRESULT;

{puntero a registro TCWPStruct} {siempre debe devolver cero!}

Esta funcin gancho es llamada cuando un mensaje es enviado mediante algunas de las funciones SendMessage. Antes de que el mensaje sea enviado al procedimiento de ventana de destino, es enviado a esta funcin gancho. La funcin gancho puede examinar el mensaje, pero no modificarlo. Por lo dems, la funcin puede ejecutar cualquier tarea que desee. Esta funcin gancho debe asociarse al hilo que hace la llamada a la funcin SendMessage, no al hilo que recibe el mensaje.

nCode: Indica si la funcin gancho debe procesar el mensaje o pasarlo a la siguiente funcin en la cadena. Si el valor de este parmetro es HC_ACTION, la funcin debe procesar el mensaje. Si el valor es menor que cero, la funcin debe pasar el mensaje a la siguiente funcin gancho llamando a CallNextHookEx y devolver el valor que reciba de CallNextHookEx. wParam: Indica si el mensaje proviene del proceso actual o de otro proceso. Si el valor de este parmetro es cero, el mensaje fue enviado por otro proceso; un valor diferente de cero indica que el mensaje fue enviado por el proceso actual. lParam: Un puntero a un registro de tipo TCWPStruct que contiene informacin relativa al mensaje. El registro TCWPStruct se define de la siguiente forma: TCWPStruct = packed record lParam: LPARAM; wParam: WPARAM; message: UINT; hwnd: HWND; end; {valor de 32 bits especfico del mensaje} {valor de 32 bits especfico del mensaje} {identificador del mensaje} {manejador de la ventana que recibe el mensaje}

El significado de los campos del registro es el siguiente: lParam: Valor de 32 bits especfico del mensaje que se enva. wParam: Valor de 32 bits especfico del mensaje que se enva. mes sage: El identificador del mensaje interceptado. hwnd: El manejador de la ventana cuyo procedimiento de ventana recibe el mensaje.

Esta funcin gancho siempre devuelve cero.

CallWndProcRetProc( nCode: Integer; wParam: WPARAM; lParam: LPARAM ): LRESULT;

{cdigo de gancho} {indica si el mensaje viene del proceso actual} {puntero a un registro TCWPRetStruct} {siempre debe devolver cero!}

Esta funcin gancho es llamada cuando un mensaje es enviado mediante algunas de las funciones SendMessage. Despus de que el mensaje sea enviado al procedimiento de ventana de destino, es enviado a esta funcin gancho. La funcin gancho puede examinar el mensaje, pero no modificarlo. Por lo dems, la funcin puede ejecutar cualquier tarea que desee. Esta funcin gancho debe asociarse al hilo que hace la llamada a la funcin SendMessage, no al hilo que recibe el mensaje.

nCode: Indica si la funcin gancho debe procesar el mensaje o pasarlo a la siguiente funcin en la cadena. Si el valor de este parmetro es HC_ACTION, la funcin debe procesar el mensaje. Si el valor es menor que cero, la funcin debe pasar el mensaje a la siguiente funcin gancho llamando a CallNextHookEx y devolver el valor que reciba de CallNextHookEx. wParam: Indica si el mensaje proviene del proceso actual o de otro proceso. Si el valor de este parmetro es cero, el mensaje fue enviado por otro proceso; un valor diferente de cero indica que el mensaje fue enviado por el proceso actual. lParam: Un puntero a un registro de tipo TCWPRetStruct que contiene informacin relativa al mensaje. El registro TCWPRetStruct se define de la siguiente forma: TCWPRetStruct = packed record lResult: LRESULT; lParam: LPARAM; {valor de 32 bits especfico del mensaje} wParam: WPARAM; {valor de 32 bits especfico del mensaje} message: UINT; {identificador del mensaje} hwnd: HWND; {manejador de la ventana que recibe el mensaje} end; El significado de los campos del registro es el siguiente: lResult: El resultado del procesamiento del mensaje, retornado por el procedimiento de ventana. lParam: Valor de 32 bits especfico del mensaje que se enva. wParam: Valor de 32 bits especfico del mensaje que se enva. mes sage: El identificador del mensaje interceptado.

hwnd: El manejador de la ventana cuyo procedimiento de ventana recibe el mensaje.

Esta funcin gancho siempre devuelve cero.

CBTProc( nCode: Integer; wParam: WPARAM; lParam: LPARAM ): LRESULT;

{cdigo de gancho} {valor dependiente del cdigo de gancho} {valor dependiente del cdigo de gancho} {devuelve 1 0}

Esta funcin gancho ofrece funcionalidad para la enseanza asistida por ordenador. Es llamada por el sistema antes de activar, crear, destruir, maximizar, minimizar, mover o redimensionar una ventana, antes de completar un comando de sistema, antes de asociar el foco del teclado a una ventana, antes de eliminar un mensaje de teclado o ratn de la cola de mensajes del sistema, o antes de sincronizar con la cola de mensajes del sistema. El valor que devuelve esta funcin gancho indica si Windows debe impedir que alguno de esos eventos tenga lugar. Este gancho no deber instalar un gancho WH_JOURNALPLAYBACK; aparte de eso, puede ejecutar cualquier tarea que desee. Puede ser nicamente un gancho de nivel de sistema, y como tal deber residir en una librera de enlace dinmico (DLL).

nCode: Indica cmo debe tratar el mensaje la funcin gancho. Si este valor es menor que cero, la funcin debe pasar sin ms el mensaje a la siguiente funcin gancho mediante una llamada a CallNextHookEx, y devolver el valor que le entregue CallNextHookEx. En caso contrario, este parmetro contendr un valor de la siguiente Tabla. wParam: Un valor de 32 bits dependiente del valor del parmetro nCode. Consulte los posibles valores de este parmetro en la siguiente Tabla. lParam: Un valor de 32 bits dependiente del valor del parmetro nCode. Consulte los posibles valores de este parmetro en la siguiente Tabla.

Para los siguientes valores de nCode, la funcin gancho debe devolver cero (0) para permitir que la operacin contine, o uno (1) para prevenirla: HCBT_ACTIVATE, HCBT_CREATEWND, HCBT_DESTROYWND, HCBT_MINMAX, HCBT_MOVESIZE, HCBT_SETFOCUS, HCBT_SYSCOMMAND. Para los valores

HCBT_CLICKSKIPPED, HCBT_KEYSKIPPED y HCBT_QS, el valor devuelto es ignorado.

El registro TCBTActivateStruct se define de la siguiente forma: TCBTActivateStruct = packed record fMouse: BOOL; {bandera de activacin de clic de ratn} hWndActive: HWND; {manejador de la ventana activa} end; fMouse: Un valor booleano que indica si la ventana ha sido activada por un clic de ratn. El valor TRUE indica que la ventana ha sido activada por un clic de ratn. hWndActive: El manejador de la ventana activa. El registro TMouseHookStruct se define de la siguiente forma:

TMouseHookStruct = packed record pt: TPoint; {coordenadas de pantalla del cursor del ratn} hwnd: HWND; {manejador de la ventana que recibe el mensaje} wHitTestCode: UINT; {cdigo de situacin del ratn} dwExtraInfo: DWORD; {informacin definida por el mensaje} end; pt: Un registro TPoint que contiene las coordenadas horizontal y vertical del cursor del ratn, en coordenadas de pantalla. hwnd: Manejador de la ventana que recibe el mensaje de ratn. wHitTestCode: Un valor que indica la zona de la ventana donde estaba el cursor del ratn en el momento de la ocurrencia del evento. Consulte el mensaje WM_NCHITTEST para conocer los posibles valores. dwExtraInfo: Un valor que contiene informacin extra relativa al mensaje de ratn.

El registro TCBTCreateWnd se define de la siguiente forma: TCBTCreateWnd = packed record lpcs: PCreateStruct; {puntero a registro TCreateStruct} hwndInsertAfter: HWND; {manejador de ventana anterior en el orden Z} end; lpcs: Un puntero a un registro TCreateStruct que contiene informacin acerca de la ventana que va a ser creada. Consulte la funcin CreateWindow para conocer la descripcin de esta estructura de datos. hwndInsertAfter: Manejador de la ventana que precede a la ventana recin creada en el orden Z.

DebugProc( nCode: Integer; wParam: WPARAM; lParam: LPARAM ): LRESULT;

{cdigo de gancho} {tipo de gancho que va a ser llamado} {puntero a registro TDebugHookInfo} {valor distinto de cero para bloquear el gancho}

Esta funcin gancho se utiliza para depurar otras funciones gancho. El sistema llama a esta funcin gancho antes de llamar a cualquiera de los otros ganchos, pasndole informacin acerca del gancho que va a ser llamado. Esta funcin puede indicar a Windows si debe llamar a la funcin gancho o no, y puede adems efectuar cualquier otra tarea necesaria.

nCode: Indica si la funcin gancho debe procesar el mensaje o pasarlo al siguiente gancho en la cadena. Si el valor de este parmetro es HC_ACTION, la funcin gancho debe procesar el mensaje. Si el valor es menor que cero, la funcin gancho debe pasar el mensaje al siguiente gancho, llamando a CallNextHookEx, y devolver el valor que reciba de CallNextHookEx. wParam: Especifica el tipo de gancho que est siendo llamado. Puede contener cualquier valor de la Tabla 4-6. lParam: Un puntero a un registro TDebugHookInfo que contiene los parmetros que se pasan a la funcin gancho que va a ser llamada. El registro TDebugHookInfo se define de la siguiente forma: TDebugHookInfo = packed record idThread: DWORD; {identificador de hilo} idThreadInstaller: DWORD; {identificador de hilo} lParam: LPARAM; {parmetro lParam que se pasa al gancho} wParam: WPARAM; {parmetro wParam que se pasa al gancho} code: Integer; {parmetro nCode que se pasa al gancho} end; idThread: El identificador del hilo que contiene el gancho que va a ser llamado. idThreadInstaller: El identificador del hilo que contiene el gancho de depuracin. lParam: El parmetro lParam que ser pasado al gancho. wParam: El parmetro wParam que ser pasado al gancho. code: El parmetro nCode que ser pasado al gancho

Para evitar que la funcin gancho de destino sea llamada, esta funcin gancho debe devolver un valor diferente de cero. En caso contrario, la funcin gancho deber pasar la informacin sobre el gancho a la funcin CallNextHookEx, devolviendo el valor que reciba de CallNextHookEx.

GetMsgProc( nCode: Integer; wParam: WPARAM; lParam: LPARAM ): LRESULT;

{cdigo de gancho} {bandera de eliminacin de mensaje} {puntero a registro TMsg} {siempre debe devolver cero!}

Esta funcin gancho es activada cuando las funciones GetMessage o PeekMessage son llamadas para extraer un mensaje de la cola de mensajes. El mensaje extrado es pasado a travs de esta funcin gancho antes de ser enviado al procedimiento de ventana de destino. Esta funcin gancho puede modificar los parmetros del mensaje, enviando el mensaje modificado al procedimiento de ventana de destino cuando la funcin gancho retorne, y puede realizar cualquier tarea que se estime necesaria.

nCode: Indica si la funcin gancho debe procesar el mensaje o pasarlo al siguiente gancho en la cadena. Si el valor de este parmetro es HC_ACTION, la funcin gancho debe procesar el mensaje. Si el valor es menor que cero, la funcin gancho debe pasar el mensaje al siguiente gancho, llamando a CallNextHookEx, y devolver el valor que reciba de CallNextHookEx. wParam: Indica si el mensaje ha sido eliminado de la cola. El valor PM_REMOVE indica que el mensaje ha sido eliminado de la cola; el valor PM_NOREMOVE indica que el mensaje no ha sido eliminado de la cola. lParam: Un puntero a un registro TMsg que contiene informacin acerca del mensaje. El registro TMsg se define de la siguiente forma: TMsg = packed record hwnd: HWND; message: UINT; wParam: WPARAM; lParam: LPARAM; time: DWORD; pt: TPoint; end; {manejador de la ventana que recibe el mensaje} {identificador del mensaje} {valor de 32 bits especfico del mensaje} {valor de 32 bits especfico del mensaje} {hora en que el mensaje fue enviado} {posicin del cursor del ratn}

Consulte la funcin DispatchMessage para conocer una descripcin detallada de este registro.

Esta funcin gancho debe siempre devolver cero.

JournalPlaybackProc( nCode: Integer; wParam: WPARAM; lParam: LPARAM ): LRESULT;

{cdigo de gancho} {no se utiliza} {puntero a registro TEventMsg} {devuelve un tiempo de espera en tics de reloj}

Esta funcin gancho se utiliza para insertar un mensaje de ratn o teclado en la cola de mensajes del sistema, copiando la informacin del mensaje al registro TEventMsg apuntado por el parmetro lParam. Su uso ms comn es reproducir una serie de mensajes de teclado y ratn grabados previamente mediante una funcin gancho de tipo WH_JOURNALRECORD. Mientras esta funcin gancho es instalada, la entrada de teclado y de ratn es deshabilitada. La funcin JournalPlaybackProc siempre es llamada en el contexto del hilo que inicialmente estableci el gancho WH_JOURNALPLAYBACK. Si el usuario pulsa las combinaciones Ctrl+Esc o Ctrl+Alt+Del mientras un gancho WH_JOURNALPLAYBACK est instalado, el sistema detiene la reproduccin de mensajes, desinstala la funcin gancho, y enva un mensaje WM_CANCELJOURNAL a la aplicacin. Por dems, esta funcin puede realizar cualquier tarea que se estime necesaria.

nCode: Un cdigo que especifica cmo la funcin gancho debe procesar el mensaje. Este parmetro puede contener cualquiera de los valores de la Tabla 4-8. Si es menor que cero, esta funcin gancho debe pasar el mensaje al prximo gancho llamando a la funcin CallNextHookEx sin ningn otro tratamiento, y debe devolver el valor que reciba de CallNextHookEx. wParam: Este parmetro no se utiliza y tiene valor cero. lParam: Un puntero a un registro TEventMsg que contiene informacin acerca del mensaje que se est procesando. Este parmetro se utiliza nicamente cuando el parmetro nCode vale HC_GETNEXT. El registro TEventMsg se define de la siguiente forma: TEventMsg = packed record message: UINT; paramL: UINT; paramH: UINT; time: DWORD; hwnd: HWND; end; {identificador de mensaje} {informacin adicional especfica del mensaje} {informacin adicional especfica del mensaje} {hora a la que el mensaje fue enviado} {manejador de la ventana que recibe el mensaje}

mes sage: El identificador del mensaje. paramL: Informacin adicional especfica del mensaje. Si el mensaje est entre WM_KEYFIRST y WM_KEYLAST, este campo contiene el cdigo de tecla virtual de la tecla que fue pulsada. paramH: Informacin adicional especfica del mensaje. Si el mensaje est entre WM_KEYFIRST y WM_KEYLAST, este campo contiene el cdigo de barrido (scan code) de la tecla que fue pulsada. time: El momento en el que el mensaje fue enviado a la cola de mensajes de la ventana identificada por el campo hwnd.

hwnd: El manejador de la ventana cuyo procedimiento de ventana ha recibido el mensaje.

La funcin gancho debe devolver la cantidad de tiempo, en tics de reloj, que el sistema debe esperar antes de procesar el siguiente mensaje, si se desea una pausa. Cuando la aplicacin contine, la funcin gancho ser llamada de nuevo con un valor HC_GETNEXT en el parmetro nCode. La funcin gancho debe devolver cero despus de esta segunda llamada; en caso contrario, el bucle continuar y la aplicacin dar la impresin de estar colgada. Si el siguiente mensaje debe ser procesado inmediatamente, la funcin debe devolver cero. Si el parmetro nCode no tiene el valor HC_GETNEXT, el valor devuelto es ignorado.

JournalRecordProc( nCode: Integer; wParam: WPARAM; lParam: LPARAM ): LRESULT;

{cdigo de gancho} {este parmetro no se utiliza} {puntero a un registro TEventMsg} {valor que se devuelve es ignorado}

Esta funcin gancho se utiliza para registrar mensajes que han sido eliminados de la cola de mensajes del sistema. La funcin gancho no deber modificar los mensajes que

copia. Esos mensajes podrn ser reproducidos posteriormente utilizando una funcin gancho WH_JOURNALPLAYBACK. La funcin gancho deber buscar un mensaje VK_CANCEL, que es enviado al sistema cuando el usuario pulse la combinacin Ctrl+Inter. Ello indica que el usuario desea detener la grabacin de mensajes, y que la secuencia de grabacin debe ser detenida y el gancho WH_JOURNALRECORD eliminado. La funcin JournalRecordProc siempre es llamada en el contexto del hilo que inicialmente estableci el gancho WH_JOURNALRECORD. Si el usuario pulsa las combinaciones Ctrl+Esc o Ctrl+Alt+Supr mientras un gancho WH_JOURNALRECORD est instalado, el sistema detiene la reproduccin de mensajes, desinstala la funcin gancho, y enva un mensaje WM_CANCELJOURNAL a la aplicacin. Por lo dems, esta funcin puede realizar cualquier tarea que se estime necesaria.

nCode: Un cdigo que especifica cmo la funcin gancho debe procesar el mensaje. Este parmetro puede contener cualquiera de los valores de la siguiente Tabla. Si es menor que cero, esta funcin gancho debe pasar el mensaje al prximo gancho llamando a la funcin CallNextHookEx sin ningn otro tratamiento, y debe devolver el valor que reciba de CallNextHookEx. wParam: Este parmetro no se utiliza y tiene valor cero. lParam: Un puntero a un registro TEventMsg que contiene informacin acerca del mensaje que se est procesando. Este parmetro se utiliza nicamente cuando el parmetro nCode vale HC_GETNEXT. El registro TEventMsg se define de la siguiente forma: TEventMsg = packed record message: UINT; paramL: UINT; paramH: UINT; time: DWORD; hwnd: HWND; end; {identificador de mensaje} {informacin adicional especfica del mensaje} {informacin adicional especfica del mensaje} {hora en que el mensaje fue enviado} {manejador de la ventana que recibe el mensaje}

Consulte la descripcin del tipo de gancho WH_JOURNALPLAYBACK para una descripcin detallada de los campos de este registro.

El valor que devuelve esta funcin gancho es ignorado.

KeyboardProc( nCode: Integer; wParam: WPARAM; lParam: LPARAM ): LRESULT;

{cdigo de gancho} {cdigo de tecla virtual} {mscara de bits con informacin sobre teclas} {indica si el mensaje debe ser descartado}

Esta funcin gancho es activada cuando la aplicacin llama a las funciones GetMessage o PeekMessage y recupera un mensaje de teclado. Esta funcin puede realizar cualquier tarea que se estime necesaria.

nCode: Un cdigo que especifica cmo la funcin gancho debe procesar el mensaje. Este parmetro puede contener cualquiera de los valores de la Tabla 4.10. Si es menor que cero, esta funcin gancho debe pasar el mensaje al prximo gancho llamando a la funcin CallNextHookEx sin ningn otro tratamiento, y debe devolver el valor que reciba de CallNextHookEx. wParam: Contiene el cdigo de tecla virtual de la tecla que gener el mensaje. lParam: Una mscara de bits que contiene el contador de repeticiones, cdigo de barrido, opciones de teclado extendidas y la bandera de transicin para el mensaje de teclado. Los valores representados por cada uno de los bits en este parmetro se describen en la Tabla 4-11.

Para prevenir que el mensaje de teclado sea pasado al procedimiento de ventana de destino, la funcin gancho debe devolver un valor distinto de cero. Para pasar el mensaje al procedimiento de ventana de destino, la funcin gancho debe devolver cero.

MouseProc( nCode: Integer; wParam: WPARAM; lParam: LPARAM ): LRESULT;

{cdigo de gancho} {identificador de mensaje de ratn} {puntero a un registro TMouseHookStruct} {indica si el mensaje debe ser descartado}

Esta funcin gancho es llamada cuando la aplicacin llama a GetMessage o PeekMessage y recupera un mensaje de ratn. Esta funcin no deber instalar ninguna

funcin gancho WH_JOURNALPLAYBACK. Por lo dems, la funcin puede efectuar cualquier tarea que se estime necesaria.

nCode: Un cdigo que especifica cmo la funcin gancho debe procesar el mensaje. Este parmetro puede contener uno de los valores de la Tabla 4-12. Si el valor es menor que cero, esta funcin gancho debe pasar el mensaje al prximo gancho llamando a la funcin CallNextHookEx sin ningn otro tratamiento, y debe devolver el valor que reciba de CallNextHookEx. wParam: Contiene el identificador del mensaje de ratn. lParam: Un puntero a un registro TMouseHookStruct que contiene informacin acerca del mensaje de ratn. El registro TMouseHookStruct se define de la siguiente forma: TMouseHookStruct = packed record pt: TPoint; {coordenadas de pantalla del cursor del ratn} hwnd: HWND; {manejador de la ventana que recibe el mensaje} wHitTestCode: UINT; {cdigo de situacin del ratn} dwExtraInfo: DWORD; {informacin definida por el mensaje} end; Consulte la funcin gancho HC_CBT para una descripcin de este registro.

Para evitar que el mensaje de ratn sea pasado al procedimiento de ventana de destino, la funcin gancho debe devolver un valor distinto de cero. Para pasar el mensaje al procedimiento de ventana de destino, la funcin gancho debe devolver cero.

MsgFilterProc( nCode: Integer; wParam: WPARAM; lParam: LPARAM ): LRESULT;

{cdigo de gancho} {este parmetro no es usado} {puntero a registro TMsg} {indica si el mensaje ha sido procesado}

Este evento de gancho es utilizado para monitorizar los mensajes generados como consecuencia de la interaccin del usuario con un cuadro de dilogo, cuadro de mensaje, men o barra de desplazamiento. El sistema llama a esta funcin gancho cuando un evento de entrada ocurre en esos objetos, pero antes de que el mensaje generado por tal evento haya sido despachado al procedimiento de ventana de destino. Esta funcin gancho debe residir en el cdigo del hilo que instal el gancho, y puede llevar a cabo cualquier tarea que se estime necesaria.

nCode: Un cdigo que especifica cmo la funcin gancho debe procesar el mensaje. Este parmetro puede contener uno de los valores de la Tabla 4-13. Si el valor es menor que cero, esta funcin gancho debe pasar el mensaje al prximo gancho llamando a la funcin CallNextHookEx sin ningn otro tratamiento, y debe devolver el valor que reciba de CallNextHookEx. wParam: Este parmetro no es utilizado y toma el valor cero. lParam: Un puntero a un registro TMsg que contiene informacin acerca del mensaje. El registro TMsg se define de la siguiente forma: TMsg = packed record hwnd: HWND; mensaje: UINT; wParam: WPARAM; lParam: LPARAM; time: DWORD; pt: TPoint; end; {manejador de la ventana que recibe el mensaje} {identificador del mensaje} {valor de 32 bits especfico del mensaje} {valor de 32 bits especfico del mensaje} {hora a la que el mensaje fue enviado} {posicin del cursor del ratn}

Consulte la funcin DispatchMessage para una descripcin detallada de esta estructura de datos.

Si la funcin gancho ha procesado el mensaje, deber devolver un valor distinto de cero. Si la funcin gancho no ha procesado el mensaje, deber devolver cero.

ShellProc( nCode: Integer; wParam: WPARAM; lParam: LPARAM ): LRESULT;

{cdigo de gancho} {informacin adicional especfica del gancho} {informacin adicional especfica del gancho} {esta funcin deber siempre devolver cero}

Esta funcin gancho es utilizada por las aplicaciones del shell para recibir notificaciones acerca de eventos que ocurren en el sistema. Es utilizada para monitorizar la activacin y creacin de ventanas, y puede realizar cualquier tarea que se estime necesaria.

nCode: Un cdigo que especifica cmo la funcin gancho debe procesar el mensaje. Este parmetro puede contener uno de los valores listados en la Tabla 4-14. Si el valor es menor que cero, esta funcin gancho debe pasar el mensaje al prximo gancho llamando a la funcin CallNextHookEx sin ningn otro tratamiento, y debe devolver el valor que reciba de CallNextHookEx. wParam: Especifica informacin dependiente del valor del parmetro nCode. Consulte en la Tabla 4-14 la lista de sus posibles valores. A menos que se especifique lo contrario, este parmetro es ignorado. lParam: Especifica informacin dependiente del valor del parmetro nCode. Consulte en la Tabla 4-14 la lista de sus posibles valores. A menos que se especifique lo contrario, este parmetro es ignorado.

Esta funcin siempre debe devolver cero.

SysMsgFilterProc( nCode: Integer; wParam: WPARAM; lParam: LPARAM ): LRESULT;

{cdigo de gancho} {este parmetro no es utilizado} {puntero a un registro TMsg} {indica si el mensaje ha sido procesado}

Este evento de gancho es utilizado para monitorizar los mensajes generados por la interaccin del usuario con un cuadro de dilogo, cuadro de mensaje, men o barra de desplazamiento a travs de todo el sistema. El sistema llama a esta funcin gancho cuando se produce un evento de entrada en uno de esos objetos, pero antes de que el evento haya sido enviado al procedimiento de ventana de destino. Esta funcin gancho

debe residir en una librera de enlace dinmico (DLL) y puede realizar cualquier tarea que se estime necesaria.

nCode: Un cdigo que especifica cmo la funcin gancho debe procesar el mensaje. Este parmetro debe contener uno de los valores que se listan en la Tabla 4-15. Si el valor es menor que cero, esta funcin gancho debe pasar el mensaje al prximo gancho llamando a la funcin CallNextHookEx sin ningn otro tratamiento, y debe devolver el valor que reciba de CallNextHookEx. wParam: Este parmetro no es utilizado y recibe el valor cero. lParam: Puntero a un registro TMsg que contiene informacin acerca del mensaje. El registro TMsg se define de la siguiente forma: TMsg = packed record hwnd: HWND; mensaje: UINT; wParam: WPARAM; lParam: LPARAM; time: DWORD; pt: TPoint; end; {manejador de la ventana que recibe el mensaje} {identificador del mensaje} {valor de 32 bits especfico del mensaje} {valor de 32 bits especfico del mensaje} {hora a la que el mensaje ha sido enviado} {posicin del cursor del ratn}

Consulte la funcin DispatchMessage para una descripcin detallada de esta estructura de datos.

Si la funcin gancho ha procesado el mensaje, deber devolver un valor distinto de cero. Si la funcin gancho no ha procesado el mensaje, deber devolver cero.

CallNextHookEx, UnhookWindowsHookEx

function stdcall var

implementation

procedure begin end procedure begin end function begin if if begin then then

end else if begin if shr then then

end else else

end

TranslateMessage( const lpMsg: TMsg ): BOOL;

{registro que contiene el mensaje a traducir} {devuelve TRUE o FALSE}

Esta funcin traduce mensajes de teclas virtuales en mensajes de caracteres, colocando el mensaje resultante de nuevo en la cola de mensajes del hilo que hace la llamada. Los mensajes WM_CHAR slo se crean para aquellas teclas que pueden ser mapeadas directamente a caracteres ASCII por el controlador de teclado. Las aplicaciones que necesiten tratar los mensajes de teclas virtuales no deben llamar a TranslateMessage.

lpMsg: Un puntero a un registro TMsg que contiene informacin acerca del mensaje a traducir. Este registro es recibido por las funciones GetMessage y PeekMessage, y no es modificado por TranslateMessage. El registro TMsg se define de la siguiente forma: TMsg = packed record hwnd: HWND; mensaje: UINT; wParam: WPARAM; lParam: LPARAM; time: DWORD; pt: TPoint; end; {manejador de la ventana que recibe el mensaje} {identificador del mensaje} {valor de 32 bits especfico del mensaje} {valor de 32 bits especfico del mensaje} {hora a la que el mensaje ha sido enviado} {posicin del cursor del ratn}

Consulte la funcin GetMessage para ver la descripcin de esta estructura de datos.

Si la funcin se ejecuta satisfactoriamente y un mensaje de tecla virtual ha sido traducido a mensaje de carcter y colocado en la cola de mensajes del hilo que hace la llamada, la funcin devuelve TRUE. Si la funcin falla, o ningn mensaje de tecla virtual ha sido traducido a mensaje de carcter, la funcin devuelve FALSE. Note que bajo Windows NT, esta funcin devolver TRUE si el mensaje es de tecla de funcin o de movimiento del cursor (flecha).

GetMessage, PeekMessage

Consulte el Listado 4-4, correspondiente a GetMessage.

UnhookWindowsHookEx( hhk: HHOOK ): BOOL;

{manejador del gancho que va a ser eliminado} {devuelve TRUE o FALSE}

Esta funcin elimina la funcin gancho especificada, que debe haber sido instalada previamente en una cadena de ganchos mediante la funcin SetWindowsHookEx. El gancho no es eliminado hasta que todos los hilos hayan finalizado su llamada actual a la funcin gancho. Si ningn hilo est utilizando la funcin gancho en el momento en que UnhookWindowsHookEx es llamada, el gancho es eliminado inmediatamente.

hhk: El manejador del gancho que va a ser eliminado.

Si la funcin tiene xito, devuelve TRUE; en caso contrario, devuelve FALSE.

SetWindowsHookEx

Consulte el Listado 4-15, correspondiente a SetWindowsHookEx.

WaitMessage: BOOL;

{devuelve TRUE o FALSE}

Esta funcin suspende el hilo que hace la llamada, cediendo el control a otros hilos. Esta funcin no retornar hasta que un mensaje sea colocado en la cola de mensajes del hilo que hace la llamada; en ese momento la ejecucin del hilo continuar.

Si la funcin se ejecuta satisfactoriamente, devuelve TRUE; en caso contrario, devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetMessage, PeekMessage

procedure var begin

while not begin while

do do

if begin end end end

then

Una ventana, por su propia naturaleza, tiene asociada una gran cantidad de informacin. Detalles como las dimensiones de la ventana, su posicin, su ventana madre o sus opciones de estilo pueden ser recuperados e incluso modificados por una aplicacin. La clase de ventana en la que la ventana se basa puede disponer igualmente de informacin que una aplicacin necesite durante su ejecucin. Afortunadamente, el API Win32 ofrece un amplio conjunto de funciones que permiten a la aplicacin recuperar, y en algunos casos modificar, prcticamente todos los detalles relativos a una ventana o a la clase a la que pertenece.

Cada ventana posee un mecanismo de almacenamiento de informacin conocido como lista de propiedades (property lists). Esta lista de propiedades est pensada fundamentalmente para los datos que el usuario necesita, y no es utilizada directamente por el sistema operativo Windows. Toda ventana, incluyendo los formularios y los controles que descienden de TWinControl, posee una lista de propiedades, que se almacena en una zona de memoria especfica asociada a la ventana que Windows gestiona de forma automtica. Una lista de propiedades funciona de forma similar a los ficheros INI, en el sentido de que a una serie de cadenas de caracteres se les asocia un valor. La funcin SetProp recibe una cadena y un nmero entero de 32 bits. Si la cadena no se encuentra an en la lista de propiedades, la cadena especificada y su valor asociado son aadidos. Si la cadena ya existe, entonces el valor que estaba asociado a ella es sustituido por el valor especificado. La funcin GetProp permite extraer los valores actuales de las propiedades, y la funcin RemoveProp las elimina de la lista de propiedades. Una aplicacin no deber eliminar de una lista los valores asignados a ella por otra aplicacin, pero s eliminar sus propias propiedades antes de terminar su ejecucin. Las listas de propiedades ofrecen al desarrollador una buena alternativa a las variables globales, que en algunos casos puede causar problemas de alcance o colisiones de

nombre. Ellas permiten al desarrollador almacenar cualquier cantidad de informacin para cualquier propsito, dejando a Windows la tarea de gestionar la memoria asociada. Se trata tambin de una forma muy flexible de comunicar informacin, ya que una funcin que hace una llamada no tendr que conocer el nmero de propiedades en la lista ni una posicin especfica, sino slo la cadena de caracteres asociada al valor que necesita. Consulte la descripcin de la funcin EnumProps para ver un ejemplo de la utilizacin de las listas de propiedades.

Adems de la lista de propiedades, cada ventana automticamente contiene un rea de almacenamiento para un nmero de 32 bits. Esta zona tambin puede ser utilizada para cualquier valor interesante para el usuario, y no es utilizada por el sistema operativo Windows. Un desarrollador podr utilizar esta zona para almacenar un puntero de 32 bits a una estructura de datos, un objeto, etc. A esta rea de datos de 32 bits es posible acceder mediante las funciones del API GetWindowLong y SetWindowLong. El siguiente ejemplo muestra cmo asignar un valor y luego recuperarlo para cualquier componente de Delphi que descienda de TWinControl.

procedure var implementation procedure var array begin of

stdcall

end procedure begin end procedure begin end

procedure begin

end procedure begin

5
end

Las funciones GetWindowLong y SetWindowLong (y sus funciones hermanas para las clases de ventana) ofrecen al desarrollador un mtodo para cambiar las propiedades de sus ventanas mediante cdigo. Uno de los trucos ms poderosos que un desarrollador puede llevar a cabo con estas funciones es el de sustituir el procedimiento de ventana de una ventana, creando lo que se conoce como una subclase. Todas las ventanas de una clase especfica comparten el procedimiento de ventana definido para la clase cuando la ventana fue registrada. El procedimiento de ventana de una clase puede ser reemplazado con un nuevo procedimiento de ventana utilizando la funcin

SetClassLong, si se desea que afecte a todas las ventanas de la clase, o utilizando la funcin SetWindowLong, si se desea nicamente modificar el comportamiento de una ventana especfica. Los mensajes para la ventana subclasificada se enviarn primero al nuevo procedimiento de ventana, permitiendo al desarrollador cambiar drsticamente el comportamiento de una ventana al instante. El siguiente ejemplo muestra cmo utilizar la funcin SetWindowLong para sustituir el procedimiento de ventana del formulario principal en tiempo de ejecucin. El nuevo procedimiento de ventana intercepta el mensaje WM_NCHITTEST. Si el usuario est tratando de mover la ventana pulsando sobre la barra de ttulo y arrastrando la ventana, el nuevo procedimiento de ventana sustituye el resultado del mensaje con un resultado que indica que el usuario ha pulsado sobre el rea cliente. Esto impedir al usuario mover la ventana con el ratn.

function stdcall var

implementation function begin

if end procedure begin

and

then

end

El API Win32 incluye diversas funciones de enumeracin. Estas funciones permiten al desarrollador recuperar informacin acerca de cada ventana existente sin conocer en detalle cuntas ventanas hay. Estas funciones, junto a otras funciones de informacin

sobre ventanas, ofrecen a la aplicacin la posibilidad de cambiar dinmicamente en la medida en que cambia el entorno del sistema. El ejemplo ClassInfo que se puede descargar desde el apartado referente a este libro en http://edito rial.danysoft.com, demuestra el uso de las funciones EnumChildWindows y GetClassInfo para visualizar en tiempo de ejecucin informacin sobre las clases de ventana a que pertenecen los componentes estndar de Delphi. En el ejemplo se itera sobre cada componente descendiente de TWinControl presente en el formulario para conocer el nombre de la clase. Cuando se selecciona del cuadro de lista un nombre de clase, la informacin sobre dicha clase es mostrada.

procedure var implementation procedure var array begin of

stdcall

end procedure begin end procedure var array begin of

if else if end

nil

then

nil

then

Estas funciones pueden combinarse con otras funciones de enumeracin para obtener casi todos los detalles relativos a cualquier ventana del sistema. El siguiente ejemplo forma parte de la aplicacin WindowInfo. Esta aplicacin ejemplifica mltiples funciones de enumeracin y de informacin sobre ventanas. Esta aplicacin puede utilizarse como complemento a la aplicacin WinSight32 que viene con Delphi para ofrecer la informacin ms completa sobre cada ventana del sistema.

function function function stdcall var

stdcall stdcall

implementation function var array begin of

if

then

end function var array begin of

if

then nil

5
end function begin

end procedure begin

end procedure var

array

of

begin

if else

nil

then

if else

then

if else

then

if else

then

if else

then

if

then

else

if else

then

if else

then

if begin

then

end else string

if begin

then

end else

if

then

if not begin

then

end

if else if end

nil

then

nil

then

Las siguientes funciones de informacin sobre ventanas se describen en este captulo.

AnyPopup: BOOL;

{devuelve TRUE o FALSE}

Esta funcin indica si una ventana emergente o superpuesta con propietaria, visible y de nivel superior existe en cualquier lugar de la pantalla. Esta funcin, sin embargo, no detectar ventanas emergentes sin propietaria o ventanas que no tengan el estilo WS_VISIBLE especificado. Esta funcin se utilizaba en las aplicaciones antiguas y hoy se mantiene por razones de compatibilidad.

Si la funcin tiene xito y una ventana emergente es hallada, la funcin devuelve TRUE incluso si la ventana emergente est totalmente cubierta por otras ventanas. Si la funcin falla, o no puede encontrar una ventana emergente, devuelve FALSE.

EnumWindows, FindWindow, FindWindowEx, GetWindow, GetTopWindow, ShowOwnedPopups

procedure begin if else end

then

ChildWindowFromPoint( hWndParent: HWND; Point: TPoint ): HWND;

{manejador de ventana madre} {registro que contiene coordenadas a verificar} {devuelve un manejador a ventana hija}

Esta funcin determina si el punto especificado, que contiene coordenadas relativas a la ventana madre, est dentro de los lmites de alguna ventana hija. La funcin devuelve el manejador de esta ventana hija incluso si sta est deshabilitada o escondida.

hWndParent: El manejador de la ventana madre. Point: Una variable de tipo TPoint que define las coordenadas a ser verificadas. Estas coordenadas son relativas al rea cliente de la ventana madre.

Si la funcin tiene xito, devuelve el manejador de la ventana hija que contiene el punto especificado. Si el punto est situado dentro de los lmites de la ventana madre pero no de una ventana hija, el valor que se devuelve es el manejador de la ventana madre. Si ms de una ventana hija contiene al punto, el valor que devuelve es el

manejador de la primera ventana hija en el orden-Z. Si la funcin falla o el punto est situado fuera de los lmites de la ventana madre, el valor que se devuelve es cero.

ChildWindowFromPointEx, WindowFromPoint, WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_RBUTTONDOWN

El formulario de este ejemplo contiene un panel cuya propiedad Align tiene el valor alTop. Este panel es la ventana que ser hallada en el siguiente fragmento de cdigo:
procedure var array begin of

if begin

then

end else end

ChildWindowFromPointEx( hWnd: HWND; Point: TPoint; Flags: UINT ): HWND;

{manejador de ventana madre} {registro con las coordenadas a verificar} {opciones para ignorar} {devuelve un manejador a una ventana hija}

Esta funcin determina si el punto de las coordenadas especificadas, relativas a la ventana madre, est dentro de los lmites de cualquier ventana hija. Funcionalmente equivalente a ChildWindowFromPoint, esta funcin puede no tomar en consideracin las ventanas hijas invisibles, deshabilitadas o transparentes.

hWndParent: El manejador de la ventana madre. Point: Una variable de tipo TPoint que define las coordenadas a verificar. Estas coordenadas son relativas al rea cliente de la ventana madre. Flags: Un nmero de 32 bits que indica qu ventanas no se debe tener en consideracin. Aqu se deben utilizar los valores de la Tabla 5-2, combinndolos mediante el operador booleano or (por ejemplo, en CWP_SKIPINVISIBLE or CWP_SKIPDISABLED).

Si la funcin tiene xito, devolver el manejador de la ventana hija que contiene el punto y satisface los criterios especificados en Flags. Si el punto est dentro de los lmites de la ventana madre, pero no de ninguna ventana hija que satisfaga los criterios de Flags, se devuelve el manejador de la ventana madre. Si ms de una ventana hija contiene el punto, se devolver el manejador de la primera ventana hija en el orden-Z. Si la funcin falla, o el punto cae fuera de los lmites de la ventana madre, la funcin devuelve cero.

ChildWindowFromPoint, WindowFromPoint, WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_RBUTTONDOWN

5
El formulario de este ejemplo tiene un panel cuya propiedad Align tiene el valor alTop. Este panel es la ventana que ser hallada en el siguiente fragmento de cdigo:
procedure var array begin of

if begin

then

end else end

EnableWindow( hWnd: HWND; bEnable: BOOL ): BOOL;

{manejador de ventana} {bandera de activar/desactivar} {devuelve TRUE o FALSE}

Esta funcin habilita o deshabilita la entrada de teclado y ratn a la ventana o control especificado. Cuando est deshabilitada, una ventana o control no recibir ninguna entrada de teclado o ratn, y no podr en general ser utilizada por el usuario. Si el estado de habilitacin de una ventana o control va a cambiar, el mensaje WM_ENABLE es enviado antes de que la funcin retorne. Si una ventana que es deshabilitada contiene ventanas hijas, entonces todas esas ventanas hijas sern deshabilitadas tambin, pero a ellas no se les enviar el mensaje WM_ENABLE. Una ventana deshabilitada deber ser habilitada antes de ser activada.

hWnd: El manejador de la ventana que ser habilitada o deshabilitada. bEnable: Si este parmetro es TRUE, la ventana ser habilitada; si es FALSE, la ventana ser deshabilitada.

Esta funcin devuelve TRUE si la ventana estaba ya deshabilitada; en caso contrario, devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetActiveWindow, GetFocus, IsWindowEnabled, SetActiveWindow, SetFocus, WM_ENABLE

procedure begin if begin then

end else begin

end end

EnumChildWindows( hWndParent: HWND; lpEnumFunc: TFNWndEnumProc; lParam: LPARAM ): BOOL;

{manejador de ventana madre} {puntero a funcin de respuesta} {valor de 32 bits definido por la aplicacin} {devuelve TRUE o FALSE}

EnumChildWindows recorre todas las ventanas hijas de una ventana madre dada, enviando el manejador de cada ventana hija a una funcin de respuesta definida por la aplicacin. La enumeracin finaliza cuando todas las ventanas hijas hayan sido visitadas o cuando la funcin de respuesta devuelva FALSE. Si una ventana hija tiene a su vez sus propias ventanas hijas, estas ventanas hijas sern enumeradas tambin. Esta funcin ignorar las ventanas hijas que hayan sido destruidas, as como las que sean creadas durante el proceso de enumeracin.

hWndParent: Manejador de la ventana madre cuyas ventanas hijas sern enumeradas. lpEnumFunc: La direccin de la funcin de respuesta definida por la aplicacin. lParam: Un valor de 32 bits definido por la aplicacin que ser pasado a la funcin de respuesta.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE.

EnumChildProc( hWnd: HWND; lParam: LPARAM ): BOOL;

{manejador de la ventana hija} {valor de 32 bits definido por la aplicacin} {devuelve TRUE o FALSE}

Esta funcin recibe el manejador de ventana de cada ventana hija perteneciente a la ventana madre especificada en la llamada a EnumChildWindows, y puede realizar cualquier tarea que se estime necesaria.

hWnd: El manejador de la ventana hija. lParam: Un valor de 32 bits definido por la aplicacin. Este valor es para uso especfico de la aplicacin dentro de la funcin de respuesta, y es el valor del parmetro lParam pasado a la funcin EnumChildWindows.

La funcin de respuesta debe devolver TRUE para continuar la enumeracin; en caso contrario debe devolver FALSE.

EnumThreadWindows, EnumWindows, GetWindow, GetParent, FindWindow, FindWindowEx, IsChild

function var implementation procedure begin

stdcall

end function var array begin of

end

EnumProps( hWnd: HWND; {manejador de la ventana} lpEnumFunc: TFNPropEnumProc {direccin de la funcin de respuesta} ): Integer; {valor devuelto por la funcin de respuesta}

Esta funcin pasa cada entrada en la lista de propiedades de la ventana especificada a una funcin de respuesta definida por la aplicacin. El proceso contina hasta que todas las propiedades hayan sido enumeradas o la funcin de respuesta devuelva FALSE. Esta funcin debe utilizarse para obtener los datos asociados a la ventana sin conocer cuntas propiedades existen.

hWnd: El manejador de la ventana cuya lista de propiedades se va a enumerar. lpEnumFunc: La direccin de la funcin de respuesta definida por la aplicacin que recibe la lista de propiedades.

Esta funcin devuelve el ltimo valor devuelto por la funcin de respuesta. Si la funcin falla, o la funcin de respuesta no encuentra una propiedad para la ventana especificada, el valor es 1. Ntese que la funcin de respuesta devuelve un valor de tipo BOOL, que el fichero Windows.Pas define como LongBool. Este tipo existe por razones de compatibilidad y almacena un valor de tipo LongInt, donde un valor 0 significa FALSE y los valores diferentes de cero se interpretan como TRUE.

EnumPropProc( hWnd: HWND; lpszPropString: PChar; hData: THandle ): BOOL;

{manejador de la ventana con propiedades} {puntero a cadena terminada en caracter nulo} {componente de datos de cada entrada de la lista} {devuelve TRUE o FALSE}

Esta funcin recibe la informacin relativa a cada propiedad de la lista de propiedades de ventana especificada. Mientras esta funcin est ejecutndose, no deber intentar ceder el control a ningn otro proceso ni intentar aadir una nueva propiedad a la lista. Se puede llamar a RemoveProp para eliminar una propiedad, pero slo para eliminar la propiedad actualmente pasada a la funcin.

hWnd: El manejador de la ventana cuya lista de propiedades est siendo enumerada. lpszPropString: Un puntero a una cadena de caracteres terminada en nulo. Es el componente del nombre de la propiedad de la entrada actual de la lista de propiedades. hData: Un valor de 32 bits; es el componente de datos de la propiedad de la entrada actual de la lista de propiedades.

La funcin de respuesta debe devolver TRUE para continuar la enumeracin; en caso contrario debe devolver FALSE.

EnumPropsEx, GetProp, RemoveProp, SetProp

function var implementation

stdcall

function begin

end procedure begin

end procedure begin

end procedure begin

end procedure var begin

if else end

then

EnumPropsEx( hWnd: HWND; lpEnumFunc: TFNPropEnumProcEx; lParam: LPARAM ): Integer;

{manejador de la ventana} {direccin de la funcin de respuesta} {valor de 32 bits definido por la aplicacin} {valor devuelto por funcin de respuesta}

Esta funcin pasa cada entrada en la lista de propiedades de la ventana especificada a una funcin de respuesta definida por la aplicacin. La enumeracin contina hasta que todas las propiedades hayan sido enumeradas o la funcin de respuesta devuelva FALSE. Esta funcin debe utilizarse para encontrar la informacin asociada a la ventana sin conocer cuntas propiedades existen. Esta funcin es equivalente a EnumProps, con la adicin de un parmetro extra para un valor definido por el usuario que es pasado a la funcin de respuesta.

hWnd: El manejador de la ventana cuya lista de propiedades va a ser enumerada. lpEnumFunc: La direccin de la funcin de respuesta definida por la aplicacin que recibe las entradas de la lista de propiedades. lParam: Un valor de 32 bits definido por la aplicacin que es pasado a la funcin de respuesta.

Esta funcin devuelve el ltimo valor retornado por la funcin de respuesta. Si la funcin falla, o la funcin de respuesta no encuentra una propiedad para la ventana especificada, el valor es 1. Ntese que la funcin de respuesta devuelve un valor de tipo BOOL, que el fichero Windows.pas define como LongBool. Este tipo existe por razones de compatibilidad y almacena un valor de tipo LongInt, donde un valor 0 significa FALSE y los valores diferentes de cero se interpretan como TRUE.

EnumPropProcEx( hWnd: HWND; lpszPropString: PChar; hData: HANDLE; dwData: DWORD ): BOOL;

{manejador de la ventana con propiedades} {puntero a cadena de caracteres terminada en nulo} {componente de datos de la propiedad} {dato definido por la aplicacin} {devuelve TRUE o FALSE}

Esta funcin recibe la informacin relativa a cada propiedad de la lista de propiedades de ventana especificada. Mientras esta funcin est ejecutndose, no deber intentar ceder el control a ningn otro proceso ni intentar aadir una nueva propiedad a la lista. Se puede llamar a RemoveProp para eliminar una propiedad, pero slo para eliminar la propiedad actualmente pasada a la funcin.

hWnd: El manejador de la ventana cuya lista de propiedades est siendo enumerada. lpszPropString: Un puntero a una cadena de caracteres terminada en nulo. Es el componente del nombre de la propiedad de la entrada actual de la lista de propiedades. hData: Un valor de 32 bits; es el componente de datos de la propiedad de la entrada actual de la lista de propiedades. dwData: Un valor de 32 bits definido por la aplicacin. Este valor es para el uso especfico de la aplicacin dentro de la funcin de respuesta, y es el valor del parmetro lParam pasado a la funcin EnumPropsEx.

La funcin de respuesta debe devolver TRUE para continuar la enumeracin; en caso contrario debe devolver FALSE.

EnumProps, GetProp, RemoveProp, SetProp

function stdcall var implementation function begin

end procedure begin

end procedure begin

end procedure begin

end procedure var begin

if else end

then

EnumThreadWindows( dwThreadId: DWORD; lpfn: TFNWndEnumProc; lParam: LPARAM ): BOOL;

{identificador del hilo} {direccin de la funcin de respuesta} {valor de 32 bits definido por la aplicacin} {devuelve TRUE o FALSE}

Esta funcin enumera todas las ventanas no hijas asociadas con el hilo especificado. Cada manejador de ventana asociado con el hilo especificado es pasado a la funcin de respuesta definida por la aplicacin. Esta funcin continuar hasta que todas las ventanas hayan sido enumeradas o la funcin de respuesta devuelva FALSE.

dwThreadId: El hilo cuyas ventanas van a ser enumeradas. lpfn: La direccin de la funcin de respuesta definida por la aplicacin. lParam: Un valor de 32 bits definido por la aplicacin que es pasado a la funcin de respuesta.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE.

EnumThreadWndProc( hWnd: HWND; lParam: LPARAM ): BOOL;

{manejador de la ventana} {valor definido por la aplicacin} {devuelve TRUE o FALSE}

Esta funcin recibe el manejador de ventana de cada ventana asociada con el hilo especificado, y puede realizar cualquier tarea que se estime necesaria.

hWnd: El manejador de la ventana asociada con el hilo especificado. lParam: Un valor de 32 bits definido por la aplicacin. Este valor es para el uso especfico de la aplicacin dentro de la funcin de respuesta, y es el valor del parmetro lParam de la funcin EnumThreadWindows.

La funcin de respuesta debe devolver TRUE para continuar la enumeracin; en caso contrario debe devolver FALSE.

EnumChildWindows, EnumWindows, GetWindowThreadProcessId, GetCurrentThreadId

function var implementation procedure begin

stdcall

end

function var array begin of

end

EnumWindows( lpEnumFunc: TFNWndEnumProc; {direccin de la funcin de respuesta} lParam: LPARAM {valor de 32 bits definido por la aplicacin} ): BOOL; {devuelve TRUE o FALSE}

Esta funcin recorre todas las ventanas de nivel superior en la pantalla, pasando el manejador de cada ventana a una funcin de respuesta definida por la aplicacin. La enumeracin contina hasta que todas las ventanas hayan sido enumeradas o la funcin de respuesta devuelva FALSE. La funcin EnumWindows no enumera las ventanas hijas.

lpEnumFunc: La direccin de la funcin de respuesta definida por la aplicacin. lParam: Un valor de 32 bits definido por la aplicacin que ser pasado a la funcin de respuesta.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE.

EnumWindowsProc( hWnd: HWND; lParam: LPARAM ): BOOL;

{manejador de ventana de alto nivel} {valor definido por la aplicacin} {devuelve TRUE o FALSE}

Esta funcin recibe el manejador de cada ventana en el sistema, y puede realizar cualquier tarea que se estime necesaria.

hWnd: El manejador de la ventana de nivel superior. lParam: Un valor de 32 bits definido por la aplicacin. Este valor es para uso especfico de la aplicacin dentro de la funcin de respuesta, y es el valor del parmetro lParam pasado a la funcin EnumWindows.

La funcin de respuesta debe devolver TRUE para continuar la enumeracin; en caso contrario debe devolver FALSE.

EnumChildWindows, EnumThreadWindows, FindWindow, FindWindowEx, GetWindow, GetTopWindow

function var implementation procedure begin

stdcall

end function var array begin if else then of

end

FindWindow( lpClassName: PChar; lpWindowName: PChar ): HWND;

{puntero a cadena terminada en nulo (nombre clase)} {puntero a cadena terminada en nulo (nombre ventana)} {devuelve manejador de la ventana}

FindWindow recupera el manejador de la ventana de alto nivel con el nombre de clase y el nombre de la ventana especificados. Las ventanas hijas no son tenidas en cuenta.

lpClassName: Puntero a cadena de caracteres terminada en nulo (con distincin entre maysculas y minsculas) que especifica el nombre de la clase; o tomo entero que identifica al nombre de la clase. Si se trata de un tomo, ste debe haber sido creado mediante una llamada a GlobalAddAtom. El tomo, un valor de 16 bits, debe situarse en la palabra menos significativa de ClassName; la palabra ms significativa deber ser cero. lpWindowName: Puntero a cadena de caracteres terminada en nulo (con distincin entre maysculas y minsculas) que especifica el nombre de la ventana, que no es otro que el texto en su barra de ttulo. Si este parmetro es nil, todos los nombres de ventana son vlidos.

Si la funcin tiene xito, el valor que devuelve es el manejador de la ventana con el nombre de clase y de ventana especificados; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

EnumWindows, FindWindowEx, GetClassName, GetWindow

procedure var array begin nil of

end

FindWindowEx( Parent: HWND; Child: HWND; ClassName: PChar; WindowName: PChar ): HWND;

{manejador de la ventana madre} {manejador de la ventana hija} {puntero a nombre de clase} {puntero a nombre de ventana} {devuelve manejador de la ventana}

Esta funcin recupera el manejador de la ventana con el nombre de clase y de ventana especificados. A diferencia de FindWindow, esta funcin busca las ventanas hijas, comenzando con la ventana siguiente a la ventana hija especificada.

Parent: Manejador de ventana madre cuyas ventanas hijas van a ser buscadas. Si este parmetro es cero, la ventana del escritorio es usada como madre y las ventanas hijas del escritorio son recorridas. Child: El manejador de la ventana hija. La bsqueda comenzar con la ventana hija que sigue a la especificada en el orden-Z. La ventana hija especificada deber ser una hija directa de la ventana definida por el parmetro Parent. Si este parmetro es cero, la bsqueda comenzar con la primera ventana hija de la ventana madre. Note que si tanto este parmetro como Parent son cero, esta funcin busca todas las ventanas de nivel superior. ClassName: Puntero a cadena de caracteres terminada en nulo que especifica el nombre de la clase, o un tomo entero que identifica al nombre de la clase. Si se trata de un tomo, ste debe haber sido creado mediante una llamada a GlobalAddAtom. El tomo, un valor de 16 bits, debe situarse en la palabra menos significativa de ClassName; la palabra ms significativa deber ser cero. WindowName: Puntero a cadena de caracteres terminada en nulo (con distincin entre maysculas y minsculas) que especifica el nombre de la ventana, que no es otro que el texto en su barra de ttulo. Si este parmetro es nil, todos los nombres de ventana son vlidos.

Si la funcin tiene xito, el valor que devuelve es el manejador de la ventana con el nombre de clase y de ventana especificados; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

EnumChildWindows, EnumWindows, FindWindow, GetClassName, GetWindow

procedure var array begin nil of

end

FlashWindow( hWnd: HWND; bInvert: BOOL ): BOOL;

{manejador de la ventana} {bandera de parpadeo} {devuelve TRUE o FALSE}

Esta funcin har cambiar la ventana de estado activo a inactivo o viceversa. La ventana parpadea una sola vez, y podr ser abierta o minimizada.

hWnd: El manejador de la ventana a parpadear. bInvert: Un valor booleano que especifica cmo deber parpadear la ventana. El valor TRUE har que la ventana cambie de un estado a otro (de inactivo a activo o viceversa). El valor FALSE har que la ventana parpadee, quedando en el mismo estado orig inal.

Si la funcin tiene xito y la ventana estaba activa antes de la llamada a la funcin, el valor que sta devuelve es TRUE. Si la funcin falla, o si tiene xito pero la ventana estaba inactiva antes de la llamada a la funcin, sta devuelve FALSE.

GetActiveWindow, GetFocus, SetActiveWindow, SetFocus

Este cdigo se coloca en un evento OnTimer de un componente TTimer preparado para disparar el evento cada 1000 milisegundos.
procedure begin

end

GetActiveWindow: HWND;

{devuelve el manejador de la ventana activa}

Esta funcin devuelve el manejador de la ventana activa asociada al hilo que llama a esta funcin.

Si la funcin tiene xito, el valor que devuelve es el manejador de la ventana activa asociada al hilo que llama a esta funcin. Si la funcin falla, o si el hilo no tiene una ventana activa, el valor que devuelve es cero.

SetActiveWindow, GetFocus, GetForegroundWindow, GetTopWindow, SetFocus, SetForegroundWindow

procedure var array begin of

string end

GetClassInfo( hInstance: HINST; lpClassName: PChar; var lpWndClass: TWndClass ): BOOL;

{manejador a instancia de aplicacin} {puntero a cadena (nombre de clase)} {puntero a registro TWndClass} {devuelve TRUE o FALSE}

Esta funcin devuelve informacin acerca de la clase de ventana especificada. Esta informacin se guarda en los campos de la variable WndClass, una estructura de datos de tipo TWndClass, y es la misma informacin que fue pasada en su momento a la funcin RegisterClass para crear la clase.

hInstance: El manejador de instancia de la aplicacin que cre la clase. Para obtener informacin acerca de clases definidas por ventanas, tales como botones o cuadros de lista, asigne cero a este parmetro. lpClassName: Un puntero a una cadena de caracteres terminada en nulo que contiene el nombre de la clase, ya sea de una clase definida por la aplicacin mediante una llamada a RegisterClass o de una clase predefinida. Puede tambin ser un tomo entero, creado mediante una llamada a GlobalAddAtom. El tomo, un valor de 16 bits, debe situarse en la palabra menos significativa y la ms significativa deber ser cero. lpWndClass: Un puntero a un registro TWndClass que recibir la informacin acerca de la clase especificada. El registro TWndClass se define en Delphi de la siguiente forma: TWndClass = packed record Style: UINT; lpfnWndProc: TFNWndProc; cbClsExtra: Integer; cbWndExtra: Integer; hInstance: HINST; hIcon: HICON; hCursor: HCURSOR; hbrBackground: HBRUSH; lpszMenuName: PAnsiChar; lpszClassName: PAnsiChar; end; {opciones de estilo de la clase} {puntero al procedimiento de ventana} {bytes de memoria extra para la clase} {bytes de memoria extra para ventana} {manejador de instancia de mdulo} {manejador de icono} {manejador de cursor} {manejador de brocha para el fondo} {nombre del men} {nombre de la clase}

Los campos de esta estructura se describen en detalle con la funcin RegisterClass.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetClassInfoEx, GetClassLong, GetClassName, RegisterClass

procedure var begin

if else if end

nil

then

nil

then

GetClassInfoEx( hInstance: HINST; lpClassName: PChar; var lpWndClass: TWndClassEx ): BOOL;

{manejador de instancia de aplicacin} {puntero a cadena (nombre de clase)} {puntero a registro TWndClassEx} {devuelve TRUE o FALSE}

Esta funcin devuelve informacin acerca de la clase de ventana especificada. Esta informacin se almacena en los campos de la variable WndClass, una estructura de datos de tipo TWndClassEx, y es la misma informacin pasada a la funcin RegisterClassEx que cre la clase. Esta funcin es equivalente a GetClassInfo, con la excepcin de que devuelve adicionalmente un manejador al icono pequeo asociado a la clase especificada.

hInstance: El manejador de instancia de la aplicacin que cre la clase. Para obtener informacin acerca de clases definidas por ventanas, tales como botones o cuadros de lista, asigne cero a este parmetro. lpClassName: Un puntero a una cadena de caracteres terminada en nulo que contiene el nombre de la clase, ya sea de una clase definida por la aplicacin mediante una llamada a RegisterClass o el nombre de una clase predefinida. Puede tambin ser un tomo entero, creado mediante una llamada a GlobalAddAtom. El tomo, un valor de 16 bits menor que $C000, debe situarse en la palabra menos significativa y la palabra ms significativa deber ser cero. lpWndClass: Un puntero a un registro TWndClassEx que recibir la informacin acerca de la clase especificada. El registro TWndClassEx se define en Delphi de la siguiente forma: TWndClassEx = packed record cbSize: UINT; Style: UINT; lpfnWndProc: TFNWndProc; cbClsExtra: Integer; {tamao de este registro} {opciones de estilo de la clase} {puntero al procedimiento de ventana} {bytes de memoria extra para la clase}

cbWndExtra: Integer; hInstance: HINST; hIcon: HICON; hCursor: HCURSOR; hbrBackground: HBRUSH; lpszMenuName: PAnsiChar; lpszClassName: PAnsiChar; hIconSm: HICON; end;

{bytes de memoria extra para ventana} {manejador de instancia de mdulo} {manejador de icono} {manejador de cursor} {manejador de brocha para el fondo} {nombre del men} {nombre de la clase} {manejador de icono pequeo}

Los campos de esta estructura se describen en detalle con la funcin RegisterClassEx. Antes de llamar a GetClassInfoEx, al campo cbSize de este registro se le debe asignar SizeOf(TWndClassEx).

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetClassInfo, GetClassLong, GetClassName, RegisterClassEx

Este ejemplo recorre todas las ventanas hijas presentes en el formulario. Muestra todos los nombre de clases en un cuadro de lista, y cuando un nombre de clase es seleccionado, muestra entonces la informacin de esa clase en otro cuadro de lista.
function var implementation function var array begin of stdcall

end

procedure begin end procedure var array begin of

if else if end

nil

then

nil

then

GetClassLong( hWnd: HWND;

{manejador de la ventana}

nIndex: Integer ): DWORD;

{desplazamiento del valor a recuperar} {devuelve un valor de 32 bits}

Esta funcin devuelve el valor de 32 bits situado en el desplazamiento especificado de la memoria de clase extra de la clase de ventana a la que la ventana especificada pertenece. Esta memoria extra es reservada al crear la clase especificando un valor mayor que cero en el campo ClsExtra del registro TWndClass pasado a la funcin RegisterClass. Adicionalmente, esta funcin puede devolver informacin acerca de la clase de ventana utilizando uno de los valores de la Tabla 5-3 en el parmetro nIndex.

hWnd: El manejador de la ventana a cuya memoria de clase se desea acceder. nIndex: Especifica el desplazamiento (a partir de cero) en que se encuentra el valor de 32 bits a recuperar. Los posibles valores de este parmetro van desde cero hasta el nmero de bytes de memoria de clase extra menos uno (por ejemplo, si se han reservado 16 bytes de memoria de clase extra, un valor 8 apuntara al tercer entero de 32 bits). Adicionalmente, uno de los valores de la Tabla 5-3 puede utilizarse para acceder a informacin especfica acerca de la clase.

Si la funcin tiene xito, devuelve el valor de 32 bits situado en la posicin especificada del rea de la memoria de clase; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetClassInfo, GetClassInfoEx, GetClassName, RegisterClass, RegisterClassEx, SetClassLong

Este ejemplo recorre todos los cursores disponibles desde Delphi. Note que los elementos de la propiedad vectorial TScreen.Cursors se numeran en orden inverso en el caso de los cursores estndar.
procedure var const begin

end

GetClassName( hWnd: HWND; lpClassName: PChar; nMaxCount: Integer ): Integer;

{manejador de la ventana} {puntero a buffer que recibir la cadena} {tamao del buffer en caracteres} {devuelve la cantidad de caracteres copiados}

Esta funcin simplemente copia el nombre de clase de la ventana especificada al buffer al que apunta el parmetro lpClassName.

hWnd: El manejador de la ventana cuyo nombre de clase se desea obtener. lpClassName: Puntero a un buffer que recibir la cadena terminada en cero con el nombre de la clase. nMaxCount: Especifica la longitud del buffer al que apunta el parmetro lpClassName. El nombre de la clase ser truncado si es ms largo que el tamao del buffer.

Si la funcin tiene xito devuelve la longitud de la cadena con el nombre de la clase en bytes, sin contar el terminador nulo; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetClassInfo, GetClassInfoEx, GetClassLong, RegisterClass, SetClassLong

Esta funcin es utilizada en varios ejemplos posteriores de este captulo. Consulte el Listado 5-9, asociado a la funcin EnumChildWindows, y la aplicacin WindowInfo, que puede descargar desde el apartado de este libro en http://editorial.danysoft.com.

GetClientRect( hWnd: HWND; var lpRect: TRect ): BOOL;

{manejador de la ventana} {puntero a registro de rectngulo} {devuelve TRUE o FALSE}

Esta funcin devuelve las coordenadas del rea cliente de la ventana especificada en el registro de tipo TRect al que apunta la variable lpRect.

hWnd: El manejador de la ventana cuyas coordenadas de rea cliente se desean. lpRect: Puntero a un registro TRect que recibir las coordenadas. Esas coordenadas se obtienen en trminos del rea cliente de la ventana especificada. Por lo tanto, los campos Left y Top sern cero, y los campos Right y Bottom contendrn el ancho y la altura respectivamente del rea cliente de la ventana.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetWindowPlacement, GetWindowRect, SetWindowPlacement

Note que este cdigo se ha colocado en el evento OnResize del formulario. Las coordenadas cambiarn cuando la ventana sea redimensionada.
procedure var begin

end

GetDesktopWindow: HWND;

{devuelve manejador de ventana del escritorio}

Esta funcin devuelve el manejador de ventana del escritorio. Esta ventana abarca la pantalla entera, y es el rea en el cual las otras ventanas e iconos se dibujan. Un desarrollador puede pasar el manejador que devuelve esta funcin a la funcin GetDC para obtener un contexto de dispositivo que le permita dibujar directamente sobre la superficie del escritorio.

Si la funcin tiene xito, devuelve el manejador de ventana del escritorio; en caso contrario devuelve cero.

EnumWindows, GetWindow

procedure var

array begin

of

end

GetFocus: HWND;

{devuelve un manejador de la ventana}

Esta funcin recupera el manejador de la ventana asociada al hilo que hace la llamada que tiene el foco de entrada.

Si la funcin tiene xito, devuelve el manejador de la ventana asociada con el hilo que hace la llamada que tiene el foco de entrada. Si la funcin falla, o si ninguna de las ventanas asociadas con el hilo que hace la llamada tiene el foco de entrada, la funcin devuelve cero. Si el valor que se devuelve es cero, otro hilo puede tener una ventana con el foco de entrada.

GetActiveWindow, GetCapture, GetForegroundWindow, GetTopWindow, IsWindowEnabled, SetActiveWindow, SetFocus, WM_KILLFOCUS, WM_SETFOCUS

Este cdigo se asocia al evento OnEnter de mltiples controles.


procedure var array begin of

string

GetForegroundWindow: HWND;

{devuelve un manejador de ventana}

Esta funcin devuelve el manejador de la ventana con la que el usuario est trabajando actualmente.

Si la funcin tiene xito, devuelve el manejador de la ventana en primer plano; en caso contrario devuelve cero.

GetTopWindow, GetFocus, SetForegroundWindow

El formulario de este proyecto tiene el valor fsStayOnTop en su propiedad FormStyle, de forma que es visible incluso cuando otras aplicaciones tengan el foco. Este cdigo se dispara desde un TTimer con una frecuencia de 250 milisegundos.
procedure var array begin of

end

GetNextWindow( hWnd: HWND; uCmd: UINT ): HWND;

{manejador de la ventana actual} {opciones de direccin} {devuelve manejador de ventana}

Esta funcin devuelve el manejador de la ventana siguiente o anterior a la especificada en el orden-Z relativo. La ventana siguiente es aquella que est debajo de la especificada en el orden-Z, y la ventana anterior es la que est encima de ella. Windows mantiene un orden-Z independiente para las ventanas de nivel superior y las ventanas hijas. Esta funcin devuelve el manejador de la ventana relativa a la ventana especificada en el orden-Z apropiado.

hWnd: Manejador de la ventana actual. uCmd: Especifica si se desea el manejador de la ventana siguiente o anterior a la actual. Puede ser cualquier valor de la Tabla 5-4.

Si esta funcin tiene xito, devuelve el manejador a la ventana siguiente o anterior a la actual en el orden-Z. Si la funcin falla, o si no existe una ventana siguiente o anterior a la actual, la funcin devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

BringWindowToTop, GetTopWindow, GetWindow, FindWindow, FindWindowEx, EnumWindows

Este ejemplo contiene cinco paneles dispuestos uno encima del otro. El botn y los cinco paneles son ventanas hermanas (siblings). Cuando el botn es pulsado, se mostrar el texto de la ventana situada en el tope del orden-Z con relacin a sus hermanas y el texto de la ventana que est justamente debajo de la anterior.
procedure var array begin of

end

GetParent( hWnd: HWND ): HWND;

{manejador de ventana hija} {devuelve manejador de la ventana madre}

Esta funcin devuelve el manejador de la ventana madre de la especificada, si existe.

hWnd: El manejador de la ventana cuya madre se desea recuperar.

Si la funcin tiene xito, devuelve el manejador de la ventana madre de la especificada. Si la funcin falla, o la ventana especificada no tiene una ventana madre, devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

EnumWindows, FindWindow, FindWindowEx, GetWindow, SetParent

procedure var array begin of

5
end

GetProp( hWnd: HWND;

{manejador de la ventana}

lpString: PChar ): THandle;

{puntero a cadena} {devuelve un valor de 32 bits}

Esta funcin recupera el valor de 32 bits asociado con la cadena de caracteres lpString de la lista de propiedades de la ventana especificada.

hWnd: El manejador de la ventana en cuya lista de propiedades se va a buscar. lpString: Puntero a cadena de caracteres terminada en nulo o tomo que identifica una cadena. Si se trata de un tomo, ste debe haber sido creado mediante una llamada a la funcin GlobalAddAtom. El tomo, un valor de 16 bits, debe situarse en la palabra menos significativa y la palabra ms significativa deber ser cero.

Si la funcin tiene xito y la lista de propiedades de la ventana especificada contiene la cadena, la funcin devuelve el valor asociado con esa cadena en la lista de propiedades de la ventana. Si la funcin falla, o la cadena especificada no est en la lista de propiedades de la ventana, devuelve cero.

EnumProps, EnumPropsEx, RemoveProp, SetProp

Consulte el Listado 5-10 (funcin EnumProps) o el Listado 5-11 (funcin EnumPropsEx).

GetTopWindow( hWnd: HWND ): HWND;

{manejador de ventana madre} {devuelve manejador de ventana hija}

Esta funcin examina las ventanas hijas de la ventana madre especificada y devuelve el manejador de la ventana hija situada en el tope del orden-Z con relacin a sus hermanas. Slo se tienen en cuenta las hermanas de las ventanas hijas que pertenecen a la madre especificada. Si una ventana hija tiene a su vez otras ventanas hijas, stas son excluidas.

hWnd: Manejador de la ventana madre entre cuyas ventanas hijas se va a buscar. Si este valor es cero, la funcin devolver la primera ventana hija de la ventana del escritorio.

Si la funcin tiene xito, devuelve el manejador de la ventana hija situada en el tope del orden-Z con relacin a sus hermanas. Si la funcin falla, o la ventana madre no tiene ventanas hijas, se devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

BringWindowToTop, EnumChildWindows, EnumWindows, GetActiveWindow, GetForegroundWindow, GetWindow, GetNextWindow, SetActiveWindow, SetForegroundWindow, ShowWindow

Consulte el Listado 5-25, relativo a la funcin GetNextWindow.

GetWindow( hWnd: HWND; uCmd: UINT ): HWND;

{manejador de ventana} {opciones de relacin} {devuelve un manejador de ventana}

Esta funcin devuelve el manejador de la ventana que se encuentra en la relacin especificada con la ventana pasada en el parmetro hWnd.

hWnd: Un manejador de ventana. La bsqueda comienza a partir de la ventana asociada con este manejador de ventana. uCmd: Especifica la relacin de la ventana que se desea buscar con la ventana especificada, y puede ser cualquier valor de la Tabla 5-5.

Si la funcin tiene xito, devuelve el manejador de la ventana encontrada. Si la funcin falla, o si no hay ninguna otra ventana que satisfaga la relacin deseada, la funcin devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetActiveWindow, GetNextWindow, GetTopWindow, EnumWindows, FindWindow

procedure var array begin of

end

GetWindowLong( hWnd: HWND; nIndex: Integer ): LongInt;

{manejador de ventana} {desplazamiento del valor a recuperar} {devuelve un valor de 32 bits}

Esta funcin devuelve el valor de 32 bits situado en el desplazamiento indicado de la memoria extra de ventana de la ventana especificada. Esta memoria extra es reservada al especificar un valor en el campo WndExtra del registro TWndClass utilizado en la llamada a RegisterClass. Adicionalmente, esta funcin puede devolver informacin acerca de la ventana si se utiliza alguno de los valores de la Tabla 5-6 en el parmetro nIndex.

hWnd: El manejador de la ventana a cuya memoria extra de ventana se desea acceder. nIndex: Especifica el desplazamiento (a partir de cero) en que se encuentra el valor de 32 bits a recuperar. Los posibles valores de este parmetro van desde cero hasta el nmero de bytes de memoria de ventana extra menos uno (por ejemplo, si se han reservado 16 bytes de memoria de clase extra, un valor 8 apuntara al tercer entero de 32 bits). Adicionalmente, uno de los valores de la Tabla 5-6 puede utilizarse para acceder a informacin especfica acerca de la ventana.

Si la funcin tiene xito, devuelve el valor de 32 bits que comienza en el desplazamiento especificado dentro de la zona de memoria extra de la ventana; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetClassInfo, GetClassInfoEx, GetClassName, RegisterClass, RegisterClassEx, SetClassLong, SetWindowLong

procedure var begin

if else

then or and not

if else

then or and not

if else

then or and not

if else

then or and not

if else

then or and not

or or or

or

end procedure var begin

if if if if

and and and and

then then then then

if

and

then

end

Estos valores estn disponibles en caso de que el parmetro hWnd especifique un cuadro de dilogo:

GetWindowRect( hWnd: HWND; var lpRect: TRect ): BOOL;

{manejador de ventana} {puntero registro de coordenadas rectangulares} {devuelve TRUE o FALSE}

Esta funcin almacena las coordenadas del rectngulo que contiene la ventana especificada en la estructura apuntada por la variable lpRect. Las coordenadas son relativas a la esquina superior izquierda de la pantalla, e incluyen la barra de ttulo, barras de desplazamiento, borde, etc. de la ventana especificada.

hWnd: El manejador de la ventana cuyo rectngulo se desea recuperar. lpRect: Puntero a registro de tipo TRect, cuyos miembros contienen las coordenadas de los extremos superior izquierdo e inferior derecho de la ventana especificada.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetWindowPlacement, GetClientRect, SetWindowPlacement

Consulte el Listado 5-21 relativo a la funcin GetClientRect.

GetWindowText( hWnd: HWND; {manejador de ventana} lpString: PChar; {puntero a buffer que recibir la cadena} nMaxCount: Integer {cantidad mxima de caracteres a copiar} ): Integer; {devuelve la longitud de la cadena copiada}

Esta funcin copia el texto de la barra de ttulo de la ventana al buffer especificado. Si la ventana es un control, el texto contenido en el control es copiado al buffer. Esta funcin enva un mensaje WM_GETTEXT a la ventana especificada.

hWnd: El manejador de la ventana cuyo texto se desea copiar al buffer. lpString: Puntero al buffer que recibir el texto de la ventana. nMaxCount: Especifica el nmero de caracteres mximo a ser copiado al buffer. Esta cantidad incluye el terminador nulo (por ejemplo, si se especifica el valor 21, 20 caracteres sern copiados al buffer, y el ltimo carcter ser para el terminador). El texto de la ventana es truncado si contiene una cantidad de caracteres superior a la especificada por este parmetro.

Si la funcin tiene xito, devuelve la longitud de la cadena copiada, no incluyendo el terminador nulo. Si la funcin falla, o no haba texto en la ventana especificada, la funcin devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetWindowTextLength, SetWindowText, WM_GETTEXT

procedure var begin

string

end procedure begin end

GetWindowTextLength( hWnd: HWND ): Integer;

{manejador de ventana} {devuelve la longitud del texto de la ventana}

Esta funcin recupera la longitud del texto de la barra de ttulo de una ventana en bytes. Si la ventana es un control, se devuelve la longitud del texto situado en el control. Esta

funcin enva un mensaje WM_GETTEXTLENGTH a la ventana. Es posible que esta funcin devuelva un resultado mayor que el tamao actual del texto cuando se utiliza una mezcla de funciones ANSI y Unicode dentro de la misma aplicacin.

hWnd: El manejador de la ventana.

Si la funcin tiene xito, devuelve la longitud del texto de la ventana especificada en bytes, no incluyendo el terminador nulo; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetWindowText, SetWindowText, WM_GETTEXT, WM_GETTEXTLENGTH

Consulte el Listado 5-29 relativo a la funcin GetWindowText.

IsChild( hWndParent: HWND; hWnd: HWND ): BOOL;

{manejador de ventana madre} {manejador de la ventana a comprobar} {devuelve TRUE o FALSE}

Esta funcin comprueba si una ventana es hija de la ventana madre especificada. La ventana es considerada madre si se puede establecer una lnea de descendencia desde ella hasta la ventana madre especificada.

hWndParent: El manejador de la ventana madre. hWnd: El manejador de la ventana hija a comprobar.

Si la funcin tiene xito, y la ventana identificada por el parmetro hWnd es una ventana hija de la ventana identificada por el parmetro WndParent, devuelve TRUE. Si la funcin falla, o no existe relacin de descendencia entre las ventanas, la funcin devuelve FALSE.

EnumChildWindows, GetParent, IsWindow, SetParent

Consulte la aplicacin WindowInfo, que puede descargar desde el apartado de este libro en http://edito rial.danysoft.com, para un ejemplo ms prctico de esta funcin.
procedure begin if else end procedure begin if else end procedure begin if else end then then then

IsIconic( hWnd: HWND ): BOOL;

{manejador de ventana} {devuelve TRUE o FALSE}

Esta funcin verifica si la ventana especificada est minimizada.

hWnd: El manejador de la ventana a verificar.

Si la funcin tiene xito y la ventana especificada est minimizada, devuelve TRUE. Si la funcin falla, o la ventana especificada no est minimizada, devuelve FALSE.

ArrangeIconicWindows, CloseWindow, DestroyWindow, IsWindowVisible, IsZoomed, OpenIcon, ShowWindow, WM_SIZE

Consulte la descripcin de la funcin CloseWindow en el captulo Funciones de movimiento de ventanas en el libro Los Tomos de Delphi: El API Grfico, editado por Danysoft Internacional, (ms informacin en http://edito rial.danysoft.com).

IsWindow( hWnd: HWND ): BOOL;

{manejador de ventana potencial } {devuelve TRUE o FALSE}

Esta funcin verifica el manejador de ventana que recibe para determinar si identifica a una ventana vlida existente.

hWnd: El manejador de la ventana a comprobar.

Si la funcin tiene xito y el manejador identifica a una ventana existente, devuelve TRUE. Si la funcin falla, o el manejador de ventana especificado no identifica a ninguna ventana existente, devuelve FALSE.

EnumWindows, EnumChildWindows, GetWindow, FindWindow, FindWindowEx, IsWindowEnabled, IsWindowVisible

Consulte la aplicacin WindowInfo, que se puede bajar desde el apartado de este libro en http://editorial.danysoft.com, para un ejemplo ms prctico del uso de esta funcin.
procedure begin

if else end

then

IsWindowEnabled( hWnd: HWND ): BOOL;

{manejador de ventana a comprobar} {devuelve TRUE o FALSE}

Esta funcin comprueba la ventana especificada para ver si est habilitada para la entrada por teclado o ratn. Una ventana hija puede recibir entrada nicamente si est habilitada y visible.

hWnd: El manejador de la ventana a comprobar.

Si la funcin tiene xito y la ventana especificada est habilitada, devuelve TRUE. Si la funcin falla, o la ventana especificada est deshabilitada, devuelve FALSE.

EnableWindow, GetActiveWindow, GetFocus, IsWindowVisible, SetActiveWindow, SetFocus, WM_ENABLE

Consulte el Listado 5-8 relativo a la funcin EnableWindow.

IsWindowUnicode( hWnd: HWND ): BOOL;

{manejador de ventana a comprobar} {devuelve TRUE o FALSE}

Esta funcin determina si la ventana especificada es una ventana nativa de Unicode.

hWnd: El manejador de la ventana a comprobar.

Si la funcin tiene xito y la ventana especificada es una ventana nativa de Unicode, devuelve TRUE. Si la funcin falla, o la ventana especificada no es una ventana nativa de Unicode, devuelve FALSE.

IsWindow

Consulte la aplicacin WindowInfo, que se puede bajar desde el apartado de este libro en http://editorial.danysoft.com, para un ejemplo ms prctico del uso de esta funcin.
procedure begin if else end then

IsWindowVisible( hWnd: HWND ): BOOL;

{manejador de ventana a comprobar} {devuelve TRUE o FALSE}

Esta funcin determina si la ventana especificada tiene activa la opcin de estilo WS_VISIBLE. Esta funcin devolver TRUE siempre que el atributo WS_VISIBLE est activado, an cuando la ventana est totalmente tapada por otras ventanas o no sea visible porque ha sido recortada por su ventana madre.

hWnd: El manejador de la ventana a comprobar.

Si la funcin tiene xito y la ventana especificada tiene la opcin de estilo WS_VISIBLE activada, devuelve TRUE. Si la funcin falla, o la ventana especificada no tiene la opcin de estilo WS_VISIBLE activada, devuelve FALSE.

BringWindowToTop, CloseWindow, FindWindow, GetWindowPlacement, SetWindowPlacement, ShowWindow

Hay dos cuadros de edicin en un formulario. Uno es visible, el otro no. Consulte la aplicacin WindowInfo, que se puede bajar desde el apartado de este libro en : http://editorial.danysoft.com, para un ejemplo ms prctico del uso de esta funcin.
procedure begin if else end procedure begin if else end then then

IsZoomed( hWnd: HWND ): BOOL;

{manejador de ventana a comprobar} {devuelve TRUE o FALSE}

Esta funcin comprueba si la ventana especificada est maximizada.

hWnd: El manejador de la ventana a comprobar.

Si la funcin tiene xito y la ventana est maximizada, devuelve TRUE. Si la funcin falla, o la ventana no est maximizada, devuelve FALSE.

GetWindowPlacement, GetWindowRect, IsIconic, ShowWindow

Consulte la aplicacin WindowInfo, que se puede bajar desde el apartado de este libro en http://editorial.danysoft.com, para un ejemplo ms prctico del uso de esta funcin.
procedure begin if else end then

RemoveProp( hWnd: HWND; lpString: PChar ): THandle;

{manejador de ventana} {puntero a cadena} {devuelve un valor de 32 bits}

Esta funcin elimina la propiedad asociada con la cadena especificada de la lista de propiedades de la ventana especificada. Antes de que una ventana sea destruida, la aplicacin debe eliminar todas las propiedades que ha aadido a la lista de propiedades de esa ventana. Una aplicacin slo puede eliminar las propiedades que ella misma ha aadido, y nunca deber eliminar propiedades aadidas por otras aplicaciones o por ventanas.

hWnd: El manejador de ventana cuya lista de propiedades se va a modificar. lpString: Puntero a cadena de caracteres terminada en nulo o tomo que identifica una cadena. Si se trata de un tomo, ste debe haber sido creado mediante una llamada a la funcin GlobalAddAtom. El tomo, un valor de 16 bits, debe situarse en la palabra menos significativa y la palabra ms significativa deber ser cero.

Si la funcin tiene xito, devuelve el valor de 32 bits asociado con la cadena especificada. Si la funcin falla, o la cadena no existe en la lista de propiedades, devuelve cero.

EnumProps, EnumPropsEx, GetProp, SetProp

Consulte el Listado 5-10, relativo a la funcin EnumProps, o el Listado 5-11, relativo a la funcin EnumPropsEx.

SetActiveWindow( hWnd: HWND ): HWND;

{manejador de la ventana a activar} {devuelve el manejador de la ventana activa anterior}

Esta funcin activa la ventana especificada, dndole el foco de entrada. La ventana slo ser trada a primer plano si la ventana es propiedad del hilo que llama a esta funcin. Utilice la funcin SetForegroundWindow para activar una ventana y forzar la activacin de su hilo propietario.

hWnd: Manejador de la ventana de nivel superior a activar.

Si la funcin tiene xito, devuelve el manejador de la ventana activa anterior; en caso contrario devuelve cero.

GetActiveWindow, SetForegroundWindow, WM_ACTIVATE

Este cdigo se coloca en el evento OnTimer de un temporizador que se dispara cada 1000 milisegundos.
procedure var

begin

if else end procedure begin end

then

SetClassLong( hWnd: HWND; nIndex: Integer; dwNewLong: LongInt ): DWORD;

{manejador de ventana} {ndice del valor a cambiar} {nuevo valor} {devuelve el valor anterior en ese ndice}

Esta funcin reemplaza el valor de 32 bits situado en el desplazamiento especificado de la memoria de clase extra de la clase de ventana asociada con la ventana identificada por hWnd. Esta memoria extra es reservada en el momento de la creacin de la clase de ventana, asignando un valor mayor que cero al campo ClsExtra del registro TWndClass utilizado en la llamada a RegisterClass. Adicionalmente, esta funcin puede modificar otra informacin acerca de la clase de ventana utilizando en el parmetro nIndex alguno de los valores de la siguiente Tabla.

hWnd: El manejador de la ventana cuya memoria de clase va a ser modificada. nIndex: Especifica el desplazamiento a partir del cual se encuentra el valor de 32 bits a modificar. Puede ser un valor entre cero y el nmero de bytes de la memoria de clase menos 4. Adicionalmente, cualquiera de los valores de la Tabla 5-7 puede ser utilizado para modificar informacin especfica acerca de la clase. dwNewLong: El nuevo valor de 32 bits a colocar en la posicin especificada.

Si la funcin tiene xito, devuelve el valor de 32 bits anterior en el desplazamiento especificado; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetClassInfo, GetClassInfoEx, GetClassLong, GetClassName, RegisterClass, RegisterClassEx, SetWindowLong

Consulte el Listado 5-20 relativo a la funcin GetClassLong.

SetFocus( hWnd: HWND ): HWND;

{manejador de ventana} {devuelve manejador de ventana anterior con el foco}

Esta funcin asocia a la ventana especificada el foco de entrada de teclado, activando la ventana o su ventana madre. Enva un mensaje WM_KILLFOCUS a la ventana que perder el foco de entrada del teclado, y un mensaje WM_SETFOCUS a la ventana que recibe el foco de entrada del teclado. Si hay una ventana activa pero ninguna ventana tiene el foco de entrada de teclado (al parmetro hWnd se ha asignado cero), cualquier pulsacin de tecla enviar un mensaje WM_SYSCHAR, WM_SYSKEYDOWN o WM_SYSKEYUP, segn sea el caso, al procedimiento de ventana de la ventana activa. En el caso de que la tecla VK_MENU sea pulsada tambin, el parmetro lParam de los mensajes tendr a uno el bit 30. Si el hilo que hace la llamada cre la ventana asociada con el manejador de ventana en el parmetro hWnd, su estado de foco de teclado es asociado a la ventana.

hWnd: El manejador de la ventana que recibir el foco de teclado. Si este parmetro es cero, la entrada por teclado es ignorada.

Si la funcin tiene xito, devuelve el manejador de la ventana que tena anteriormente el foco de entrada de teclado. Si la funcin falla, el parmetro hWnd contena un manejador de ventana invlido, o ninguna ventana tena el foco de teclado anteriormente, devuelve cero.

GetActiveWindow, GetFocus, SetActiveWindow, SetForegroundWindow, WM_KILLFOCUS, WM_SETFOCUS, WM_SYSCHAR, WM_SYSKEYDOWN, WM_SYSKEYUP

Note que este cdigo se coloca en el evento OnTimer de un temporizador que se dispara cada 1000 milisegundos.
procedure var begin

if else end

then

SetForegroundWindow( hWnd: HWND ): BOOL;

{manejador de ventana} {devuelve TRUE o FALSE}

Esta funcin activa la ventana especificada, la coloca en el tope del orden-Z, le asocia el foco de entrada de teclado, y trae a primer plano de ejecucin al hilo que cre la ventana. Las aplicaciones deben utilizar esta funcin para traerse a primer plano.

hWnd: El manejador de la ventana a ser activada y trada a primer plano.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetForegroundWindow, SetActiveWindow, WM_ACTIVATE

procedure var begin

end

SetParent( hWndChild: HWND; hWndNewParent: HWND ): HWND;

{manejador de ventana cuya madre se cambia} {manejador de la nueva ventana madre} {devuelve manejador de ventana madre anterior}

Esta funcin asigna a la ventana hWndChild la ventana hWndNewParent como ventana madre. Ambas ventanas deben pertenecer a la misma aplicacin. Si la ventana hija est visible, las ventanas se redibujan segn sea necesario.

hWndChild: Manejador de ventana hija. hWndNewParent: Manejador de la nueva ventana madre. Si este parmetro es cero, se asume que la nueva ventana madre ser la ventana de escritorio.

Si la funcin tiene xito, devuelve un manejador de la ventana madre anterior; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetParent

Este ejemplo utiliza un botn y un panel. Inicialmente el botn y el panel son ventanas hermanas, pero cuando el panel se convierte en ventana madre del botn, el botn aparece dentro del panel y es recortado dentro de los lmites de ste, (ver figura 5-14).
procedure begin end

SetProp( hWnd: HWND; lpString: PChar; hData: THandle ): BOOL;

{manejador de ventana} {puntero a cadena} {valor de 32 bits} {devuelve TRUE o FALSE}

Esta funcin aade o modifica una entrada a la lista de propiedades de la ventana especificada. Si la cadena especificada no existe en la lista de propiedades, una nueva entrada es aadida a la lista. Si la cadena ya existe, el valor asociado con la cadena especificada es sustituido por el nuevo valor. Antes de que una ventana sea destruida, la aplicacin que la cre debe eliminar todas las propiedades que haya aadido mediante la funcin RemoveProp.

hWnd: El manejador de la ventana cuya lista de propiedades se va a modificar. lpString: Puntero a cadena de caracteres terminada en nulo o tomo que identifica una cadena. Si se trata de un tomo, ste debe haber sido creado mediante una llamada a la funcin GlobalAddAtom. El tomo, un valor de 16 bits, debe situarse en la palabra menos significativa y la palabra ms significativa deber ser cero. hData: Un valor de 32 bits que ser asociado con la cadena especificada en la lista de propiedades, y puede ser cualquier valor definido por la aplicacin.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE.

EnumProps, EnumPropsEx, GetProp, RemoveProp

Consulte el Listado 5-10, relativo a la funcin EnumProps, o el Listado 5-11, relativo a la funcin EnumPropsEx.

SetWindowLong( hWnd: HWND; nIndex: Integer;

{manejador de ventana} {ndice del valor a cambiar}

dwNewLong: LongInt ): LongInt;

{nuevo valor} {devuelve el valor anterior en la posicin especificada}

Esta funcin reemplaza el valor de 32 bits situado en el desplazamiento especificado dentro de la memoria extra de la ventana. Esta memoria extra es reservada especificando un valor mayor que cero en el campo cbWndExtra del registro TWndClass que se pasa a la funcin RegisterClass. Adicionalmente, esta funcin puede modificar informacin acerca de la ventana utilizando para el parmetro nIndex alguno de los valores de la Tabla 5-8.

hWnd: El manejador de la ventana cuya memoria extra de ventana se desea modificar. nIndex: Especifica el desplazamiento (a partir de cero) en que se encuentra el valor de 32 bits a recuperar. Los posibles valores de este parmetro van desde cero hasta el nmero de bytes de memoria de ventana extra menos uno (por ejemplo, si se han reservado 16 bytes de memoria de clase extra, un valor 8 apuntara al tercer entero de 32 bits). Adicionalmente, uno de los valores de la Tabla 5-8 puede utilizarse para acceder a informacin especfica acerca de la ventana. dwNewLong: El nuevo valor de 32 bits a almacenar en la posicin especificada.

Si la funcin tiene xito, devuelve el valor de 32 bits anteriormente situado en la posicin especificada; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError. Si la funcin tiene xito y el valor anterior almacenado en la memoria de ventana era cero, el valor que devuelve la funcin es cero. Sin embargo, la informacin sobre el ltimo error no ser limpiada, lo que har difcil determinar si la funcin ha tenido xito o ha fallado. Los programadores deben limpiar la informacin sobre el ltimo error llamando a la funcin SetLastError, pasndole un valor de cero, antes de llamar a la funcin SetWindowLong. Si esto se hace, un fallo de SetWindowLong podra detectarse por un valor diferente de cero devuelto por GetLastError.

CallWindowProc, GetClassLong, GetWindowLong, RegisterClass, SetClassLong, SetParent

Consulte el Listado 5-28 relativo a la funcin GetWindowLong.

Estos valores estn disponibles en caso de que el parmetro hWnd especifique un cuadro de dilogo:

SetWindowText( hWnd: HWND; lpString: PChar ): BOOL;

{manejador de ventana} {puntero a cadena} {devuelve TRUE o FALSE}

Esta funcin cambia el texto de la barra de ttulo de la ventana especificada. Si la ventana es un control, el texto del control es cambiado. Esta funcin enva un mensaje WM_SETTEXT a la ventana especificada. Los caracteres de tabulacin no son expandidos, y aparecern como barras verticales. Note que si la ventana especificada es un control de cuadro de lista con la opcin de estilo WS_CAPTION, esta funcin asigna el texto del control, sin afectar las entradas del cuadro de lista.

hWnd: Manejador de ventana cuyo texto va a ser cambiado. lpString: Puntero a una cadena de caracteres terminada en nulo. Esta cadena se convertir en el texto de la ventana o control especificado.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetWindowText, GetWindowTextLength, WM_SETTEXT

Consulte el Listado 5-29 relativo a la funcin GetWindowText.

WindowFromPoint( Point: TPoint ): HWND;

{informacin de coordenadas} {devuelve manejador de ventana}

Esta funcin devuelve el manejador de la ventana que contiene el punto con las coordenadas especificadas. Esta funcin no detecta las ventanas escondidas o deshabilitadas.

Point: Especifica un registro de tipo TPoint que contiene las coordenadas a comprobar. Esas coordenadas son relativas a la pantalla.

Si la funcin tiene xito, devuelve el manejador de la ventana que contiene el punto de las coordenadas especificadas. Si la funcin falla, o no hay ninguna ventana que contenga el punto de las coordenadas especificadas, devuelve cero.

ChildWindowFromPoint, ChildWindowFromPointEx, WindowFromDC

procedure var array begin of

end

Las aplicaciones de mltiples hilos permiten al programador dividir un ejecutable en varias subtareas ms pequeas que se ejecutarn independientemente. El API de Windows ofrece diversas funciones relacionadas con la creacin y sincronizacin de hilos. Delphi incluye una encapsulacin muy eficiente de algunas de esas funciones del API a travs de la clase TThread. Mediante esta clase se hace posible crear hilos que pueden interactuar con otros elementos de la VCL de una manera segura, y que permite a los hilos beneficiarse del excelente mecanismo de gestin de excepciones de Delphi. Es importante sealar que el mltiple acceso simultneo a los objetos del GDI producir normalmente fallos de proteccin general. Para que mltiples hilos accedan a objetos del GDI, las llamadas debern ser sincronizadas utilizando cualquiera de los mtodos que se describirn a lo largo de este captulo.

Un proceso consta de memoria y recursos. La memoria de un proceso se divide en tres partes: pila (stack), datos y cdigo. En la pila se alojan las variables locales de las funciones y procedimientos y la pila de llamadas que va realizando la aplicacin. Cada nuevo hilo tendr su propia pila. En el segmento de datos se alojan las variables que no son locales y la memoria que es reservada dinmicamente. El segmento de cdigo contiene las instrucciones que conforman el programa y es de slo lectura. Cada una de esas tres partes est disponible a todos los hilos que pertenecen a un mismo proceso. Todo proceso se distingue de los dems mediante un identificador de proceso, que puede ser recuperado mediante una llamada a la funcin GetCurrentProcessId. Este identificador de proceso es nico a travs de todo el sistema.

6
Un hilo de ejecucin arranca cuando el procesador comienza a ejecutar cdigo. Todo hilo es propiedad de algn proceso, y un proceso puede poseer uno o ms hilos. Cada hilo tiene su propia pila y su propia cola de mensajes. Adicionalmente, un hilo puede utilizar memoria local de hilo (thread local storage) para reservar bloques de memoria para uso propio. La funcin TlsAlloc reserva dicha rea de memoria, mientras que las

funciones TlsGetValue y TlsSetValue permiten manipular los valores almacenados en esa memoria. Cuando un hilo reserva memoria local, esa rea de memoria quedar disponible para todos los hilos, pero cada hilo ver sus propios valores nicos al acceder a esa memoria.

Una seccin crtica es una forma rpida de sincronizacin. Se utiliza para proteger un recurso dentro de un hilo de su manipulacin por cualquier otro hilo del mismo proceso hasta que el hilo actual haya terminado. La aplicacin debe declarar una variable global de tipo TCriticalSection e inicializarla mediante la funcin InitializeCriticalSection. Cuando el hilo va a acceder al recurso que se desea proteger, debe llamar a la funcin EnterCriticalSection. A partir del momento en que el hilo entra en la seccin crtica, ningn otro hilo tendr acceso al recurso compartido hasta que el hilo actual no haga una llamada a la funcin LeaveCriticalSection.

Un semforo es otro tipo de objeto que puede utilizarse como mecanismo para la sincronizacin entre hilos. Un objeto semforo puede ser bloqueado por cierta cantidad de hilos hasta un lmite preestablecido. Este lmite se determina en el momento de la creacin del semforo mediante una llamada a la funcin CreateSemaphore. Un semforo puede ser utilizado para sincronizar mltiples hilos pertenecientes al mismo proceso o a procesos diferentes y puede ser bloqueado mltiples veces por un mismo hilo.

Un mutex es una forma de sincronizacin que solamente permitir el acceso a un recurso por un hilo en cada momento, incluso a travs de fronteras de procesos. Mutex es un acrnimo de MUTual EXclusion (exclusin mutua) y es similar a lo que se conoce como un semforo binario. Un semforo binario es un semforo en el que slo un hilo puede bloquear el objeto.

Un evento es un objeto de sincronizacin que se encuentra bajo el control directo del programador. En lugar de cambiar el estado del objeto como resultado de llamar a alguna de las funciones de espera (como por ejemplo, WaitForSingleObject), el programador puede utilizar tres funciones diferentes para controlar el estado del objeto. La funcin SetEvent establece el estado del objeto de evento en el valor activado o sealizado (signaled), la funcin ResetEvent asigna al estado del evento el valor desactivado o no sealizado (nonsignaled), y la funcin PulseEvent rpidamente asigna al evento el valor sealizado e inmediatamente despus no sealizado. Aqu

puede producirse un abrazo mortal (dead lock) si un hilo es suspendido de forma permanente como resultado de la prdida de un evento. Si PulseEvent o SetEvent son utilizadas con un evento que se desactiva automticamente y no hay ningn hilo esperando, se producir un abrazo mortal. Cuando se crea un objeto de evento, la aplicacin puede especificar si ste ser desactivado de forma manual o automtica. Los eventos con desactivacin manual se mantienen en estado sealizado hasta que no sean explcitamente desactivados mediante una llamada a ResetEvent. Los eventos con desactivacin automtica se mantiene activos hasta que un hilo que estaba en estado de espera del evento es liberado, punto en el que el sistema automticamente cambia el estado del evento a no sealizado.

Una variable de interbloqueo es una variable de 32 bits que puede ser accedida secuencialmente por cualquier cantidad de hilos de una manera segura. Las funciones InterlockedIncrement e InterlockedDecrement permiten a la aplicacin incrementar o decrementar la variable y comparar el valor de retorno de estas funciones con cero. La funcin InterlockedExchange intercambia el valor actual de la variable de interbloqueo con un nuevo valor, devolviendo el valor anterior de la variable.

El sistema determina cundo cada hilo recibir un intervalo de tiempo de CPU en base a sus niveles de prioridad. Cada proceso tiene una clase de prioridad, que determina el nivel de prioridad inicial de sus hilos. Cada hilo a su vez tiene su propio nivel de prioridad. Los procesos e hilos con niveles de prioridad superior tienen preferencia sobre los procesos e hilos de menor prioridad. Los niveles de prioridad bajos se utilizan para hilos que monitorizan la actividad del sistema, tales como salvapantallas. Los hilos de alta prioridad deben utilizarse solamente para tareas que deben ejecutarse en tiempo real o que deban comunicarse directamente con el hardware y no puedan ser interrumpidos.

En este captulo se describen las siguientes funciones de procesos e hilos:

CreateEvent( lpEventAttributes: PSecurityAttributes; bManualReset: BOOL; bInitialState: BOOL; lpName: PChar ): THandle;

{puntero a atributos de seguridad} {opcin de desactivacin automtica} {opcin de estado inicial} {nombre del objeto de evento} {devuelve manejador del evento}

Crea un objeto de evento, que puede estar sealizado o no sealizado. El manejador devuelto por CreateEvent tiene acceso de nivel EVENT_ALL_ACCESS al nuevo objeto de evento, y puede ser utilizado en cualquier funcin que necesite un manejador de un objeto de evento. Un objeto de evento est bajo el control directo del programador mediante las funciones SetEvent, ResetEvent y PulseEvent. Se producir un deadlock si dos hilos se esperan mutuamente.

lpEventAttributes: Un puntero a un registro que contiene informacin sobre los atributos de seguridad del evento. Si este parmetro es nil, el objeto de evento tendr los atributos de seguridad por defecto. Consulte la funcin CreateFile si desea ver la descripcin de la estructura TSecurityAttributes. bManualReset: Especifica si se desea crear un objeto de evento que se desactive de forma manual o automtica. Si el valor de este parmetro es TRUE, la funcin ResetEvent deber utilizarse para cambiar el estado del evento a no sealizado. Si es FALSE, Windows automticamente restablece el estado no sealizado despus de que un hilo en espera haya sido liberado.

bInitialState: Especifica el estado inicial del objeto de evento. Si es TRUE, el estado inicial ser sealizado; en caso contrario ser no sealizado. lpName: Puntero a cadena de caracteres terminada en cero que especifica el nombre del evento. El nombre est limitado a MAX_PATH caracteres, y puede contener cualquier carcter exceptuando la barra invertida (\).

La comparacin de nombres es sensible a diferencias entre maysculas y minsculas.

Si este parmetro coincide con el nombre de algn objeto de evento ya existente, la funcin solicita acceso EVENT_ALL_ACCESS al objeto de evento existente. En este caso, los parmetros bInitialState y bManualReset son ignorados, dado que el objeto ya ha sido configurado por el proceso que lo cre. El parmetro lpName puede tomar el valor nil, en cuyo caso se crear un evento annimo. Si el nombre coincide con el de algn semforo, mutex o mapeo de fichero, la funcin falla. En este caso, una llamada a GetLastError devolver el valor ERROR_INVALID_HANDLE.

Si la funcin tiene xito, devuelve un manejador del objeto de evento. Si la funcin falla, devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CloseHandle, CreateProcess, DuplicateHandle, OpenEvent, ResetEvent, SetEvent, WaitForSingleObject

var

implementation

function var string begin

stdcall

for begin

to

do

end

end procedure var begin nil end procedure begin nil

end procedure begin

end procedure begin

end procedure begin nil end

CreateMutex( lpMutexAttributes: PSecurityAttributes; bInitialOwner: BOOL; lpName: Pchar ): Thandle;

{puntero a atributos de seguridad} {opcin de propietario inicial} {nombre de objeto de exclusin mutua} {devuelve manejador del objeto}

Esta funcin crea un objeto de exclusin mutua con nombre o annimo. Un mutex es como un semforo que es optimizado an ms por el sistema operativo, y acta como un semforo binario que permitir que nicamente un hilo lo posea en cualquier momento dado. Un objeto mutex puede ser pasado a cualquiera de las funciones de espera/sincronizacin (por ejemplo, WaitForSingleObject) en procesos diferentes o en

el mismo proceso. Cuando un hilo utiliza una funcin de espera con un mutex, el hilo posee el mutex hasta que llame a ReleaseMutex. El hilo que posee el mutex puede llamar a las funciones de espera utilizando el mutex ms de una vez sin temor a bloquear su propia ejecucin. Sin embargo, por cada llamada del mismo hilo a una funcin de espera utilizando el mismo mutex deber haber luego una llamada a ReleaseMutex. Diferentes procesos pueden llamar a CreateMutex especificando el mismo nombre de mutex. Esto provocar que la segunda llamada solamente abra un nuevo manejador para el mutex ya existente, sin crear uno nuevo. Asigne a bInitialOwner el valor FALSE en tales casos. La funcin CloseHandle se utiliza para cerrar un manejador de un mutex. El manejador es cerrado automticamente cuando el proceso que lo abri finaliza. Cuando el ltimo manejador asociado al mutex es cerrado, el mutex es destruido.

lpMutexAttributes: Un puntero a un registro de tipo TSecurityAttributes que contiene informacin sobre los atributos de seguridad del mutex. Consulte la funcin CreateFile si desea ver la descripcin de la estructura TSecurityAttributes. Si este parmetro es nil, el mutex tendr los atributos de seguridad por defecto y el manejador no ser heredable. bInitialOwner: Especifica la propiedad del objeto mutex. Si el valor de este parmetro es TRUE, el hilo que hace la llamada solicita convertirse inmediatamente en el propietario del mutex; en caso contrario, el mutex no tendr propietario. lpName: Puntero a cadena de caracteres terminada en nulo que especifica el nombre del mutex a crear.

Si la funcin tiene xito, devuelve un manejador del mutex que ha sido creado. Si la funcin falla, devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError. Si el parmetro lpName contiene el nombre de un mutex que ya existe, entonces GetLastError devolver el valor ERROR_ALREADY_EXISTS.

CloseHandle, CreateProcess, DuplicateHandle, OpenMutex, ReleaseMutex, WaitForSingleObject

function var string begin

stdcall

for begin end

to

do

end function var string begin stdcall

for begin end

to

do

end function var string begin stdcall

for begin end

to

do

end procedure var begin nil nil nil nil nil nil nil

end

CreateProcess( lpApplicationName: PChar; {puntero a nombre de la aplicacin} lpCommandLine: PChar; {puntero a lnea de comandos de aplicacin} lpProcessAttributes, {puntero a atributos de seguridad de proceso} lpThreadAttributes: PSecurityAttributes; {puntero a atributos de seguridad de hilo} bInheritHandles: BOOL; {opcin de herencia} dwCreationFlags: DWORD; {opcin de creacin} lpEnvironment: Pointer; {puntero a bloque de entorno} lpCurrentDirectory: PChar; {puntero a directorio actual} const lpStartupInfo: TStartupInfo; {puntero a registro TStartupInfo} var lpProcessInformation: {puntero a registro TProcessInformation} TProcessInformation ): BOOL; {devuelve TRUE o FALSE}

Esta funcin crea un nuevo proceso y su hilo principal. El hilo principal que se crear tendr el tamao de pila inicial especificado en la cabecera del ejecutable, y el hilo principal comenzar su ejecucin por el punto de entrada especificado en la imagen ejecutable. El punto de entrada de una aplicacin Delphi se establece modificando el valor Project|Options|Linker|Image base. El valor por defecto que all se nos ofrece nunca debe ser modificado.

lpApplicationName: Puntero a cadena de caracteres terminada en cero que especifica el nombre del ejecutable. Si este parmetro es nil, entonces el parmetro lpCommandLine deber contener la ruta y el nombre del ejecutable (por ejemplo, C:\Windows\Wordpad.exe README.TXT). Bajo Windows NT, este parmetro debe ser nil y el parmetro lpCommandLine deber ser utilizado para especificar el nombre del ejecutable. lpCommandLine: Una cadena de caracteres terminada en nulo que especifica la lnea de comandos para el ejecutable. Si este parmetro es nil, el parmetro lpApplicationName puede ser utilizado para la lnea de comandos de la aplicacin. Si ninguno de los dos parmetros es nil, el parmetro lpApplicationName indicar la ruta y el nombre de la aplicacin, y el parmetro lpCommandLine indicar la lnea de comandos de la aplicacin. Si el parmetro lpApplicationName es nil, la parte de esta cadena que preceda al primer espacio en blanco representar el nombre de la aplicacin. Si no se suministra la extensin EXE, sta ser aadida a menos que exista un punto (.) en el nombre del fichero o el nombre del fichero contenga la ruta. lpProcessAttributes: Un puntero a un registro de tipo TSecurityAttributes que contiene informacin sobre los atributos de seguridad del proceso. Consulte la funcin

CreateFile si desea ver la descripcin de la estructura TSecurityAttributes. Si este parmetro es nil, el proceso tendr los atributos de seguridad por defecto y el manejador no ser heredable. lpThreadAttributes: Un puntero a un registro de tipo TSecurityAttributes que contiene informacin sobre los atributos de seguridad del hilo principal del proceso. Consulte la funcin CreateFile si desea ver la descripcin de la estructura TSecurityAttributes. Si este parmetro es nil, el hilo tendr los atributos de seguridad por defecto y el manejador no ser heredable. bInheritHandles: Indica si el nuevo proceso heredar los manejadores abiertos por el proceso que hace la llamada. Si el valor de este parmetro es TRUE, el proceso creado heredar los manejadores abiertos del proceso que hace la llamada. Los manejadores heredados tendrn los mismos valores y privilegios de acceso que los originales. dwCreationFlags: Especifica las opciones de creacin del proceso y controla la clase de prioridad de ste. La clase de prioridad por defecto es NORMAL_PRIORITY_CLASS, pero si el proceso creador tiene prioridad IDLE_PRIORITY_CLASS, entonces la clase de prioridad por defecto del proceso hijo ser tambin IDLE_PRIORITY_CLASS. Este parmetro puede incluir cualquier combinacin de los valores de la siguiente tabla de opciones de creacin (Tabla 6-2), y un valor de los especificados en la tabla de clases de prioridad (Tabla 6-3). lpEnvironment: Puntero a un bloque de entorno para el nuevo proceso. Si este parmetro tiene el valor nil, el nuevo proceso utilizar el entorno del proceso que hace la llamada. Consulte la funcin GetEnvironmentStrings para ms informacin. lpCurrentDirectory: Una cadena de caracteres terminada en cero que especifica la unidad y directorio actual para el nuevo proceso. Si este parmetro es nil, el nuevo proceso tendr el mismo directorio actual que el proceso que hace la llamada. lpStartupInfo: Puntero a registro de tipo TStartupInfo que especifica cmo la ventana principal del nuevo proceso deber aparecer en pantalla. Consulte la funcin GetStartupInfo para ms informacin. lpProcessInformation: Variable de tipo TProcessInformation que recibir informacin acerca del nuevo proceso. El registro TProcessInformation se define de la siguiente forma: TProcessInformation = record hProcess: THandle; hThread: THandle; dwProcessId: DWORD; dwThreadId: DWORD; end; {manejador del proceso} {manejador del hilo principal} {identificador global del proceso} {identificador global del hilo}

hProcess: Manejador del proceso recin creado. hThread: Manejador del hilo principal del proceso recin creado. dwProcessId: Identificador global del proceso.

dwThreadId: Identificador global del hilo.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CloseHandle, CreateThread, ExitProcess, ExitThread, GetCommandLine, GetEnvironmentStrings, GetExitCodeProcess, GetFullPathName, GetStartupInfo, GetSystemDirectory, GetWindowsDirectory, OpenProcess, ResumeThread, TerminateProcess, WaitForInputIdle

Consulte el Listado 6-3 asociado a la funcin CreateSemaphore.

CreateSemaphore( lpSemaphoreAttributes: PSecurityAttributes; lInitialCount: LongInt; lMaximumCount: LongInt; lpName: PChar ): THandle;

{Puntero a atributos de seguridad} {valor inicial de contador} {valor mximo de contador} {Puntero a nombre del objeto semforo} {devuelve manejador del objeto semforo}

Esta funcin crea un objeto de semforo con nombre o annimo. El manejador devuelto por CreateSemaphore tiene acceso de nivel SEMAPHORE_ALL_ACCESS al nuevo objeto semforo y puede ser utilizado en cualquier funcin que necesite un manejador de un semforo, como las funciones de espera o DuplicateHandle. Las funciones de espera por un solo objeto retornan cuando el estado del objeto especificado es sealizado. A las funciones de espera por mltiples objetos se les puede indicar si deben retornar cuando uno cualquiera de los objetos especificados sea sealizado, o slo cuando todos los objetos a la vez sean sealizados. Cuando una funcin de espera retorna, el hilo en espera es liberado para que contine su ejecucin. El estado de un objeto de semforo se considera sealizado cuando el valor de su contador es mayor que cero, y no sealizado cuando su contador vale cero. El parmetro lInitialCount especifica el valor inicial del contador. Cada vez que un hilo en espera es liberado por el hecho de que el contador del semforo es mayor que cero, el valor del contador es decrementado en uno. El valor del contador no podr nunca ser menor que cero ni mayor que el valor especificado en el parmetro lMaximumCount. A un semforo pueden tener acceso simultneo mltiples procesos, lo que permite la utilizacin de los semforos para la sincronizacin a travs de fronteras de proceso. Si el parmetro lpSemaphoreAttributes de CreateSemaphore indica que la herencia est activada, el manejador devuelto por CreateSemaphore podr ser heredado por un proceso hijo creado mediante llamada a CreateProcess. El manejador devuelto por CreateSemaphore puede ser duplicado utilizando la funcin DuplicateHandle.

lpSemaphoreAttributes: Un puntero a un registro de tipo TSecurityAttributes que contiene informacin sobre los atributos de seguridad del semforo. Consulte la funcin CreateFile si desea ver la descripcin de la estructura TSecurityAttributes. Si este parmetro es nil, el semforo tendr los atributos de seguridad por defecto y el manejador no ser heredable. lInitialCount: Determina el valor inicial del contador del semforo, y debe ser mayor o igual a cero. Si este parmetro es cero, el estado del semforo es no sealizado. En el momento en que una funcin de espera libera un hilo que est esperando por el semforo, el contador es decrementado en uno. lMaximumCount: Establece el valor mximo del contador del semforo, y debe ser mayor que cero. lpName: Una cadena de caracteres terminada en cero que contiene el nombre del semforo. La longitud del nombre est limitada a MAX_PATH caracteres. El nombre es sensible a las diferencias entre maysculas y minsculas, y puede contener cualquier carcter a excepcin de la barra invertida (\). Si este parmetro es nil, se crear un objeto de semforo annimo. Si el nombre coincide con el de un objeto de semforo ya existente, esta funcin solicitar acceso de nivel SEMAPHORE_ALL_ACCESS al objeto. Los semforos, mutexes, eventos y objetos de mapeado de ficheros comparten el mismo espacio de direcciones, por lo que esta funcin fallar si el nombre coincide con el de cualquier otro mutex, evento u objeto de mapeado de fichero. En esa situacin, una llamada a GetLastError devolver el valor ERROR_INVALID_HANDLE.

Si la funcin tiene xito, devuelve un manejador del objeto de semforo. Si ya exista un semforo con el mismo nombre antes de la llamada a CreateSemaphore, una llamada a GetLastError devolver ERROR_ALREADY_EXISTS. Si la funcin falla, devuelve cero.

CloseHandle, CreateProcess, DuplicateHandle, OpenSemaphore, ReleaseSemaphore, WaitForSingleObject

procedure var begin

for

to

do

nil end procedure var string begin nil

with begin

do

end

nil nil nil nil end procedure var begin

nil

end

procedure

begin or or

for

to

do

end

CreateThread( lpThreadAttributes: Pointer; dwStackSize: DWORD; lpStartAddress: TFNThreadStartRoutine; lpParameter: Pointer; dwCreationFlags: DWORD; var lpThreadId: DWORD ): THandle;

{puntero a atributos de seguridad} {tamao de pila del hilo en bytes} {direccin de rutina del hilo} {parmetro del nuevo hilo} {opciones de creacin} {direccin para identificador del hilo } {devuelve el manejador del nuevo hilo}

Esta funcin crea y ejecuta un nuevo hilo. El hilo resultante ocupar el mismo espacio de direcciones del proceso que hace la llamada. La ejecucin del hilo comienza en la direccin especificada a travs del parmetro lpStartAddress. La funcin GetExitCodeThread devolver el cdigo de finalizacin del hilo. El hilo ser creado con una prioridad THREAD_PRIORITY_NORMAL. Para establecer la prioridad del hilo, utilice la funcin SetThreadPriority.

lpThreadAttributes: Un puntero a un registro de tipo TSecurityAttributes que contiene informacin sobre los atributos de seguridad del hilo. Consulte la funcin CreateFile si desea ver la descripcin de la estructura TSecurityAttributes. Si este parmetro es nil, el hilo tendr los atributos de seguridad por defecto y el manejador no ser heredable. dwStackSize: Especifica el tamao de pila inicial del hilo. Si este parmetro vale cero, el hilo tendr el mismo tamao de pila que el hilo principal del proceso. El tamao de pila del hilo puede crecer si es necesario. lpStartAddress: Puntero a funcin de hilo. La funcin deber utilizar el convenio de llamada stdcall. Deber recibir un parmetro de tipo puntero y devolver un LongInt. lpParameter: Puntero al parmetro que es pasado a la funcin. dwCreationFlags: Controla la creacin del hilo. Si se especifica la opcin CREATE_SUSPENDED, el hilo no se ejecutar hasta que la funcin ResumeThread sea llamada. Si este parmetro es cero, el hilo se ejecutar inmediatamente. lpThreadId: Variable que recibir el identificador del nuevo hilo. Este valor es nico a travs de todo el sistema.

Si la funcin tiene xito, devuelve un manejador del hilo creado. Si la funcin falla, devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CloseHandle, CreateProcess, ExitProcess, ExitThread, GetExitCodeThread, GetThreadPriority, ResumeThread, SetThreadPriority

Consulte el Listado 6-12 (funcin InitializeCriticalSection), y otros ejemplos a lo largo de este captulo.

DeleteCriticalSection( var lpCriticalSection: TRTLCriticalSection {Puntero a objeto de seccin crtica} ); {no devuelve nada}

Esta funcin elimina el objeto de seccin crtica especificado y libera los recursos asociados con l. Una vez que el objeto es eliminado, no podr ser utilizado por las funciones EnterCriticalSection o LeaveCriticalSection.

lpCriticalSection: Una variable de tipo TRTLCriticalSection que contiene la seccin crtica a eliminar. La estructura de datos TRTLCriticalSection debe ser tratada por la aplicacin como un objeto totalmente encapsulado, y sus campos nunca debern ser accedidos directamente.

EnterCriticalSection, InitializeCriticalSection, LeaveCriticalSection

Consulte el Listado 6-12, correspondiente a InitializeCriticalSection.

DuplicateHandle( hSourceProcessHandle: THandle;{manejador del proceso con manejador a duplicar} hSourceHandle: THandle; {manejador a duplicar} hTargetProcessHandle: THandle; {manejador del proceso destino} lpTargetHandle: PHandle; {puntero a manejador duplicado} dwDesiredAccess: DWORD; {opciones de acceso al manejador duplicado} bInheritHandle: BOOL; {opcin de herencia del manejador} dwOptions: DWORD {opciones especiales} ): BOOL; {devuelve TRUE o FALSE}

Esta funcin se utiliza para duplicar un manejador con un nivel de acceso diferente al del manejador original, o un manejador no heredable para el caso en que el original fuera heredable. El proceso de origen y el de destino pueden coincidir. El proceso que duplica utiliza la funcin GetCurrentProcess para obtener su propio manejador. Para obtener un manejador fuera del proceso actual, puede ser necesario utilizar una

canalizacin con nombre (named pipe) o memoria compartida, para comunicar el identificador de proceso duplicador, y luego utilizar ese identificador en una llamada a OpenProcess. Los manejadores duplicados pueden tener derechos de acceso superiores a los del manejador original en la mayora de los casos. Por ejemplo, si el manejador original ofrece el derecho de acceso GENERIC_READ, el manejador duplicado no podr ofrecer los derechos de acceso GENERIC_READ y GENERIC_WRITE.

hSourceProcessHandle: Especifica el manejador del proceso que contiene el manejador a duplicar. Tenga en cuenta que el manejador deber tener el derecho de acceso PROCESS_DUP_HANDLE. hSourceHandle: El manejador a duplicar. Este manejador puede haber sido devuelto por alguna de las funciones listadas en la Tabla 6-4. hTargetProcessHandle: Especifica el manejador del proceso que recibir el manejador duplicado. Tenga en cuenta que el manejador deber tener el derecho de acceso PROCESS_DUP_HANDLE. lpTargetHandle: Variable que recibe el manejador duplicado. dwDesiredAccess: Especifica las opciones (derechos) de acceso para el nuevo manejador. Si el parmetro dwOptions especifica la opcin DUPLICATE_SAME_ACCESS, este parmetro es ignorado. Si esta opcin no es especificada, los derechos de acceso dependern del tipo de manejador que se est duplicando. Consulte las descripciones de las funciones individuales de creacin de manejadores para ms informacin acerca de los derechos de acceso. bInheritHandle: Especifica la herencia de manejador. Si este parmetro es TRUE, el manejador duplicado puede ser heredado por nuevos procesos que sean creados por el proceso de destino. El valor FALSE indica que el nuevo manejador no podr ser heredado. dwOptions: Especifica acciones opcionales. Este parmetro puede ser puesto a cero, o utilizar cualquier combinacin de valores de la Tabla 6-5.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CloseHandle, CreateEvent, CreateFile, CreateFileMapping, CreateMutex, CreateProcess, CreateSemaphore, CreateThread, GetCurrentProcess, GetExitCodeProcess, GetExitCodeThread, GetPriorityClass, GetThreadPriority, OpenEvent, OpenMutex, OpenProcess, OpenSemaphore, RegCreateKeyEx, RegOpenKeyEx, ReleaseMutex, ReleaseSemaphore, ResetEvent, ResumeThread, SetEvent, SetPriorityClass, SetThreadPriority, SuspendThread, TerminateProcess, TerminateThread

var

implementation

function var begin

for

to

do

for

to

do

end procedure var

begin nil nil

if not begin end end procedure begin end

then

EnterCriticalSection( var lpCriticalSection: TRTLCriticalSection {Puntero a objeto de seccin crtica} ); {no devuelve nada}

Un objeto de seccin crtica puede utilizarse para ofrecer acceso exclusivo a una seccin de cdigo dentro de un nico proceso. El objeto deber ser inicializado antes de poder ser usado. EnterCriticalSection debe ser llamado por cada hilo para solicitar la propiedad del recurso protegido. Unicamente un hilo tendr acceso al recurso en cada momento, y el hilo que est usando en un momento dado el recurso deber llamar a LeaveCriticalSection para liberar el recurso. Un hilo puede llamar a EnterCriticalSection ms de una vez despus de que haya obtenido su propiedad. En ese caso, deber hacer una llamada a LeaveCriticalSection por cada vez que haya llamado a EnterCriticalSection.

lpCriticalSection: Una variable de tipo TRTLCriticalSection que contiene la seccin crtica a la que se desea entrar. El registro TRTLCriticalSection debe ser tratado por la aplicacin como un objeto totalmente encapsulado, y los campos de ese registro nunca debern ser manipulados directamente.

CreateMutex, DeleteCriticalSection, InitializeCriticalSection, LeaveCriticalSection

Consulte el Listado 6-12, asociado a la funcin InitializeCriticalSection.

ExitProcess( uExitCode: UINT );

{cdigo de finalizacin para todos los hilos} {no devuelve nada}

Este procedimiento termina la ejecucin de un proceso y todos sus hilos, devolviendo un cdigo de finalizacin comn. Despus que un proceso es finalizado, su estado y el estado de todos sus hilos queda sealizado. Una llamada exitosa a este procedimiento produce los siguientes efectos: 1. Todos los manejadores de objetos abiertos por el proceso son creados. 2. Todos los hilos del proceso terminan. 3. El estado del proceso queda sealizado, dando luz verde a los hilos que pudiesen estar esperando por el proceso. 4. El estado de todos los hilos pertenecientes al proceso queda sealizado, dando luz verde a los hilos que pudiesen estar esperando por esos hilos. 5. El estado de finalizacin es cambiado del valor STILL_ACTIVE al cdigo de finalizacin especificado por el parmetro uExitCode. La finalizacin de un proceso podra no eliminarlo a l o a algunos de sus procesos hijos del sistema. Slo cuando todos los manejadores abiertos del proceso hayan sido cerrados ser eliminado el proceso del sistema.

uExitCode: Especifica el cdigo de finalizacin del proceso y todos sus hilos, que terminarn como resultado de esta llamada. Utilice la funcin GetExitCodeProcess para recuperar el cdigo de finalizacin del proceso y la funcin GetExitCodeThread para recuperar el cdigo de terminacin de un hilo.

CreateProcess, CreateThread, ExitThread, GetExitCodeProcess, GetExitCodeThread, OpenProcess, TerminateProcess

procedure begin end

ExitThread( dwExitCode: DWORD );

{cdigo de finalizacin de hilo} {no devuelve nada}

Este procedimiento terminar la ejecucin de un hilo y limpiar las DLLs asociadas a l. Si se trata del ltimo hilo de un proceso, el proceso tambin terminar. El hilo en cuestin quedar sealizado, y los hilos que estuviesen esperando por l quedarn liberados. Una llamada exitosa a este procedimiento produce los siguientes efectos: 1. Todos los manejadores de objetos abiertos por el hilo sern cerrados. 2. Todos los hilos creados por el hilo especificado sern finalizados. 3. El estado del hilo queda sealizado, dando luz verde a los hilos que pudiesen estar esperando por l. 4. El estado de todos los hilos creados por el hilo especificado quedar sealizado, dando luz verde a los hilos que pudiesen estar esperando por esos hilos. 5. El estado de finalizacin es cambiado de STILL_ACTIVE al cdigo de finalizacin especificado por el parmetro uExitCode.

dwExitCode: Especifica el cdigo de finalizacin del hilo, y de todos los dems hilos que terminen como resultado de esta llamada. Utilice la funcin GetExitCodeThread para recuperar este valor.

CreateProcess, CreateThread, ExitProcess, FreeLibraryAndExitThread, GetExitCodeThread, TerminateThread

Consulte el Listado 6-5 bajo DuplicateHandle, y otros ejemplos a lo largo de este captulo.

GetCurrentProcess: THandle;

{devuelve un manejador del proceso actual}

Esta funcin devuelve un pseudo-manejador del proceso actualmente en ejecucin. Este manejador es vlido solamente en el contexto del proceso que hace la llamada. Para utilizar el manejador en otro proceso, cree un duplicado de l mediante una llamada a la funcin DuplicateHandle. Este manejador puede tambin ser utilizado en la funcin OpenProcess para crear un manejador verdadero. El manejador devuelto por la funcin no es heredado por los procesos hijos.

Si la funcin tiene xito, devuelve un manejador del proceso actual; en caso contrario devuelve cero.

CloseHandle, DuplicateHandle, GetCurrentProcessId, GetCurrentThread, OpenProcess

Consulte el Listado 6-5, correspondiente a DuplicateHandle.

GetCurrentProcessId: DWORD;

{devuelve el identificador del proceso actual}

Esta funcin recupera el identificador del proceso actual. Este valor es nico a travs de todo el sistema.

Si la funcin tiene xito, devuelve el identificador del proceso actual; en caso contrario devuelve cero.

GetCurrentProcess, OpenProcess

procedure begin end

GetCurrentThread: THandle;

{devuelve un manejador del hilo actual}

Esta funcin devuelve un pseudo-manejador del hilo actualmente en ejecucin. Este manejador es vlido solamente en el contexto del proceso que hace la llamada. Para utilizar el manejador en otro proceso, cree un duplicado de l llamando a la funcin DuplicateHandle. El manejador devuelto por la funcin no ser heredado por los procesos hijos.

Si la funcin tiene xito, devuelve un manejador del hilo actual; en caso contrario devuelve cero.

CloseHandle, DuplicateHandle, GetCurrentProcess, GetCurrentThreadId

Consulte el Listado 6-5 correspondente a DuplicateHandle.

GetCurrentThreadId: DWORD

{identificador del hilo actual}

Esta funcin devuelve el identificador del hilo actual. Este valor es nico a travs de todo el sistema.

Si la funcin tiene xito, devuelve el identificador del hilo actual; en caso contrario devuelve cero.

GetCurrentThread

Consulte el Listado 6-7, correspondiente a GetCurrentProcessId.

GetExitCodeProcess( hProcess: THandle; var lpExitCode: DWORD ): BOOL;

{manejador del proceso} {recibe el estado de finalizacin} {devuelve TRUE o FALSE}

Esta funcin se utiliza para recuperar el cdigo de finalizacin de un proceso. Si el proceso an no ha terminado, la funcin devolver STILL_ACTIVE. Si el proceso ha finalizado, el valor devuelto podr ser uno de los siguientes: 1. El cdigo de finalizacin especificado por el proceso mediante las funciones ExitProcess o TerminateProcess. 2. El valor que devuelve la funcin de entrada de la aplicacin, conocida como WinMain en la programacin tradicional para Windows. 3. El valor de la excepcin, para una excepcin no tratada. Si la funcin TerminateProcess es llamada posteriormente a la finalizacin del proceso, GetExitCodeProcess podr devolver un valor diferente al especificado en esa llamada tarda a TerminateProcess.

hProcess: Especifica el manejador del proceso. Bajo Windows NT, el manejador deber tener el derecho PROCESS_QUERY_INFORMATION. lpExitCode: La variable que recibir el cdigo de estado del proceso. Este valor se especifica al llamar a las funciones ExitProcess o TerminateProcess.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

ExitProcess, ExitThread, TerminateProcess

Consulte el Listado 6-16, correspondiente a TerminateProcess.

GetExitCodeThread( hThread: THandle; var lpExitCode: DWORD ): BOOL;

{manejador del hilo} {recibe el cdigo de finalizacin} {devuelve TRUE o FALSE}

Esta funcin se utiliza para recuperar el cdigo de finalizacin de un hilo. Si el hilo no ha terminado, la funcin devolver STILL_ACTIVE. Si el hilo ha terminado, el cdigo de finalizacin puede ser uno de los siguientes: 1. El cdigo de finalizacin especificado en la llamada a las funciones ExitThread o TerminateThread. 2. El valor devuelto por la funcin del hilo. 3. El cdigo de finalizacin del proceso al que el hilo pertenece. Si la funcin TerminateThread es llamada despus de que el hilo haya finalizado, GetExitCodeThread podra no devolver el cdigo de salida especificado en esa llamada tarda a TerminateThread.

hThread: Manejador que identifica al hilo. Bajo Windows NT, el manejador deber tener el derecho THREAD_QUERY_INFORMATION. lpExitCode: La variable que recibir el valor del cdigo de finalizacin.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

ExitThread, GetExitCodeProcess, TerminateThread

function var string begin

stdcall

for begin end

to

do

end procedure var begin nil if begin end end procedure var begin then nil nil

end

GetPriorityClass( hProcess: THandle ): DWORD;

{manejador del proceso} {devuelve la clase de prioridad del objeto}

Esta funcin recupera la clase de prioridad del proceso especificado. Cada hilo tiene un nivel de prioridad basado en la combinacin de la prioridad del hilo y la prioridad del proceso. El sistema determina cundo el hilo obtiene un cuanto de tiempo de CPU en base a su prioridad.

hProcess: El manejador del proceso. Bajo Windows NT, el manejador deber tener el derecho THREAD_QUERY_INFORMATION sobre el proceso.

Si la funcin tiene xito, devuelve la clase de prioridad del proceso especificado, que puede ser uno de los valores mostrados en la Tabla 6-6. Si la funcin falla, devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetThreadPriority, SetPriorityClass, SetThreadPriority

procedure var begin

case

of

end end

procedure begin case of

end end

GetThreadPriority( hThread: THandle ): Integer;

{manejador del hilo} {devuelve el nivel de prioridad del hilo}

GetThreadPriority devuelve la prioridad del hilo, que se obtiene a partir de la clase de prioridad del proceso base y del nivel de prioridad del hilo. El sistema utilizar este nivel de prioridad para planificar cul ser el prximo hilo que obtendr un cuanto de tiempo de CPU.

hThread: Especifica el manejador del hilo. Bajo Windows NT, el manejador deber tener el derecho THREAD_QUERY_INFORMATION sobre el hilo.

Si la funcin tiene xito, devuelve un valor entero que indica el nivel de prioridad del hilo, que puede ser uno de los valores de la Tabla 6-7. Si la funcin falla, devuelve THREAD_PRIORITY_ERROR_RETURN. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetPriorityClass, SetPriorityClass, SetThreadPriority

6
procedure var begin

case

of

end end

procedure var begin

case

of

end end

6
GetWindowThreadProcessId( hWnd: HWND; {manejador de ventana}

lpdwProcessId: Pointer ): DWORD;

{puntero a buffer que recibe identificador de proceso} {devuelve identificador de hilo}

Esta funcin recupera el identificador del hilo que ha creado la ventana identificada por el parmetro hWnd. Si el parmetro lpdwProcessId es distinto de nil, se devuelve adems el identificador del proceso que ha creado la ventana.

hWnd: Manejador de la ventana cuyos identificadores de hilo y de proceso se desean recuperar. lpdwProcessId: Puntero a un buffer de 32 bits que recibir el identificador del proceso. Este parmetro puede ser nil si no se necesita obtener el identificador de proceso.

Si la funcin tiene xito, devuelve el identificador del hilo que cre la ventana especificada; en caso contrario devuelve cero.

GetCurrentProcessId, GetCurrentThreadId

procedure var begin

end

InitializeCriticalSection( var lpCriticalSection: TRTLCriticalSection {puntero a la seccin crtica} ); {no devuelve nada}

Esta funcin inicializa un objeto de seccin crtica, que podr en lo adelante utilizarse para la sincronizacin de los hilos de un nico proceso. Una seccin crtica slo puede utilizarse dentro de un mismo proceso y garantiza que en cualquier momento de tiempo nicamente un hilo del proceso tendr acceso a la seccin de cdigo protegida por la seccin crtica. Despus de la inicializacin de la seccin crtica, los dems hilos del proceso utilizarn las funciones EnterCriticalSection y LeaveCriticalSection para llevar a cabo el acceso mutuamente exclusivo al mismo bloque de instrucciones.

lpCriticalSection: Una variable de tipo TRTLCriticalSection que contiene la seccin crtica a inicializar. El registro TRTLCriticalSection debe ser tratado por la aplicacin como un objeto completamente encapsulado, y los campos del registro no debern ser manipulados directamente.

CreateMutex, DeleteCriticalSection, EnterCriticalSection, LeaveCriticalSection

var

implementation

function var begin

stdcall

for

to

do

end procedure var begin

nil nil end procedure begin end

nil nil

InterlockedDecrement( var Addend: Integer ): Integer;

{Puntero a variable de 32 bits a decrementar} {devuelve cdigo que indica el signo del resultado}

Esta funcin disminuye en uno el valor de la variable de 32 bits especificada. Al hacerlo, garantizar que no sea posible acceder simultneamente desde ms de un hilo a la misma variable mediante funciones de interbloqueo. La funcin, por lo tanto, ofrece un mecanismo seguro para modificar el valor de una variable entera. Si la variable apuntada por el parmetro Addend no est alineada en una frontera de 32 bits, la funcin fallar en una mquina con mltiples procesadores. Delphi alinea automticamente las variables en fronteras de 32 bits.

Addend: Variable que contiene el valor de 32 a decrementar.

Si el valor resultante de restar uno al valor actual de la variable es cero, la funcin devuelve cero. La funcin devuelve un valor positivo si el resultado es positivo, o un

valor negativo si el resultado es negativo. Esta funcin no indica el error en caso de fallo.

InterlockedExchange, InterlockedIncrement

var

implementation

function var begin for begin end end procedure var begin nil to do

stdcall

nil

nil end procedure begin end

nil

procedure var begin

end procedure var begin

end procedure var begin

end procedure begin end

InterlockedExchange( var Target: Integer; Value: Integer ): Integer;

{variable de 32 bits a asignar} {nuevo valor para la variable} {devuelve el valor anterior}

Esta funcin cambiar el valor de la variable de 32 bits apuntada por el parmetro Target por el valor de 32 bits especificado en el parmetro Value. Esta funcin opera

entre fronteras de proceso siempre que la variable a asignar est situada en memoria compartida. Si la variable apuntada por el parmetro Target no est alineada en una frontera de 32 bits, la funcin fallar en una mquina con mltiples procesadores. Delphi alinea automticamente las variables en fronteras de 32 bits.

Target: Variable que contiene el valor de 32 bits que ser sustituido por el valor del parmetro Value. Value: Valor de 32 bits que especifica el nuevo valor.

La funcin devuelve el valor anterior de la variable identificada por el parmetro Target. Esta funcin no indicar ningn error en caso de fallo.

InterlockedDecrement, InterlockedIncrement

Consulte el Listado 6-13, correspondiente a InterlockedDecrement.

InterlockedIncrement( var Addend: Integer ): Integer;

{puntero a variable de 32 bits a incrementar} {devuelve cdigo que indica el signo del resultado}

Esta funcin aumenta en uno el valor de la variable de 32 bits especificada. Al hacerlo, garantizar que no sea posible acceder simultneamente desde ms de un hilo a la misma variable mediante funciones de interbloqueo. La funcin, por lo tanto, ofrece un mecanismo seguro para modificar el valor de una variable entera. Si la variable apuntada por el parmetro Addend no est alineada en una frontera de 32 bits, la funcin fallar en una mquina con mltiples procesadores. Delphi alinea automticamente las variables en fronteras de 32 bits.

Addend: Variable que contiene el valor de 32 a incrementar.

Si el valor resultante de sumar uno al valor actual de la variable es cero, la funcin devuelve cero. La funcin devuelve un valor positivo si el resultado es positivo, o un

valor negativo si el resultado es negativo. Esta funcin no indica el error en caso de fallo.

InterlockedDecrement, InterlockedExchange

Consulte el Listado 6-13, correspondiente a InterlockedDecrement.

LeaveCriticalSection( var lpCriticalSection: TRTLCriticalSection {Puntero a seccin crtica} ); {no devuelve nada}

Esta funcin libera el objeto de seccin crtica para que el prximo hilo que necesite tener acceso al cdigo protegido lo obtenga. Si el mismo hilo ha llamado a EnterCriticalSection ms de una vez, deber llamar a LeaveCriticalSection el mismo nmero de veces. Si un hilo llama a LeaveCriticalSection sin haber llamado previamente a EnterCriticalSection, podra bloquear el hilo actual de la seccin en cuestin.

lpCriticalSection: Variable de tipo TRTLCriticalSection que contiene la seccin crtica a liberar. El registro TRTLCriticalSection debe ser tratado por la aplicacin como un objeto totalmente encapsulado, y los campos del registro nunca debern ser manipulados directamente.

CreateMutex, DeleteCriticalSection, EnterCriticalSection, InitializeCriticalSection

Consulte el Listado 6-12, correspondiente a InitializeCriticalSection.

OpenEvent( dwDesiredAccess: DWORD; bInheritHandle: BOOL; lpName: PChar ): THandle;

{opciones de acceso deseadas} {bandera de herencia} {puntero al nombre del objeto de evento} {devuelve manejador del objeto de evento}

Esta funcin permite que mltiples procesos abran un manejador a un objeto de evento que ya ha sido creado. Utilice la funcin DuplicateHandle para crear un duplicado del manejador, y la funcin CloseHandle para cerrarlo. Cuando todos los manejadores a un objeto de evento son cerrados, el objeto de evento es destruido y toda la memoria asociada al objeto liberada. Cuando un proceso termina, los manejadores de objetos de evento creados por el proceso son cerrados automticamente.

dwDesiredAccess: Especifica el tipo de acceso solicitado sobre el objeto de evento. Si el sistema soporta la seguridad de objetos y el descriptor de seguridad no soporta el tipo de acceso solicitado, la funcin fallar. Este parmetro puede contener uno o ms de los valores de la Tabla 6-8. bInheritHandle: Habilita o no la herencia de manejadores. Si este parmetro tiene valor TRUE, un proceso creado con CreateProcess podr heredar el manejador. Si el parmetro vale FALSE, el manejador no podr ser heredado. lpName: Una cadena de caracteres terminada en cero que contiene el nombre del objeto de evento a ser abierto. La comparacin es sensible a la distincin entre maysculas y minsculas.

Si la funcin tiene xito, devuelve un manejador del objeto de evento que ha sido abierto. Si la funcin falla, devuelve cero.

CloseHandle, CreateEvent, CreateProcess, DuplicateHandle, PulseEvent, ResetEvent, SetEvent, WaitForSingleObject

6
procedure begin

end procedure begin end

OpenMutex( dwDesiredAccess: DWORD; bInheritHandle: BOOL; lpName: PChar ): THandle;

{opciones de acceso deseadas} {bandera de herencia} {puntero a nombre del objeto de exclusin mutua} {devuelve manejador del objeto}

Esta funcin abre un mutex creado previamente, permitiendo que se sea utilizado a travs de fronteras de procesos. Utilice la funcin DuplicateHandle para crear un duplicado del manejador, y la funcin CloseHandle para cerrarlo. El manejador es cerrado automticamente cuando el proceso que hace la llamada finaliza. El mutex es destruido cuando su ltimo manejador es cerrado.

dwDesiredAccess: Especifica el tipo de acceso deseado para el objeto de exclusin mutua. Esta funcin fallar si el descriptor de seguridad no permite el tipo de acceso solicitado por el proceso que hace la llamada. Este parmetro puede contener uno o ms valores de la Tabla 6-9. bInheritHandle: Habilita o no la herencia de manejadores. Si este parmetro tiene valor TRUE, un proceso creado con CreateProcess podr heredar el manejador. Si el parmetro vale FALSE, el manejador no podr ser heredado.

lpName: Una cadena de caracteres terminada en cero que contiene el nombre del objeto de exclusin mutua a ser abierto. La comparacin es sensible a la distincin entre maysculas y minsculas.

Si la funcin tiene xito, devuelve un manejador del objeto de exclusin mutua abierto. Si la funcin falla, devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CloseHandle, CreateMutex, CreateProcess, DuplicateHandle, ReleaseMutex, WaitForSingleObject

Consulte el Listado 6-2, correspondiente a CreateMutex.

OpenProcess( dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD ): THandle;

{opciones de acceso deseadas} {bandera de herencia de manejador} {identificador de proceso} {devuelve manejador del proceso abierto}

OpenProcess devuelve el manejador de un objeto de proceso existente. Este manejador podr ser utilizado por cualquier funcin que necesite un manejador a un proceso con los derechos de acceso apropiados.

dwDesiredAccess: Indica el nivel de privilegios de acceso deseado. Para un sistema que soporte especificaciones de seguridad, el valor de este parmetro se comprueba contra

el descriptor de seguridad del proceso. Este parmetro puede contener uno o ms valores de la Tabla 6-10. bInheritHandle: Especifica si el manejador devuelto podr ser heredado por un proceso creado por el proceso actual. Si este parmetro es TRUE, el manejador podr ser heredado. dwProcessId: Especifica el identificador del proceso a abrir.

Si la funcin tiene xito, devuelve el manejador del proceso especificado; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CreateProcess, DuplicateHandle, GetCurrentProcess, GetCurrentProcessId, GetExitCodeProcess, GetPriorityClass, SetPriorityClass, TerminateProcess

procedure const var

begin

end procedure var string

begin with begin do

end

nil nil nil nil end

nil

OpenSemaphore( dwDesiredAccess: DWORD; bInheritHandle: BOOL; lpName: PChar ): THandle;

{opciones de acceso deseadas} {bandera de herencia} {nombre del objeto de semforo} {devuelve manejador de semforo abierto}

Esta funcin permite abrir mltiples manejadores del mismo objeto de semforo desde procesos diferentes. El proceso que llama a OpenSemaphore puede utilizar el manejador devuelto en cualquier llamada posterior a una funcin que necesite un manejador de objeto de semforo. El manejador puede ser duplicado utilizando la funcin DuplicateHandle, y debe ser cerrado mediante una llamada a CloseHandle. Cuando el ltimo manejador del semforo es cerrado, el objeto de semforo es destruido. El manejador ser cerrado automticamente cuando finalice el proceso que lo cre.

dwDesiredAccess: Indica el tipo de acceso al objeto de semforo deseado. Si el sistema soporta seguridad de objetos, esta funcin fallar si el descriptor de seguridad no garantiza el tipo de acceso solicitado desde el proceso que hace la llamada. Este parmetro puede contener uno o ms de los valores listados en la Tabla 6-11. bInheritHandle: Habilita o no la herencia de manejadores. Si este parmetro tiene valor TRUE, un proceso creado por el proceso actual podr heredar el manejador. Si el parmetro vale FALSE, el manejador no podr ser heredado. lpName: Una cadena de caracteres terminada en cero que contiene el nombre del objeto de semforo a ser abierto. La comparacin es sensible a la distincin entre maysculas y minsculas.

Si la funcin tiene xito, devuelve un manejador del objeto de semforo existente. Si la funcin falla devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CloseHandle, CreateSemaphore, DuplicateHandle, ReleaseSemaphore, WaitForSingleObject

Consulte el Listado 6-4, correspondiente a CreateSemaphore.

PulseEvent( hEvent: THandle ): BOOL;

{manejador del objeto de evento} {devuelve TRUE o FALSE}

La funcin PulseEvent pone al objeto de evento especificado en el estado sealizado, y luego lo devuelve al estado no sealizado despus de liberar la cantidad apropiada de hilos en espera. Para los objetos con inicializacin manual, todos los hilos que pueden ser liberados sern liberados inmediatamente. El objeto de evento es entonces devuelto al estado no sealizado y la funcin retorna. Para los objetos con inicializacin automtica, la funcin pondr el evento en estado no sealizado y liberar nicamente UNO de los hilos en espera, incluso si hubiese mltiples hilos en espera. Si no existen hilos en espera del evento que pudieran ser liberados, la funcin pondr el objeto en estado no sealizado y retornar.

hEvent: Especifica el manejador del objeto de evento. Bajo Windows NT, el manejador debe tener el derecho de acceso EVENT_MODIFY_STATE.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CreateEvent, OpenEvent, ResetEvent, SetEvent, WaitForSingleObject

Consulte el Listado 6-1, correspondiente a CreateEvent.

ReleaseMutex( hMutex: THandle ): BOOL;

{manejador del objeto de exclusin mutua} {devuelve TRUE o FALSE}

La funcin ReleaseMutex libera el objeto de exclusin mutua especificado. El hilo que hace la llamada debe ser el propietario del objeto de exclusin mutua; en caso contrario, la llamada fallar. Un hilo obtiene la propiedad de un objeto de exclusin mutua al utilizarlo en una llamada a alguna de las funciones de espera o llamando a la funcin CreateMutex. ReleaseMutex liberar el mutex para que otros hilos lo utilicen. Un hilo puede especificar un mutex en ms de una funcin de espera si el hilo posee al mutex en cuestin, sin bloquear su ejecucin. Esto evita abrazos mortales en un hilo que ya posea un mutex. El hilo deber llamar a ReleaseMutex para cada funcin de espera en la que el objeto de exclusin mutua est involucrado.

hMutex: Especifica el manejador del objeto de exclusin mutua a ser liberado.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CreateMutex, WaitForSingleObject

Consulte el Listado 6-2, correspondiente a CreateMutex.

ReleaseSemaphore( hSemaphore: THandle; lReleaseCount: LongInt; lpPreviousCount: Pointer ): BOOL;

{manejador del semforo} {cantidad a aadir al contador actual} {puntero a contador anterior} {devuelve TRUE o FALSE}

Esta funcin incrementa el contador de un objeto de semforo en la cantidad especificada. El estado de un semforo es sealizado cuando su contador es mayor que cero, y no sealizado cuando el contador es cero. El contador de un semforo es disminuido en uno cuando un hilo en espera del semforo es liberado debido al estado sealizado del semforo.

hSemaphore: Especifica el manejador del objeto de semforo. Este manejador es devuelto por las funciones CreateSemaphore u OpenSemaphore. Bajo Windows NT, el manejador deber tener el derecho de acceso SEMAPHORE_MODIFY_STATE. lReleaseCount: Especifica la cantidad en que el contador del objeto de semforo ser incrementado. Este valor debe ser mayor que cero. La funcin devolver FALSE si el valor especificado supera el valor mximo de contador del semforo despus del incremento. lpPreviousCount: Puntero a valor de 32 bits que recibe el contador anterior del semforo. Este parmetro puede ser nil si no se necesita obtener el valor anterior del contador.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CreateSemaphore, OpenSemaphore, WaitForSingleObject

Consulte el Listado 6-3, correspondiente a CreateSemaphore.

ResetEvent( hEvent: THandle ): BOOL;

{manejador del objeto de evento} {devuelve TRUE o FALSE}

Esta funcin se utiliza para poner un objeto de evento en estado no sealizado. El estado no sealizado bloquea la ejecucin de los hilos que hayan especificado el objeto en una llamada a una funcin de espera. El objeto de evento se mantendr en estado no sealizado hasta que sea sealizado por las funciones SetEvent o PulseEvent. Esta funcin se utiliza para objetos de evento con inicializacin manual.

hEvent: Especifica el manejador del objeto de evento. Bajo Windows NT, el manejador deber tener el derecho de acceso EVENT_MODIFY_STATE.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CreateEvent, OpenEvent, PulseEvent, SetEvent

Consulte el Listado 6-1, correspondiente a CreateEvent.

ResumeThread( hThread: THandle ): DWORD;

{manejador del hilo a iniciar} {devuelve valor anterior de contador}

Esta funcin disminuir en uno el contador de suspensiones del hilo. Cuando el contador sea cero, el hilo continuar su ejecucin. Si el contador tiene un valor mayor o igual que uno despus de la llamada a esta funcin, el hilo seguir en estado suspendido.

hThread: Manejador del hilo cuya ejecucin se desea continuar.

Si la funcin tiene xito, devuelve el valor anterior del contador de suspensiones del hilo; en caso contrario devuelve $FFFFFFFF. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

SuspendThread

Consulte el Listado 6-5, correspondiente a DuplicateHandle.

SetEvent( hEvent: THandle ): BOOL;

{manejador del objeto de evento a sealizar} {devuelve TRUE o FALSE}

Esta funcin pondr el objeto de evento especificado en estado sealizado. Todos los hilos que estn esperando, y los hilos que lancen operaciones de espera en lo sucesivo, sern liberados para que continen su ejecucin.

hEvent: Especifica el manejador del objeto de evento a sealizar. Las funciones CreateEvent u OpenEvent devuelven este tipo de manejador. Bajo Windows NT, el manejador debe tener el derecho de acceso EVENT_MODIFY_STATE.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CreateEvent, OpenEvent, PulseEvent, ResetEvent, WaitForSingleObject

Consulte el Listado 6-1, correspondiente a CreateEvent.

SetPriorityClass( hProcess: THandle; dwPriorityClass: DWORD ): BOOL;

{manejador del proceso} {clase de prioridad} {devuelve TRUE o FALSE}

La funcin SetPriorityClass se utiliza para establecer la clase de prioridad de un proceso, y al mismo tiempo la prioridad de los hilos del proceso. La clase de prioridad de un proceso se utiliza para determinar la prioridad bsica de sus hilos. Los hilos sern planificados de acuerdo a un algorimo round robin basado en sus niveles de prioridad. Los hilos con un nivel de prioridad dado obtendrn cuantos de tiempo de procesador nicamente cuando no estn esperando hilos con una prioridad superior.

hProcess: Especifica el manejador del proceso. Bajo Windows NT, el manejador debe tener el derecho de acceso PROCESS_SET_INFORMATION. dwPriorityClass: Especifica la clase de prioridad a asignar al proceso. Este parmetro puede tomar alguno de los valores de la Tabla 6-12.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CreateProcess, CreateThread, GetPriorityClass, GetThreadPriority, SetThreadPriority

Consulte el Listado 6-9, correspondiente a GetPriorityClass.

SetThreadPriority( hThread: THandle; nPriority: Integer ): BOOL;

{manejador del hilo} {nivel de prioridad} {devuelve TRUE o FALSE}

Esta funcin establece el nivel de prioridad de un hilo. Este valor, conjuntamente con la prioridad del proceso, determina el nivel de prioridad bsico del hilo.

hThread: Especifica el manejador del hilo. Bajo Windows NT, el manejador deber tener el derecho de acceso THREAD_SET_INFORMATION. nPriority: Especifica el nivel de prioridad del hilo. Este parmetro puede tomar uno de los valores de la Tabla 6-13.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetPriorityClass, GetThreadPriority, SetPriorityClass

Consulte el Listado 6-10, correspondiente a GetThreadPriority.

Sleep( dwMilliseconds: DWORD );

{especifica la cantidad de milisegundos de pausa} {no devuelve nada}

Esta funcin pausar la ejecucin del hilo durante el nmero de milisegundos especificado.

dwMilliseconds: El tiempo en milisegundos que el hilo ser suspendido. Si este parmetro tiene valor cero, el hilo entregar el resto de su tiempo a otro hilo de la

misma prioridad. Si no existen hilos de la misma prioridad, la funcin retornar inmediatamente y el hilo continuar su ejecucin.

SuspendThread

Consulte el Listado 6-2, correspondiente a CreateMutex.

SuspendThread( hThread: THandle ): DWORD;

{manejador del hilo} {devuelve el valor anterior del contador}

Esta funcin suspende un hilo e incrementa su contador de suspensiones. Cuando el valor de este contador es cero, el hilo es elegible para su ejecucin. Si el valor del contador es mayor que cero, el hilo estar suspendido. El contador de suspensiones de un hilo no puede superar 127.

hThread: Especifica el manejador del hilo en cuestin.

Si la funcin tiene xito, devuelve el valor anterior del contador de suspensiones. Si la funcin falla, devuelve $FFFFFFFF.

ResumeThread

Consulte el Listado 6-5, correspondiente a DuplicateHandle.

6
TerminateProcess( hProcess: THandle; uExitCode: UINT ): BOOL; {manejador de proceso} {cdigo de finalizacin} {devuelve TRUE o FALSE}

TerminateProcess finaliza la ejecucin de un proceso y de todos sus hilos. Esta funcin no verificar o descargar DLLs, por lo que llamar a esta funcin puede provocar goteos de memoria.

hProcess: El manejador del proceso a finalizar. Bajo Windows NT, el manejador deber tener el derecho de acceso PROCESS_TERMINATE. uExitCode: Especifica el cdigo de finalizacin del proceso. Este valor puede ser recuperado posteriormente mediante la funcin GetExitCodeProcess.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

ExitProcess, OpenProcess, GetExitCodeProcess, GetExitCodeThread

var

implementation

procedure var begin with begin do

end nil nil end procedure nil nil nil

var begin

end

TerminateThread( hThread: THandle; dwExitCode: DWORD ): BOOL;

{manejador del hilo a terminar} {cdigo de finalizacin del hilo} {devuelve TRUE o FALSE}

Esta funcin finaliza un hilo sin permitir que ningn cdigo de finalizacin se dispare. Si el hilo especificado posee una seccin crtica, sta no ser liberada. El estado KERNEL32 para el proceso dueo del hilo podr ser inconsistente si el hilo est ejecutando alguna llamada a funciones del KERNEL32 al ser finalizado. Si el hilo estaba manipulando una DLL compartida y cambiando su estado global, ste estado global de la DLL podra ser destruido, lo que afectara a otros usuarios de la DLL. Los hilos no pueden ser protegidos contra una llamada a TerminateThread, excepto controlando el acceso a su manejador.

hThread: Especifica el manejador del hilo a finalizar. dwExitCode: Especifica el cdigo de finalizacin del hilo. Para recuperar su valor, utilice la funcin GetExitCodeThread.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CreateProcess, CreateThread, ExitThread, GetExitCodeThread

var

implementation

function var string begin

stdcall

for end

to

do begin

end procedure var begin nil if then nil

end

TlsAlloc: DWORD;

{devuelve un ndice a memoria local del hilo}

Esta funcin reserva una posicin en la memoria local del hilo. Cualquier hilo que pertenezca al proceso desde el que se hace la llamada podr utilizar el ndice creado para almacenar y recuperar valores locales al hilo. Cada hilo del proceso utilizar un ndice de memoria local de hilo para acceder a su propio valor. Utilice las funciones TlsGetValue y TlsSetValue para leer y escribir valores en las posiciones de memoria de hilo. Los ndices no pueden ser vistos a travs de los procesos. El nmero mnimo de ndices disponible en la mayora de los sistemas es 64.

Si la funcin tiene xito, devuelve un ndice a la memoria local de hilo. Si la funcin falla, devuelve $FFFFFFFF. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

TlsFree, TlsGetValue, TlsSetValue

var

implementation

function var begin

stdcall

6
if not then

end procedure var

begin

nil

nil

if not

then

end procedure begin if not else end then

TlsFree( dwTlsIndex: DWORD ): BOOL;

{ndice de memoria local de hilo a liberar} {devuelve TRUE o FALSE}

La funcin TlsFree libera un ndice de la memoria local de hilos. Si el ndice contiene un puntero a memoria reservada dinmicamente, esta memoria deber ser liberada antes de llamar a TlsFree.

dwTlsIndex: Indice a memoria local de hilos, devuelto por una llamada previa a la funcin TlsAlloc.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

TlsAlloc, TlsGetValue, TlsSetValue

Consulte el Listado 6-18, correspondiente a TlsAlloc.

TlsGetValue( dwTlsIndex: DWORD ): Pointer;

{ndice de memoria local de hilo} {devuelve el valor en el ndice especificado para el hilo que hace la llamada}

Esta funcin recupera el valor almacenado en el ndice de memoria local de hilo especificado para el hilo que hace la llamada.

dwTlsIndex: El ndice a la memoria local de hilo, devuelto por una llamada previa a la funcin TlsAlloc.

Si la funcin tiene xito, devuelve un puntero al valor almacenado en el ndice especificado de la memoria local de hilo, y llama a la funcin SetLastError para limpiar el ltimo cdigo de error. Si la funcin falla, devuelve nil.

GetLastError, SetLastError, TlsAlloc, TlsFree, TlsSetValue

Consulte el Listado 6-18, correspondiente a TlsAlloc.

TlsSetValue( dwTlsIndex: DWORD; lpTlsValue: Pointer ): BOOL;

{ndice de memoria de hilo} {valor a almacenar} {devuelve TRUE o FALSE}

Esta funcin almacena un valor en la posicin especificada de la memoria local del hilo que hace la llamada. El valor almacenado es nico para cada hilo, incluso cuando el ndice sea el mismo.

dwTlsIndex: Especifica el ndice de memoria local de hilo en el que se desea almacenar el valor, segn ha sido devuelto por una llamada previa a la funcin TlsAlloc. lpTlsValue: Puntero al valor a ser almacenado en el ndice especificado de la memoria local de hilo para el hilo que hace la llamada.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

TlsAlloc, TlsFree, TlsGetValue

Consulte el Listado 6-18, correspondiente a TlsAlloc.

WaitForInputIdle( hProcess: THandle; dwMilliseconds: DWORD ): DWORD;

{manejador del proceso} {tiempo lmite de espera en milisegundos} {devuelve un cdigo de espera}

Esta funcin espera hasta que el proceso especificado no tenga ms entrada pendiente de procesar y est esperando por la entrada del usuario, o hasta que transcurra el intervalo especificado en el parmetro dwMilliseconds. WaitForInputIdle puede utilizarse para suspender la ejecucin de un hilo que ha creado un proceso hasta que el proceso haya finalizado toda su inicializacin y est listo para recibir entrada. Esta funcin puede ser utilizada en cualquier momento.

hProcess: Especifica el manejador del proceso por el que se esperar hasta que est listo para recibir entrada. dwMilliseconds: Especifica el tiempo lmite de espera en milisegundos. Si el valor de este parmetro es INFINITE, entonces la funcin no retornar hasta que el proceso especificado est ocioso.

Si la funcin tiene xito, devuelve un valor de la Tabla 6-14. Si la funcin falla, devuelve $FFFFFFFF. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CreateProcess

procedure var begin with begin do

end nil nil nil nil nil

end

WaitForSingleObject( hHandle: THandle; dwMilliseconds: DWORD ): DWORD;

{manejador del objeto por el que se espera} {tiempo lmite en milisegundos} {devuelve un cdigo de evento}

Esta funcin verifica el estado actual del objeto especificado. El hilo actual entrar en un estado de espera eficiente si el objeto no est sealizado. Una vez que la condicin de espera sea satisfecha (por ejemplo, que el objeto asociado sea sealizado), el hilo continuar su ejecucin. En algunas circunstancias, una funcin de espera podr recibir un manejador de fichero, de canalizacin, o de dispositivo de comunicaciones como objeto por el que esperar.

hHandle: Especifica el manejador del objeto por el que se va a esperar. El objeto puede ser de cualquiera de los tipos listados en la Tabla 6-15. dwMilliseconds: Especifica el tiempo lmite de espera en milisegundos. La funcin retornar despus del tiempo lmite especificado incluso si el objeto no ha sido sealizado. Si el valor de este parmetro es cero, la funcin verificar el objeto y

retornar inmediatamente. Si el valor de este parmetro es INFINITE, el intervalo nunca finalizar.

Si la funcin tiene xito, devuelve uno de los valores de la Tabla 6-16. Si la funcin falla, devuelve WAIT_FAILED. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CreateEvent, CreateFile, CreateMutex, CreateProcess, CreateSemaphore, CreateThread, FindFirstChangeNotification, OpenEvent, OpenMutex, OpenProcess, OpenSemaphore, PulseEvent, ResetEvent, SetEvent, Sleep

Consulte el Listado 6-1, correspondiente a CreateEvent.

Una librera de enlace dinmico (DLL) es un ejecutable compilado que contiene funciones que pueden ser enlazadas a una aplicacin al vuelo en tiempo de ejecucin. El concepto de DLL forma parte del ncleo mismo del diseo arquitectnico de Windows; la mayor parte del sistema operativo Windows es en s misma una coleccin de DLLs. Las libreras dinmicas que contienen la mayora de las funciones del API Win32 son KERNEL32.DLL, USER32.DLL y GDI32.DLL. Utilizar una DLL es un mecanismo ideal para implementar la reusabilidad y comparticin del cdigo, y permite la creacin de ejecutables ms pequeos y una mejor gestin de la memoria. Tenga en cuenta que las DLLs no tienen cola de mensajes asociada, y deben apoyarse en la aplicacin que hace las llamadas para procesar mensajes y eventos. Una DLL comparte igualmente la pila de la aplicacin que hace la llamada.

Antes de poder utilizar una funcin situada en una DLL, sta debe ser exportada. La exportacin se especifica en la seccin exports del cdigo del proyecto de librera de enlace dinmico. Una funcin puede ser exportada en cuatro formatos diferentes:
exports

exports name

exports index

exports index name

Una aplicacin puede importar una funcin situada en una librera dinmica en tiempo de ejecucin o en tiempo de compilacin. Para garantizar el enlace en tiempo de compilacin, la aplicacin puede importar la funcin de la librera de enlace dinmico de tres formas diferentes:
function external

function external name

function external index

Para importar una funcin en tiempo de ejecucin, la aplicacin debe utilizar las funciones LoadLibrary o LoadLibraryEx conjuntamente con la funcin GetProcAddress. Estas funciones permiten que una librera dinmica pueda ser cargada y descargada a voluntad, permitiendo a la aplicacin gestionar la memoria de un modo ms eficiente.

La naturaleza de Windows y la arquitectura de las libreras de enlace dinmico permiten que una aplicacin escrita en un lenguaje puede llamar a una DLL escrita en otro lenguaje. Sin embargo, el programador deber tener claros los mecanismos que utilizan los diferentes lenguajes de programacin para pasar los parmetros en la pila en el momento de la llamada. Estos mecanismos varan de un lenguaje de programacin a otro, y entran a jugar su papel, por ejemplo, cuando queremos llamar a una funcin situada en una DLL escrita en un lenguaje que no sea Delphi. Existen cuatro convenios diferentes de traspaso de parmetros: pascal, cdecl, register y stdcall. Al exportar o importar funciones, los convenios de llamada debern coincidir en el cdigo exportado y el importado.

Las libreras de enlace dinmico ofrecen la posibilidad de definir una funcin de punto de entrada, que ser llamada cada vez que la DLL sea asociada a un proceso o hilo. Cuando una DLL es enlazada, ya sea dinmica o explcitamente, la funcin de punto de entrada recibe una notificacin DLL_PROCESS_ ATTACH. Cuando la DLL es descargada de memoria, la funcin de punto de entrada recibe una notificacin DLL_PROCESS_DETACH. Si el proceso que ha cargado la DLL crea un hilo, la DLL ser asociada automticamente a la DLL, y la funcin de punto de entrada recibir una notificacin DLL_THREAD_ATTACH. De la misma forma, cuando el hilo termine se enviar a la DLL una notificacin DLL_THREAD_DETACH.

En este captulo se describen las siguientes funciones relacionadas con las libreras de enlace dinmico:

DLLEntrypoint( hinstDLL HINSTANCE; dwReason: DWORD; lpvReserved: LPVOID; ): BOOL;

{manejador del mdulo de DLL} {mensaje de notificacin a la DLL} {indicador de inicializacin} {devuelve TRUE o FALSE}

Esta funcin es una funcin de respuesta definida dentro de una librera de enlace dinmico con el propsito especfico de que reciba los mensajes de notificacin que se enven a la DLL. Dichos mensajes se reciben cada vez que una aplicacin o hilo cargue la DLL en memoria. Esta funcin permite que la DLL inicialice estructuras de datos o memoria dinmica dependiendo del tipo de asociacin que se haya producido, y que realice las tareas de limpieza necesarias cuando se rompa el enlace entre la DLL y cualquier aplicacin o hilo.

hinstDLL: Especifica el manejador de mdulo de la DLL. dwReason: Especifica el tipo de notificacin. Este parmetro contendr un valor de los que se muestran en la Tabla 7-3. lpvReserved: Especifica ms informacin relativa a la inicializacin y limpieza. Si el parmetro dwReason contiene el valor DLL_PROCESS_ATTACH, lpvReserved contendr nil en caso de un enlace en tiempo de ejecucin y un valor diferente de nil en caso de carga esttica. Si dwReason contiene DLL_PROCESS_DETACH, el valor de lpvReserved ser nil si la funcin DLLEntrypoint ha sido llamada debido a la funcin FreeLibrary, y diferente de nil si la funcin DLLEntrypoint ha sido llamada a causa de la terminacin de un proceso.

La funcin de respuesta debe devolver TRUE para indicar que la inicializacin ha tenido xito, o FALSE para indicar un fallo de inicializacin. El valor devuelto es ignorado por el sistema, con excepcin del caso en que el mensaje de notificacin sea DLL_PROCESS_ATTACH.

Consulte el Listado 7-1, correspondiente a FreeLibraryAndExitThread, y el Listado 7-3, correspondiente a LoadLibrary.

DisableThreadLibraryCalls( hLibModule: HMODULE ): BOOL;

{manejador del mdulo} {devuelve TRUE o FALSE}

Esta funcin deshabilita el envo de las notificaciones DLL_THREAD_ATTACH y DLL_THREAD_DETACH DLL para la DLL identificada por el parmetro hLibModule. Esto puede ser til en el caso de aplicaciones de mltiples hilos en las que los hilos se crean y destruyen frecuentemente, y las DLLs a las que ellos llaman no necesitan hacer uso de las notificaciones. Al deshabilitar las notificaciones de hilos, el cdigo de inicializacin de la DLL no es paginado cuando un hilo es creado o destruido, lo que reduce el tamao del cdigo de trabajo. Esta funcin debe ser implementada en el cdigo que atiende las notificaciones DLL_PROCESS_ATTACH.

hLib Module: Especifica el manejador de la librera de enlace dinmico.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

FreeLibraryAndExitThread

Consulte el Listado 7-1, correspondiente a FreeLibraryAndExitThread.

FreeLibrary( hLibModule: HMODULE {manejador del mdulo a liberar} ): BOOL; {devuelve TRUE o FALSE}

La funcin FreeLibrary decrementa en uno el contador de referencias de una librera de enlace dinmico cargada. Si el contador de referencias alcanza el valor cero, el mdulo se desliga del espacio de direcciones del proceso que hace la llamada y su manejador deja de ser vlido. Antes de descargar el mdulo de librera, el sistema permite a la DLL realizar las labores de limpieza necesarias mediante una notificacin DLL_PROCESS_DETACH al punto de entrada de la DLL. Al retornar la llamada a la funcin de punto de entrada, el mdulo de librera es eliminado del espacio de direcciones del proceso actual. Una llamada a FreeLibrary no afecta a otros procesos que utilicen la misma DLL.

hLibModule: Manejador de la librera de enlace dinmico cuyo contador de referencias se va a decrementar.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

FreeLibrary, GetModuleHandle, LoadLibrary

Consulte el Listado 7-4, correspondiente a LoadLibrary.

FreeLibraryAndExitThread( hLibModule: HMODULE; {manejador del mdulo a liberar} dwExitCode: DWORD {cdigo de finalizacin del hilo que hace la llamada} ); {no devuelve nada}

Esta funcin libera la librera de enlace dinmico identificada por el parmetro hLibModule, y finaliza el hilo que hace la llamada. Internamente, esta funcin llama a

la funcin FreeLibrary para descargar la DLL, pasndole el valor del parmetro hLibModule, y luego llama a la funcin ExitThread, pasndole el valor contenido en el parmetro dwExitCode.

hLib Module: Especifica el mdulo de librera de enlace dinmico cuyo contador de referencias va a ser decrementado. dwExitCode: Especifica el cdigo de finalizacin a pasar al hilo que hace la llamada.

FreeLibrary, ExitThread, DisableThreadLibraryCalls

library uses in exports name

procedure begin case of begin

end

end end begin

end

*** Unit 2 ***


function export var implementation

function begin

end

function var

stdcall

function

implementation

7
stdcall

function begin

if

nil

then

end procedure var

begin

nil if else begin then

nil

end end

GetModuleFileName( hModule: HINST; lpFilename: PChar; nSize: DWORD ): DWORD;

{manejador del mdulo} {puntero a buffer terminado en carcter nulo} {tamao del buffer lpFilename} {devuelve cantidad de caracteres copiados al buffer}

Esta funcin devuelve la ruta completa y el nombre de fichero del mdulo identificado por el manejador especificado en el parmetro hModule.

hModule: Manejador del mdulo cuya ruta y nombre de fichero se desean recuperar. Si este parmetro es cero, la funcin devuelve la ruta y el nombre de fichero del proceso que hace la llamada. lpFilename: Puntero a buffer de caracteres que recibir la ruta y el nombre de fichero. nSize: Especifica el tamao del buffer al que apunta el parmetro lpFilename, en caracteres. Si la longitud real de la cadena a devolver es superior a este valor, la cadena ser truncada.

Si la funcin tiene xito, devuelve el nmero de caracteres copiados al buffer al que apunta lpFilename; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetModuleHandle, LoadLibrary

Consulte el Listado 7-4, correspondiente a LoadLibrary.

GetModuleHandle( lpModuleName: PChar ): HMODULE;

{nombre del mdulo} {devuelve manejador del mdulo}

Esta funcin devuelve un manejador del mdulo especificado por el parmetro lpModuleName en caso de que el mdulo haya sido mapeado en el espacio de direcciones del proceso que hace la llamada. El manejador que devuelve esta funcin no podr ser duplicado, copiado o heredado por un proceso hijo. GetModuleHandle no mapea un mdulo en memoria, ni incrementa el contador de referencias de un mdulo mapeado. Por lo tanto, utilizar el manejador devuelto por esta funcin en una llamada a FreeLibrary puede provocar que un mdulo sea eliminado de forma prematura del espacio de direcciones de un proceso.

lpModuleName: Puntero a cadena de caracteres terminada en nulo que contiene el nombre del mdulo cargado cuyo manejador se desea obtener. Este mdulo puede identificar a una librera de enlace dinmico o a un ejecutable. Si se omite la extensin de fichero, se asume por defecto .DLL. La comparacin de nombres no hace distincin entre maysculas y minsculas. Si este parmetro es nil, la funcin devuelve un manejador del proceso que hace la llamada.

Si la funcin tiene xito, devuelve un manejador del mdulo especificado; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

FreeLibrary, GetModuleFileName, GetProcAddress, LoadLibrary

Consulte el Listado 7-4, correspondiente a LoadLibrary.

GetProcAddress( hModule: HMODULE; ProcName: LPCSTR ): FARPROC;

{manejador de mdulo} {cadena que identifica el nombre de la funcin} {devuelve la direccin de la funcin}

La funcin GetProcAddress devuelve la direccin de la funcin exportada cuyo nombre se especifica dentro de la librera de enlace dinmico identificada por hModule. La funcin cuya direccin se nos entrega puede ser utilizada a partir de ese momento como cualquier otra funcin de la aplicacin.

hModule: Manejador de la librera de enlace dinmico. Este manejador puede ser recuperado mediante las funciones LoadLibrary o GetModuleHandle. ProcName: Puntero a cadena de caracteres terminada en nulo que especifica el nombre de la funcin cuya direccin se desea obtener, o el valor ordinal de la funcin. Si el parmetro especifica un valor ordinal, ste deber estar situado en la palabra baja (menos significativa) de ProcName, y la palabra alta deber contener cero. La escritura del nombre de la funcin deber coincidir exactamente (teniendo en cuenta la distincin entre maysculas y minsculas) con el nombre especificado en la clusula exports de la DLL.

Si la funcin tiene xito, devuelve la direccin de la funcin exportada dentro de la librera de enlace dinmico. Si la funcin falla, devuelve nil.

FreeLibrary, GetModuleHandle, LoadLibrary

Consulte el Listado 7-4, correspondiente a LoadLibrary.

LoadLibrary( lpLibFileName: PChar ): HMODULE;

{cadena que contiene el nombre del mdulo} {devuelve manejador del mdulo cargado}

Esta funcin mapea el mdulo identificado por el parmetro lpLibFileName en el espacio de direcciones del proceso que hace la llamada. En el caso del mapeo de un ejecutable, esta funcin devuelve un manejador que puede ser usado con las funciones FindResource o LoadResource. Los manejadores de mdulos no son globales ni heredables, y no pueden ser utilizados por otro proceso. Si el manejador especifica una DLL que no est ya mapeada en el espacio de direcciones del proceso que hace la llamada, el sistema llama a la funcin de punto de entrada de la DLL, pasndole la notificacin DLL_PROCESS_ATTACH.

lpLibFileName: Puntero a cadena de caracteres terminada en nulo que contiene el nombre del mdulo a cargar. Este mdulo puede identificar a una librera de enlace dinmico o a un ejecutable. Si se omite la extensin de fichero, se asume por defecto

.DLL. Si un mdulo del mismo nombre desde el mismo directorio ha sido ya mapeado en el espacio de direcciones del proceso que hace la llamada (las comparaciones de nombres ignoran la diferencia entre maysculas y minsculas), el contador de referencias de ese mdulo se incrementa en uno, y la funcin devuelve el manejador del mdulo previamente cargado. Si la cadena especifica una ruta pero el fichero no existe, la funcin falla. Si no se especifica una ruta, la funcin busca el fichero en la siguiente secuencia: 1. El directorio desde el que la aplicacin que hace la llamada fue cargada. 2. El directorio actual. 3. El directorio de sistema de Windows. 4. El directorio de Windows. 5. Los directorios incluidos en la variable de entorno PATH.

Si la funcin tiene xito, devuelve el manejador del mdulo cargado. Si falla, devuelve nil. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

FindResource, FreeLibrary, GetProcAddress, GetSystemDirectory, GetWindowsDirectory, LoadResource, LoadLibraryEx

library uses in exports name procedure begin case of

end end begin

end

*** Unit 2 ***


function var implementation export

function begin

end

procedure var array function begin if then of

if begin

nil

then

end else

end

LoadLibraryEx( lpLibFileName: PChar; hFile: THandle; dwFlags: DWORD ): HMODULE;

{cadena que contiene el nombre del mdulo} {reservado para uso futuro} {opciones de comportamiento} {devuelve manejador del mdulo cargado}

La funcin LoadLibraryEx es equivalente a LoadLibrary, en el sentido de que mapea el mdulo identificado por el parmetro lpLibFileName en el espacio de direcciones del proceso que hace la llamada. Sin embargo, LoadLibraryEx puede mapear la DLL sin llamar a la funcin de punto de entrada, puede utilizar dos estrategias de bsqueda diferentes a la hora de localizar el mdulo especificado, y puede cargar el mdulo en un modo optimizado para el caso en el que el mdulo nunca ser ejecutado, cargando el mdulo cual si se tratara de un fichero de datos. Estas opciones de comportamiento extendidas se indican mediante el parmetro dwFlags; los posibles valores de ste se listan en la Tabla 7-4. Los manejadores de mdulos no son globales ni heredables, y no podrn ser utilizados por otros procesos.

lpLibFileName: Puntero a cadena de caracteres terminada en nulo que contiene el nombre del mdulo a cargar. Este mdulo puede identificar a una librera de enlace dinmico o a un ejecutable. Si se omite la extensin del fichero, se asume por defecto .DLL. Si un mdulo del mismo nombre desde el mismo directorio ha sido ya mapeado en el espacio de direcciones del proceso que hace la llamada (las comparaciones de nombres ignoran la diferencia entre maysculas y minsculas), el contador de referencias de ese mdulo se incrementa en uno, y la funcin devuelve un manejador del mdulo previamente cargado. Si la cadena especifica una ruta pero el fichero no existe, la funcin falla. Si no se especifica una ruta, la funcin busca el fichero en la siguiente secuencia: 1. El directorio desde el que la aplicacin que hace la llamada fue cargada (consulte la Tabla 7-4 con relacin a otro comportamiento opcional). 2. El directorio actual. 3. El directorio de sistema de Windows. 4. El directorio de Windows. 5. Los directorios incluidos en la variable de entorno PATH. hFile: Reservado para uso futuro. Asigne cero (0) a este parmetro. dwFlags: Especifica el comportamiento opcional al cargar el mdulo. Este parmetro puede contener uno de los valores de la Tabla 7-4.

Si la funcin tiene xito, devuelve un manejador del mdulo cargado. Si la funcin falla, devuelve nil. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

FindResource, FreeLibrary, GetProcAddress, GetSystemDirectory, GetWindowsDirectory, LoadResource, LoadLibraryEx

7
library

uses

begin end

procedure var begin if then

If

then

end

Cuando una aplicacin necesita almacenar informacin que debe ser persistente a lo largo de diferentes ejecuciones (instancias), puede utilizar las funciones de manipulacin de ficheros para guardar la informacin en un formato propietario, o puede almacenarla en el registro de Windows o en un fichero de inicializacin (.INI). Almacenar la informacin en el registro o en un fichero de inicializacin facilitar al usuario la labor de modificar esa informacin a voluntad, lo que puede incluir por ejemplo la habilitacin o inhabilitacin de ciertas funciones del programa. Las funciones de manipulacin del registro y de los ficheros de inicializacin ofrecen al programador una va rpida y sencilla de grabar informacin de forma persistente sin tener que preocuparse por escribir cdigo de entrada y salida a bajo nivel o disear un formato de ficheros.

Aunque Microsoft sugiere que las aplicaciones desarrolladas para Win dows 95/98 Windows NT guarden la informacin persistente en el registro, los ficheros de inicializacin son todava utilizados ampliamente. Los ficheros de inicializacin son ms fciles de usar, y pueden tener efectos colaterales mucho menos drsticos sobre el sistema si se corrompen o daan, a diferencia del registro. Un fichero de inicializacin puede almacenar informacin de varios tipos. Las funciones WritePrivateProfileSection y WritePrivateProfileString permiten a la aplicacin guardar informacin de tipo textual en un fichero de inicializacin definido por el usuario. Las funciones WriteProfileSection y WriteProfileString realizan la misma tarea, pero guardan informacin nicamente en el fichero Win.INI. Aunque la informacin se almacena nicamente en forma de cadenas de caracteres, si el valor almacenado corresponde a un valor numrico, puede ser recuperado directamente como un entero utilizando las funciones GetPrivateProfileInt o GetProfileInt. Adicionalmente, la funcin WritePrivateProfileStruct permite que la aplicacin grabe un bloque estructurado de informacin en una clave de un fichero de inicializacin,

como por ejemplo el contenido de un registro. Los valores de esa estructura de datos podrn ser recuperados posteriormente mediante una llamada a la funcin GetPrivateProfileStruct. La informacin es almacenada en formato hexadecimal. No existe una funcin equivalente para el fichero Win.INI. Windows 95/98 mantiene una copia del fichero Win.INI en memoria. Cuando una aplicacin graba informacin al fichero Win.INI, est escribiendo sobre este fichero mapeado en memoria, y los nuevos valores no sern guardados inmediatamente al disco. Para obligar a Windows a vaciar el contenido de Win.INI al disco se debe llamar a la funcin WriteProfileString, pasndole nil en sus tres parmetros. Bajo Windows NT, cuando una aplicacin intenta leer o escribir en nombres de claves de Win.INI, el sistema redirige la accin al registro, leyendo o escribiendo las claves al registro en lugar de Win.INI. Este proceso se produce de forma automtica y totalmente transparente para la aplicacin. Para recuperar las opciones de redireccionamiento para Windows NT, busque bajo la clave HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ CurrentVersion \ IniFileMapping.

Algunas de las funciones de manipulacin del registro permiten a la aplicacin guardar una clave del registro y sus subclaves en un fichero de claves de registro (hive file). Bajo el sistema de ficheros FAT, estos ficheros no pueden tener extensin. Tales ficheros simplemente contienen la informacin del registro en un formato que puede ser luego cargado al registro de cualquier sistema. La informacin que se almacena en estos ficheros de claves podr ser cargada nicamente bajo ciertas claves del registro; consulte las descripciones de las funciones individuales para ms informacin. Todo el cdigo de ejemplo de las funciones de manipulacin del registro en este captulo estn tomadas del proyecto RegSampApp, que se puede descargar desde el apartado referente a este libro en http://editorial.danysoft.com.

Este captulo describe las siguientes funciones de manipulacin del registro y de ficheros de inicializacin:

GetPrivateProfileInt( lpAppName: PChar; lpKeyName: PChar; nDefault: Integer; lpFileName: PChar ): UINT;

{puntero a nombre de seccin} {puntero a nombre de clave} {valor por defecto} {puntero a nombre de fichero de inicializacin} {devuelve el valor entero}

Esta funcin recupera el valor entero de la clave especificada bajo la seccin indicada en el fichero de inicializacin privado identificado por el parmetro lpFileName.

lpAppName: Una cadena de caracteres terminada en nulo que contiene el nombre de seccin del fichero de inicializacin. lpKeyName: Una cadena de caracteres terminada en nulo que contiene el nombre de clave del fichero de inicializacin. nDefault: Especifica el valor por defecto que ser devuelto si la seccin y el nombre de clave no son hallados. lpFileName: Una cadena de caracteres terminada en nulo que contiene el nombre del fichero de inicializacin. Si el nombre de fichero no contiene una ruta completa, el sistema buscar el fichero en el directorio de Windows.

Si la funcin tiene xito, devuelve el valor entero de la clave especificada. Si el valor de la clave es menor que cero, la funcin devolver cero. Si la funcin falla, o la clave o seccin especificadas no existen, la funcin devuelve el valor por defecto.

GetProfileInt, WritePrivateProfileString

procedure var array begin of

end

GetPrivateProfileSection( lpAppName: PChar; lpReturnedString: PChar; nSize: DWORD; lpFileName: PChar ): DWORD;

8
{puntero a nombre de seccin} {buffer que recibir valores de la seccin} {tamao del buffer lpReturnedString} {puntero a nombre de fichero INI} {devuelve la cantidad de bytes copiados al buffer}

Esta funcin recupera todos los nombres de clave y sus respectivos valores de la seccin especificada de un fichero de inicializacin privado. Los valores son devueltos en forma de una serie de cadenas.

lpAppName: Una cadena de caracteres terminada en nulo que contiene el nombre de la seccin del fichero de inicializacin. lpReturnedString: Un buffer de cadena de caracteres terminada en nulo que recibir los nombres de claves y sus valores de la seccin especificada. La funcin devuelve los nombres de clave y valores en forma de una gran cadena, dentro de la cual cada cadena individual (que representa a una clave y su valor) se delimita mediante un carcter nulo. Detrs de la ltima subcadena se encuentran dos caracteres nulos. nSize: Especifica el tamao mximo del buffer al que apunta lpReturnedString. Bajo Windows 95/98, este tamao no puede ser superior a 32.767 bytes. lpFileName: Una cadena de caracteres terminada en nulo que contiene el nombre del fichero de inicializacin. Si el nombre de fichero no contiene una ruta completa, el sistema buscar el fichero en el directorio de Windows.

Si la funcin tiene xito, devuelve la cantidad de bytes copiados al buffer. Si el tamao del buffer es insuficiente para albergar todas las cadenas, la funcin devolver el valor de nSize - 2. Si la funcin falla, devuelve cero.

GetProfileSection, WritePrivateProfileSection

Consulte el Listado 8-18, correspondiente a WritePrivateProfileSection.

GetPrivateProfileSectionNames( lpszReturnBuffer: PChar; nSize: DWORD; lpFileName: PChar ): DWORD;

{buffer que recibir las cadenas} {tamao del buffer al que apunta lpszReturnBuffer} {puntero a nombre de fichero INI} {devuelve la cantidad de bytes copiados al buffer}

Esta funcin recupera todos los nombres de seccin contenidos en un fichero de inicializacin privado. Los nombres son devueltos en forma de una serie de cadenas.

lpszReturnBuffer: Un buffer de cadena de caracteres terminada en nulo que recibir los nombres de seccin. La funcin devuelve los nombres de seccin en forma de una gran cadena, dentro de la cual cada cadena individual (que representa un nombre de seccin) se delimita mediante un carcter nulo. El ltimo nombre de seccin es seguido por dos caracteres nulos. nSize: Especifica el tamao mximo del buffer al que apunta lpszReturnBuffer. lpFileName: Una cadena de caracteres terminada en nulo que contiene el nombre del fichero de inicializacin. Si el nombre de fichero no contiene una ruta completa, el sistema buscar el fichero en el directorio de Windows.

Si la funcin tiene xito, devuelve la cantidad de bytes copiados al buffer. Si el tamao del buffer es insuficiente para albergar todas las cadenas, la funcin devolver el valor de nSize - 2. Si la funcin falla, devuelve cero.

GetPrivateProfileSection, WritePrivateProfileSection

procedure var array array of of

begin

8
if repeat with begin end do and then

until else end

GetPrivateProfileString( lpAppName:PChar; lpKeyName:PChar; lpDefault: PChar; lpReturnedString: PChar; nSize: DWORD; lpFileName: PChar ): DWORD;

{puntero a nombre de seccin} {puntero a nombre de clave} {valor por defecto si no se encuentra la clave} {buffer que recibir la cadena} {tamao del buffer lpReturnedString} {puntero a nombre de fichero INI} {devuelve la cantidad de bytes copiados}

Esta funcin recupera la cadena de caracteres asociada a la clave del registro indicada en la seccin especificada de un fichero de inicializacin privado. La funcin adicionalmente puede recuperar todos los nombres de seccin de un fichero de inicializacin o todos los nombres de claves de una seccin.

lpAppName: Una cadena de caracteres terminada en nulo que contiene el nombre de seccin del fichero de inicializacin. Si el valor de este parmetro es nil, la funcin devolver todos los nombres de seccin del fichero. lpKeyName: Una cadena de caracteres terminada en nulo que contiene el nombre de clave del fichero de inicializacin. Si el valor de este parmetro es nil, la funcin devolver todos los nombres de claves de la seccin especificada en el parmetro lpAppName. lpDefault: Una cadena de caracteres terminada en nulo que contiene el valor por defecto a devolver si la seccin o clave especificadas no existen. lpszReturnedString: Un buffer de cadena de caracteres terminada en nulo que recibir la cadena devuelta por la funcin. Si se ha solicitado el valor de una clave especfica, el buffer recibir dicho valor. Si se han solicitado nombres de seccin o de claves, la funcin devuelve los nombres en forma de una gran cadena, dentro de la cual cada cadena individual (que representa un nombre de seccin o clave) se delimita mediante un carcter nulo. El ltimo nombre de seccin es seguido por dos caracteres nulos. nSize: Especifica el tamao mximo del buffer al que apunta lpReturnedString. Bajo Windows 95/98, este tamao no puede ser superior a 32.767 bytes. lpFileName: Una cadena de caracteres terminada en nulo que contiene el nombre del fichero de inicializacin. Si el nombre de fichero no contiene una ruta completa, el sistema buscar el fichero en el directorio de Windows.

Si la funcin tiene xito, devuelve la cantidad de caracteres copiados al buffer. Si el buffer apuntado por lpReturnedString es insuficiente, la funcin devuelve el valor de nSize - 1, nSize - 2 si se han solicitado nombres de seccin o claves. Si la funcin falla, devuelve cero.

GetProfileString, WritePrivateProfileString

procedure var array array array begin of of of

while begin

do

end end

GetPrivateProfileStruct( lpAppName:PChar; lpKeyName:PChar; lpStruct: Pointer; nSize: UINT; lpFileName: PChar ): BOOL;

{puntero a nombre de seccin} {puntero a nombre de clave} {buffer que recibir la informacin} {tamao del buffer lpStruct} {puntero a nombre de fichero INI} {devuelve TRUE o FALSE}

Esta funcin recupera un bloque de datos de la clave especificada de una seccin de un fichero de inicializacin privado. Se utiliza tradicionalmente para recuperar informacin hacia una estructura de datos especfica.

lpAppName: Una cadena de caracteres terminada en nulo que contiene el nombre de seccin del fichero de inicializacin. lpKeyName: Una cadena de caracteres terminada en nulo que contiene el nombre de clave del fichero de inicializacin. lpStruct: Puntero a un buffer o estructura de datos que recibir los datos. nSize: Especifica el tamao del buffer apuntado por el parmetro lpStruct. lpFileName: Una cadena de caracteres terminada en nulo que contiene el nombre del fichero de inicializacin. Si el nombre de fichero no contiene una ruta completa, el sistema buscar el fichero en el directorio de Windows.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE.

WritePrivateProfileStruct

Consulte el Listado 8-20, correspondiente a WritePrivateProfileStruct.

GetProfileInt( lpAppName: PChar; lpKeyName: PChar; nDefault: Integer ): UINT;

{puntero a nombre de seccin} {puntero a nombre de clave} {valor por defecto} {devuelve un valor entero}

Esta funcin recupera un valor entero de una clave perteneciente a una seccin del fichero de inicializacin Win.INI.

lpAppName: Una cadena de caracteres terminada en nulo que contiene el nombre de seccin del fichero Win.INI. lpKeyName: Una cadena de caracteres terminada en nulo que contiene el nombre de clave del fichero Win.INI. nDefault: Especifica el valor por defecto que ser devuelto si el nombre de seccin o el nombre de clave no son encontrados.

Si la funcin tiene xito, devuelve el valor entero asociado a la clave especificada. Si el valor de la clave es menor que cero, la funcin devolver cero. Si la funcin falla, o la seccin o clave especificadas no existen, la funcin devuelve el valor por defecto.

GetPrivateProfileInt, WriteProfileString

procedure

begin if else end then

GetProfileSection( lpAppName: PChar; lpReturnedString: PChar; nSize: DWORD; ): DWORD;

{puntero a nombre de seccin} {buffer que recibir valores de seccin} {tamao del buffer lpReturnedString} {devuelve la cantidad de bytes copiados al buffer}

Esta funcin recupera todos los nombres de claves y sus valores de la seccin especificada del fichero Win.INI. Los valores se devuelven en forma de una serie de cadenas.

lpAppName: Una cadena de caracteres terminada en nulo que contiene el nombre de seccin del fichero de inicializacin. lpszReturnedString: Un buffer de cadena de caracteres terminada en nulo que recibir los nombres de claves y sus valores. La funcin devuelve los nombres de clave y sus valores en forma de una gran cadena, dentro de la cual cada cadena individual (que contiene un nombre de clave y su valor) se delimita mediante un carcter nulo. La ltima clave es seguida por dos caracteres nulos. nSize: Especifica el tamao mximo del buffer al que apunta lpReturnedString. Bajo Windows 95/98, este tamao no puede ser superior a 32.767 bytes.

Si la funcin tiene xito, devuelve la cantidad de bytes copiados al buffer. Si el tamao del buffer es insuficiente para albergar todas las cadenas, la funcin devolver el valor de nSize - 2. Si la funcin falla, devuelve cero.

GetPrivateProfileSection, WriteProfileSection

Consulte el Listado 8-21, correspondiente a la funcin WriteProfileSection.

GetProfileString( lpAppName:PChar; lpKeyName:PChar; lpDefault: PChar; lpReturnedString: PChar; nSize: DWORD; ): DWORD;

{puntero a nombre de seccin} {puntero a nombre de clave} {valor por defecto si no se encuentra la clave} {buffer que recibir la cadena} {tamao del buffer lpReturnedString} {devuelve la cantidad de bytes copiados}

Esta funcin recupera la cadena de caracteres asociada a la clave del registro especificada en la seccin especificada del fichero Win.INI. La funcin adicionalmente puede recuperar todos los nombres de seccin existentes o todos los nombres de claves de una seccin.

lpAppName: Una cadena de caracteres terminada en nulo que contiene el nombre de seccin del fichero de inicializacin. Si el valor de este parmetro es nil, la funcin devolver todos los nombres de seccin en el fichero. lpKeyName: Una cadena de caracteres terminada en nulo que contiene el nombre de clave del fichero de inicializacin. Si el valor de este parmetro es nil, la funcin devolver todos los nombres de clave asociados a la seccin especificada. lpDefault: Una cadena de caracteres terminada en nulo que contiene el valor por defecto a devolver si la seccin o clave no existen. lpszReturnedString: Un buffer de cadena de caracteres terminada en nulo que recibir la cadena devuelta por la funcin. Si se ha solicitado el valor de una clave especfica, el buffer recibir dicho valor. Si se han solicitado nombres de seccin o de claves, la funcin devuelve los nombres en forma de una gran cadena, dentro de la cual cada cadena individual (que representa un nombre de seccin o clave) se delimita mediante un carcter nulo. El ltimo nombre de seccin es seguido por dos caracteres nulos. nSize: Especifica el tamao mximo del buffer al que apunta lpReturnedString. Bajo Windows 95/98, este tamao no puede ser superior a 32.767 bytes.

Si la funcin tiene xito, devuelve la cantidad de caracteres copiados al buffer. Si el buffer apuntado por lpReturnedString es insuficiente, la funcin devuelve el valor de nSize - 1, nSize - 2 si se han solicitado nombres de seccin o claves. Si la funcin falla, devuelve cero.

GetPrivateProfileString, WriteProfileString

Consulte el Listado 8-22, correspondiente a la funcin WriteProfileString.

RegCloseKey( hKey: HKEY ): LongInt;

{manejador de clave a cerrar} {devuelve un cdigo de error}

Esta funcin libera el manejador de clave del registro obtenido mediante una llamada previa a RegCreateKeyEx o RegOpenKeyEx. Una llamada a RegCloseKey no garantiza que un nuevo valor sea grabado al registro. El sistema puede demorar en unos segundos la escritura al registro de las valores nuevos o modificados. Para garantizar que los valores sean grabados al registro, utilice la funcin RegFlushKey.

hKey: Especifica el manejador de clave del registro a cerrar.

Si la funcin tiene xito, devuelve ERROR_SUCCESS. Si la funcin falla, devuelve un cdigo de error que puede pasarse a la funcin FormatMessage para recuperar un mensaje de error.

RegCreateKeyEx, RegDeleteKey, RegFlushKey, RegOpenKeyEx, RegSetValueEx

Consulte el Listado 8-5, correspondiente a la funcin RegCreateKeyEx.

RegCreateKeyEx( hKey: HKEY; lpSubKey: PChar; Reserved: DWORD; lpClass: PChar; dwOptions: DWORD; samDesired: REGSAM;

{clave madre de la subclave a crear} {cadena que contiene el nombre de subclave} {reservado} {apunta a cadena de clase} {opciones de almacenamiento} {opciones de seguridad}

lpSecurityAttributes: PSecurityAttributes; var phkResult: HKEY; lpdwDisposition: PDWORD ): LongInt;

{atributos de seguridad solicitados} {buffer para manejador de nueva clave} {opcin de existencia} {devuelve un cdigo de error}

Esta funcin se utiliza para crear o abrir una subclave de una clave madre especificada. La clave recin creada no contendr inicialmente ningn valor.

hKey: Especifica el manejador de la clave madre de la subclave que se desea abrir o crear. Puede ser cualquier clave abierta o uno de los siguientes valores especiales (claves races): HKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS lpSubKey: Una cadena de caracteres terminada en nulo que contiene el nombre de la subclave a crear. Si la clave ya existe, la funcin simplemente abrir la clave existente. Reserved: Reservado para uso futuro; debe ser puesto a cero. lpClass: Una cadena de caracteres terminada en nulo que contiene el tipo de clase de la subclave a crear. dwOptions: Especifica las opciones de almacenamiento de la clave. Este parmetro puede contener uno de los valores de la Tabla 8-2. samDesired: Especifica las opciones de seguridad de acceso de la clave. Este parmetro puede contener uno de los valores de la Tabla 8-3. lpSecurityAttributes: Puntero a un registro TSecurityAttributes que determina si el manejador de la clave abierta puede ser heredado por un proceso hijo. Si el valor de este parmetro es nil, el manejador no podr ser heredado. El registro TSecurityAttributes se define de la siguiente forma: TSecurityAttributes = record nLength: DWORD; lpSecurityDescriptor: Pointer; bInheritHandle: BOOL; end; {tamao del registro TSecurityAttributes} {descriptor de seguridad} {bandera de herencia de manejador}

Consulte la funcin CreateFile para ver una descripcin de esta estructura de datos. phkResult: Puntero a un buffer que recibir el manejador de la clave del registro recin creada.

lpdwDisposition: Puntero a un buffer que recibir una bandera que indicar la existencia previa de la clave. Este parmetro podr contener uno de los valores descritos en la Tabla 8-4.

Si la funcin tiene xito, devuelve ERROR_SUCCESS. Si la funcin falla, devuelve un cdigo de error que podr ser pasado a la funcin FormatMessage para recuperar un mensaje de error.

RegCloseKey, RegDeleteKey, RegOpenKeyEx, RegSaveKey

procedure var string string

begin

if

then

if else begin

then

nil nil if else begin then

end

end end

RegDeleteKey( hKey: HKEY; lpSubKey: PChar ): LongInt;

{manejador de la clave madre de subclave a eliminar} {nombre de la clave a eliminar} {devuelve un cdigo de error}

Esta funcin se utiliza para eliminar una subclave desde dentro de la clave madre. La funcin elimina la subclave y todos sus valores asociados del registro.

hKey: Especifica el manejador de la clave madre de la subclave a eliminar. Puede ser cualquier clave abierta o uno de los siguientes valores especiales: HKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS lpSubKey: Puntero a una cadena de caracteres terminada en nulo que contiene el nombre de la subclave a borrar.

Si la funcin tiene xito, devuelve ERROR_SUCCESS. Si la funcin falla, devuelve un cdigo de error que podr ser pasado a la funcin FormatMessage para recuperar un mensaje de error.

RegCloseKey, RegDeleteKey, RegOpenKeyEx, RegSaveKey

procedure var string array begin if else if then then of

begin

if else begin if else end end end

then

then

RegDeleteValue( hKey: HKEY; lpValueName: PChar ): LongInt;

{manejador de la clave de la que se desea eliminar valor} {cadena que identifica al valor} {devuelve un cdigo de error}

Esta funcin se utiliza para eliminar el valor especificado por el parmetro lpValueName situado dentro de la clave abierta especificada por el parmetro hKey.

hKey: Especifica el manejador de la clave de la que se va a eliminar el valor especificado. Puede ser cualquier clave abierta o una de las siguientes claves races: HKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS lpValueName: Una cadena de caracteres terminada en nulo que identifica al valor a eliminar.

Si la funcin tiene xito, devuelve ERROR_SUCCESS. Si la funcin falla, devuelve un cdigo de error que podr ser pasado a la funcin FormatMessage para recuperar un mensaje de error.

RegSetValueEx

procedure var string string array array begin if begin

of of then

if

then nil nil

if begin

and not

then

end if if begin if end then then then

end end

RegEnumKeyEx( hKey: HKEY; dwIndex: DWORD; lpName: PChar; var lpcbName: DWORD; lpReserved: Pointer; lpClass: PChar; lpcbClass: PDWORD; lpftLastWriteTime: PFileTime ): LongInt;

8
{manejador de clave a enumerar} {ndice de subclave a recuperar} {buffer que recibir nombre de subclave} {tamao del buffer para el nombre} {reservado} {buffer que recibir el nombre de clase} {tamao del buffer para el nombre de clase} {momento de ltima edicin de la subclave} {devuelve un cdigo de error}

Esta funcin se utiliza para recuperar todas las subclaves de la clave especificada en el parmetro hKey. En la primera llamada a la funcin, al parmetro dwIndex debe asignrsele cero. El valor de este parmetro se incrementar en uno en cada llamada subsiguiente hasta que la funcin devuelva ERROR_NO_MORE_ITEMS.

hKey: Especifica el manejador de la clave cuyas subclaves se desea enumerar. Puede ser cualquier clave abierta, o una de las siguientes claves races: HKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS dwIndex: Especifica el ndice del elemento a recuperar. Este parmetro deber inicialmente ser puesto a cero, para luego incrementarlo en uno en cada llamada secuencial, hasta que todas las subclaves sean recuperadas. lpName: Puntero a un buffer para cadena de caracteres terminada en nulo que recibir el nombre de la subclave para el ndice actual. lpcbName: Especifica el tamao mximo del buffer para el nombre de la subclave. lpReserved: Reservado para uso futuro. lpClass: Puntero a buffer para una cadena de caracteres terminada en nulo que recibir el nombre de la clase de la subclave recuperada por la funcin.

lpcbClass: Especifica el tamao mximo del buffer para el nombre de la clase. lpftLastWriteTime: Puntero a un buffer que recibir el momento de la ltima actualizacin de la subclave.

Si la funcin tiene xito, devuelve ERROR_SUCCESS. La funcin devolver ERROR_NO_MORE_ITEMS cuando el parmetro dwIndex exceda la cantidad de subclaves de la clave. Si la funcin falla, devuelve un cdigo de error que podr ser pasado a la funcin FormatMessage para recuperar un mensaje de error.

RegCreateKeyEx, RegDeleteKey, RegOpenKeyEx, RegQueryInfoKey

procedure var

array begin

of

while nil begin if then begin nil nil nil do

end

end end

RegEnumValue( hKey: HKEY; dwIndex: DWORD; lpValueName: PChar; var lpcbValueName: DWORD; lpReserved: Pointer; lpType: PDWORD; lpData: PByte; lpcbData: PDWORD ): LongInt;

8
{manejador de clave a enumerar} {ndice del elemento a recuperar} {buffer que recibir nombre del valor} {tamao del buffer para el nombre} {reservado} {tipo del valor recuperado} {buffer que recibir el valor} {tamao de buffer para el valor} {devuelve un cdigo de error}

Esta funcin se utiliza para recuperar todos los valores de una clave abierta. En la primera llamada a la funcin, el parmetro dwIndex debe ser puesto a cero. El valor de este parmetro se deber incrementar en uno en cada llamada subsiguiente hasta que la funcin devuelva ERROR_NO_MORE_ITEMS.

hKey: Especifica el manejador de la clave cuyos valores se van a enumerar. Puede ser cualquier clave abierta o una de las siguientes claves races: HKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS dwIndex: Especifica el ndice del elemento a recuperar. Este parmetro deber inicialmente ser puesto a cero, para luego incrementarlo en uno en cada llamada secuencial, hasta que todos los valores sean recuperados. lpValueName: Puntero a buffer para una cadena de caracteres terminada en nulo que recibir el nombre del valor recuperado. lpcbValueName: Especifica el tamao del buffer para el nombre del valor. lpReserved: Reservado para uso futuro.

lpType: Puntero a un buffer que recibir una bandera que indica el tipo del valor recuperado, que puede ser cualquiera de los valores de la Tabla 8-5. A este parmetro se le puede asignar nil si el tipo de valor no se necesita. lpData: Puntero al buffer que recibir el dato. lpcbData: Especifica el tamao del buffer para el dato.

Si la funcin tiene xito, devuelve ERROR_SUCCESS. La funcin devolver ERROR_NO_MORE_ITEMS cuando el parmetro dwIndex supere la cantidad de valores de la clave. Si la funcin falla, devuelve un cdigo de error que podr ser pasado a la funcin FormatMessage para recuperar un mensaje de error.

RegCreateKeyEx, RegEnumKeyEx, RegOpenKeyEx, RegQueryInfoKey

procedure var string array array begin if then of of

while do begin

nil

with begin if else

do then

case

of begin end

else end end

end

if else if else end

then

then

RegFlushKey( hKey: HKEY ): LongInt;

{manejador de la clave a ser grabada a disco} {devuelve un cdigo de error}

Esta funcin se utiliza para grabar inmediatamente a disco todas las subclaves y valores contenidas en la clave especificada por el parmetro hKey. El sistema normalmente graba las modificaciones al disco slo despus de que la clave es cerrada. Normalmente esto puede tardar varios segundos, y durante ese intervalo de tiempo podra recuperarse un valor incorrecto del registro. Esta funcin grabar la informacin antes de que sea ejecutada cualquier otra accin, lo que puede causar una prdida de rendimento del sistema. Esta funcin slo debe ser utilizada en caso de estricta necesidad.

hKey: Especifica el manejador de la clave cuyos valores y subclaves se deben grabar inmediatamente al disco. Puede ser cualquier clave abierta o una de las siguientes claves races: HKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS

Si la funcin tiene xito, devuelve ERROR_SUCCESS. Si la funcin falla, devuelve un cdigo de error que podr ser pasado a la funcin FormatMessage para recuperar un mensaje de error.

RegCloseKey, RegDeleteKey

procedure var string array array begin if begin then of of

end end

RegLoadKey( hKey: HKEY; lpSubKey: PChar; lpFile: PChar ): LongInt;

{manejador de clave madre a ser cargada} {nombre de subclave en que los valores sern cargados} {nombre de fichero de registro} {devuelve un cdigo de error}

Esta funcin se utiliza para crear una subclave y cargar en ella una serie de subclaves y valores desde un fichero de registro. Un fichero de registro se crea mediante la funcin RegSaveKey, y contiene subclaves y valores.

hKey: Especifica la clave bajo la cual se crear la nueva clave y en la que las subclaves y valores sern cargados. Debe ser HKEY_USER o HKEY_LOCAL_MACHINE. lpSubKey: Puntero a una cadena de caracteres terminada en nulo que contiene el nombre de la nueva clave a crear. lpFile: Puntero a una cadena de caracteres terminada en nulo que contiene el nombre del fichero de registro que almacena las subclaves y valores a cargar. Bajo un sistema de ficheros FAT, este nombre de fichero no puede tener extensin.

Si la funcin tiene xito, devuelve ERROR_SUCCESS. Si la funcin falla, devuelve un cdigo de error que podr ser pasado a la funcin FormatMessage para recuperar un mensaje de error.

RegDeleteKey, RegReplaceKey, RegRestoreKey, RegSaveKey, RegUnloadKey

procedure var array array string string begin of of

if else

then

end

RegOpenKeyEx( hKey: HKEY; lpSubKey: PChar; ulOptions: DWORD; samDesired: REGSAM; var phkResult: HKEY ): LongInt;

8
{manejador de clave madre a abrir} {nombre de subclave} {reservado} {seguridad de clave solicitada} {manejador de nueva clave abierta} {devuelve un cdigo de error}

Esta funcin se utiliza para abrir una subclave existente en el registro o abrir un nuevo manejador de una clave abierta.

hKey: Puede ser cualquier clave abierta o una de las siguientes claves races: HKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS lpSubKey: Puntero a una cadena de caracteres terminada en nulo que contiene el nombre de la subclave a abrir. Si este parmetro apunta a una cadena vaca, la funcin abrir otro manejador para la clave identificada por el parmetro hKey. ulOptions: Reservado para uso futuro. Asigne cero a este parmetro. samDesired: Especifica las opciones de seguridad solicitadas. Este parmetro puede contener uno o ms valores de la Tabla 8-6. phkResult: Variable que recibir el nuevo manejador de la clave abierta.

Si la funcin tiene xito, devuelve ERROR_SUCCESS. Si la funcin falla, devuelve un cdigo de error que podr ser pasado a la funcin FormatMessage para recuperar un mensaje de error.

RegCreateKeyEx, RegDeleteKey

function var begin

if begin while begin end end case

then

do

of

end if else end then

RegQueryInfoKey( hKey: HKEY; lpClass: PChar; lpcbClass: PDWORD; lpReserved: Pointer; lpcSubKeys: PDWORD; lpcbMaxSubKeyLen: PDWORD; lpcbMaxClassLen: PDWORD; lpcValues: PDWORD; lpcbMaxValueNameLen: PDWORD; lpcbMaxValueLen: PDWORD; lpcbSecurityDescriptor: PDWORD; lpftLastWriteTime: PFileTime ): LongInt;

{manejador de la clave a consultar} {buffer que recibir nombre de clase de clave} {tamao de buffer para nombre de clase} {reservado} {buffer que recibir cantidad de subclaves} {buffer que recibir tamao mximo de nombre de subclave} {buffer que recibir tamao mximo de nombre de clase de subclave} {buffer que recibir la cantidad de valores} {buffer que recibir tamao mximo de nombre de valor} {buffer que recibir tamao mximo de valor} {buffer que recibir tamao de descriptor de seguridad de la clave} {buffer que recibir momento de ltima mod.} {devuelve un cdigo de error}

Esta funcin se utiliza para recuperar informacin acerca de una clave abierta. Esta funcin recuperar el nmero de subclaves, valores, nombre de clase, descriptor de seguridad, y longitudes mximas para los nombres de subclaves, nombres de clases, y nombres de valores.

hKey: Especifica el manejador de clave cuya informacin se desea recuperar. Puede ser cualquier clave abierta o una de las siguientes claves races: HKEY_CLASSES_ROOT HKEY_CURRENT_USER

HKEY_LOCAL_MACHINE HKEY_USERS lpClass: Puntero a buffer para una cadena de caracteres terminada en nulo que recibir el nombre de la clase de la clave. lpcbClass: Especifica el tamao mximo del buffer para el nombre de la clase, sin incluir el terminador nulo. lpReserved: Reservado para uso futuro. lpcSubKeys: Puntero a un buffer que recibir el nmero de subclaves que la clave contiene. lpcbMaxSubKeyLen: Puntero a un buffer que recibir la longitud del nombre de subclave ms largo, sin incluir el terminador nulo. lpcbMaxClassLen: Puntero a un buffer que recibir la longitud del nombre de clase ms largo de las subclaves, sin incluir el terminador nulo. lpcValues: Puntero a un buffer que recibir el nmero de valores que la clave contiene. lpcbMaxValueNameLen: Puntero a un buffer que recibir la longitud del nombre de valor ms largo, sin incluir el terminador nulo. lpcbMaxValueLen: Puntero a un buffer que recibir el tamao del valor ms largo. lpcbSecurityDescriptor: Puntero a un buffer que recibir el descriptor de seguridad de la clave. lpftLastWriteTime: Puntero a un buffer que recibir el momento de la ltima modificacin de la clave.

Si la funcin tiene xito, devuelve ERROR_SUCCESS. Si la funcin falla, devuelve un cdigo de error que podr ser pasado a la funcin FormatMessage para recuperar un mensaje de error.

RegDeleteKey, RegEnumKeyEx, RegEnumValue, RegQueryValueEx

procedure var string array of

begin

nil nil nil

end

RegQueryValueEx( hKey: HKEY; lpValueName: PChar; lpReserved: Pointer; lpType: PDWORD; lpData: PByte; lpcbData: PDWORD ): LongInt;

{manejador de clave cuyo valor se desea recuperar} {nombre del valor a recuperar} {reservado} {buffer que recibir el tipo del valor} {buffer que recibir el valor} {tamao mximo} {devuelve un cdigo de error}

Esta funcin recupera el valor y tipo de valor asociados al nombre de valor especificado bajo la clave abierta del registro identificada por hKey.

hKey: Especifica la clave de la que se desea recuperar el valor. Puede ser cualquier clave abierta o una de las siguientes claves races: HKEY_CLASSES_ROOT

HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS lpValueName: Una cadena de caracteres terminada en nulo que contiene el nombre del valor a recuperar. lpReserved: Reservado para uso futuro. Asigne nil a este parmetro. lpType: Puntero a un buffer que recibir el tipo del valor que es recuperado. Este buffer recibir uno de los valores de la Tabla 8-7. lpData: Puntero a un buffer que recibir el valor actual del nombre del valor especificado. lpcbData: Especifica el tamao mximo del buffer apuntado por el parmetro lpData.

Si la funcin tiene xito, devuelve ERROR_SUCCESS. Si la funcin falla, devuelve un cdigo de error que podr ser pasado a la funcin FormatMessage para recuperar un mensaje de error.

RegCreateKeyEx, RegEnumKeyEx, RegEnumValue, RegOpenKeyEx, RegQueryInfoKey

procedure var array of

begin if then begin nil

8
nil

nil

end else end

RegReplaceKey( hKey: HKEY; lpSubKey: PChar; lpNewFile: PChar; lpOldFile: PChar ): LongInt;

{manejador de clave madre abierta} {nombre de subclave} {nombre de fichero de clave a importar} {nombre de fichero para guardar informacin de clave} {devuelve un cdigo de error}

Esta funcin se utiliza para sustituir el valor de una subclave de una clave abierta, haciendo una copia de seguridad de los antiguos valores de la subclave. Los valores se importan de y se graban en un fichero de claves de registro. Esta funcin slo trabaja sobre claves previamente cargadas mediante la funcin RegLoadKey.

hKey: Especifica la clave dentro de la cual la nueva clase va a ser creada. Debe ser HKEY_USER o HKEY_LOCAL_MACHINE. lpSubKey: Puntero a una cadena de caracteres terminada en nulo que contiene el nombre de la clave a sustituir. lpNewFile: Puntero a una cadena de caracteres terminada en nulo que contiene el nombre del fichero de registro que contiene las subclaves y valores a cargar. Bajo el sistema de ficheros FAT, este nombre de fichero no puede tener extensin. lpOldFile: Puntero a una cadena de caracteres terminada en nulo que contiene el nombre del fichero de registro que recibir las subclaves originales. Bajo el sistema de ficheros FAT, este nombre de fichero no puede tener extensin.

Si la funcin tiene xito, devuelve ERROR_SUCCESS. Si la funcin falla, devuelve un cdigo de error que podr ser pasado a la funcin FormatMessage para recuperar un mensaje de error.

RegDeleteKey, RegLoadKey, RegRestoreKey

procedure var array array of of

array string string string begin

of

if begin end else

then

end

RegSaveKey( hKey: HKEY; lpFile: PChar; lpSecurityAttributes: PSecurityAttributes ): LongInt;

{manejador de clave madre} {nombre de fichero a crear} {puntero a descriptor de seguridad} {devuelve un cdigo de error}

Esta funcin se utiliza para exportar una clave del registro y todas sus subclaves a un fichero de claves del registro. Este fichero podr luego ser cargado mediante las funciones RegReplaceKey o RegLoadKey.

hKey: Especifica el manejador de la clave a guardar. Puede ser cualquier clave abierta o una de las siguientes claves races:

HKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS lpFile: Una cadena de caracteres terminada en nulo que contiene el nombre de fichero de registro a crear. Bajo el sistema de ficheros FAT, este nombre de fichero no puede tener extensin. lpSecurityAttributes: Puntero a un registro TSecurityAttributes que determina si el manejador de la clave abierta podr ser heredado por procesos hijos. Si el valor de este parmetro es nil, el manejador no podr ser heredado.

Si la funcin tiene xito, devuelve ERROR_SUCCESS. Si la funcin falla, devuelve un cdigo de error que podr ser pasado a la funcin FormatMessage para recuperar un mensaje de error.

RegCreateKeyEx, RegDeleteKey, RegLoadKey, RegReplaceKey

procedure var array string string begin of

if else

nil

then

end

RegSetValueEx( hKey: HKEY; lpValueName: PChar; Reserved: DWORD; dwType: DWORD; lpData: Pointer; cbData: DWORD ): LongInt;

{manejador de clave madre} {nombre del valor a guardar} {reservado} {tipo del valor a guardar} {valor a guardar} {tamao del dato} {devuelve un cdigo de error}

Esta funcin se utiliza para crear un nombre de valor y asignar un valor bajo una clave abierta del registro.

hKey: Especifica el manejador de la clave madre que recibe el nuevo valor. Puede ser cualquier clave abierta o una de las siguientes claves races: HKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS lpValueName: Una cadena de caracteres terminada en nulo que contiene el nombre del valor a asignar. Si el nombre de valor no existe bajo la clave especificada, es creado. Reserved: Reservado para uso futuro. Asigne cero a este parmetro. dwType: Especifica el tipo del dato a ser asignado. Puede tomar cualquiera de los valores de la Tabla 8-8. lpData: Puntero a un buffer que almacena el valor (dato) a asignar. cbData: Especifica el tamao del buffer de datos apuntado por el parmetro lpData. Si se trata de una cadena de caracteres, el tamao deber incluir el terminador nulo.

Si la funcin tiene xito, devuelve ERROR_SUCCESS. Si la funcin falla, devuelve un cdigo de error que podr ser pasado a la funcin FormatMessage para recuperar un mensaje de error.

RegCreateKeyEx, RegFlushKey, RegOpenKeyEx, RegQueryValueEx

Consulte el Listado 8-10, correspondiente a la funcin RegFlushKey.

RegUnLoadKey( hKey: HKEY; lpSubKey: PChar ): LongInt;

{manejador de clave madre} {nombre de subclave a descargar} {devuelve un cdigo de error}

Esta funcin se utiliza para descargar una subclave del registro. Esta subclave debe haber sido cargada de un fichero de claves mediante una llamada a la funcin RegLoadKey.

hKey: Especifica la clave madre de la subclave a descargar. Debe ser HKEY_USER o HKEY_LOCAL_MACHINE. lpSubKey: Una cadena de caracteres terminada en nulo que contiene el nombre de la subclave a descargar. Esta subclave debe haber sido creada mediante una llamada previa a la funcin RegLoadKey.

Si la funcin tiene xito, devuelve ERROR_SUCCESS. Si la funcin falla, devuelve un cdigo de error que podr ser pasado a la funcin FormatMessage para recuperar un mensaje de error.

RegDeleteKey, RegLoadKey

8
of

procedure var array string begin

end

WritePrivateProfileSection( lpAppName: PChar; {puntero a nombre de seccin} lpString: PChar; {puntero a cadenas de valores} lpFileName: PChar {puntero a nombre de fichero INI} ): BOOL; {devuelve TRUE o FALSE}

Esta funcin elimina todos los nombres de clave y valores de la seccin especificada de un fichero de inicializacin privado y las sustituye por los nombres de clave y valores apuntados por el parmetro lpString. Si la seccin identificada por lpAppName no existe, se crear una nueva seccin al final del fichero de inicializacin.

lpAppName: Una cadena de caracteres terminada en nulo que contiene el nombre de seccin del fichero de inicializacin. lpString: Puntero a un buffer que contiene una cadena o serie de cadenas. Cada cadena tiene el formato: Clave = Valor Si el buffer contiene ms de una cadena, cada cadena se separa de la siguiente mediante un carcter nulo. A la ltima cadena le siguen dos caracteres nulos. lpFileName: Una cadena de caracteres terminada en nulo que contiene el nombre del fichero de inicializacin. Si el nombre de fichero no contiene una ruta completa, el sistema buscar el fichero en el directorio de Windows. Si el fichero no existe, se crear un nuevo fichero de inicializacin.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE.

GetPrivateProfileSection, WriteProfileSection

procedure var array array begin of of

if repeat

and

then

until else end procedure var array array begin of of

for begin

to

do

end

end

WritePrivateProfileString( lpAppName:PChar; lpKeyName:PChar; lpString: PChar; lpFileName: PChar ): BOOL;

{puntero a nombre de seccin} {puntero a nombre de clave} {puntero a cadena} {puntero a nombre de fichero INI} {devuelve TRUE o FALSE}

Esta funcin asigna un valor de cadena de caracteres a la clave del registro especificada en la seccin de un fichero de inicializacin privado. La funcin puede adems crear secciones dentro del fichero de inicializacin.

lpAppName: Una cadena de caracteres terminada en nulo que contiene el nombre de seccin del fichero de inicializacin. Si la seccin no existe, la funcin la crear. lpKeyName: Una cadena de caracteres terminada en nulo que contiene el nombre de clave del fichero de inicializacin. Si la clave no existe, la funcin la crear. Si el valor de este parmetro es nil, la funcin eliminar la seccin entera. lpString: Puntero a un buffer que contiene una cadena o serie de cadenas. Cada cadena tiene el formato: Clave = Valor Si el buffer contiene ms de una cadena, cada cadena se separa de la siguiente mediante un carcter nulo. A la ltima cadena le siguen dos caracteres nulos. lpFileName: Una cadena de caracteres terminada en nulo que contiene el nombre del fichero de inicializacin. Si el nombre de fichero no contiene una ruta completa, el sistema buscar el fichero en el directorio de Windows. Si el fichero no existe, se crear un nuevo fichero de inicializacin.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE.

GetPrivateProfileString, WriteProfileString

procedure var array of

array begin

of

8
end procedure var array begin of

end

WritePrivateProfileStruct( lpAppName:PChar; lpKeyName:PChar; lpStruct: Pointer; nSize: UINT; lpFileName: PChar ): BOOL;

{puntero a nombre de seccin} {puntero a nombre de clave} {buffer que recibir informacin estructurada} {tamao de buffer lpStruct} {puntero a nombre de fichero ini} {devuelve TRUE o FALSE}

Esta funcin graba un bloque de datos en la clave especificada en una seccin de un fichero de inicializacin privado. Tradicionalmente esta funcin se utiliza para guardar el contenido de una estructura de datos.

lpAppName: Una cadena de caracteres terminada en nulo que contiene el nombre de seccin del fichero de inicializacin. lpKeyName: Una cadena de caracteres terminada en nulo que contiene el nombre de clave del fichero de inicializacin.

lpStruct: Puntero a un buffer o estructura de datos que contiene los datos a grabar al fichero de inicializacin. nSize: Especifica el tamao de buffer apuntado por el parmetro lpStruct. lpFileName: Una cadena de caracteres terminada en nulo que contiene el nombre del fichero de inicializacin. Si el nombre de fichero no contiene una ruta completa, el sistema buscar el fichero en el directorio de Windows.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE.

GetPrivateProfileStruct

packed record string string string end var

implementation procedure var array begin of

if then begin

end end

procedure var array begin of

8
end

WriteProfileSection( lpAppName: PChar; lpString: PChar

{puntero a nombre de seccin} {puntero a buffer que almacena cadenas de seccin}

): BOOL;

{devuelve TRUE o FALSE}

Esta funcin graba todos los nombres de clave y sus respectivos valores en el buffer apuntado por el parmetro lpString en la seccin especificada del fichero Win.ini.

lpAppName: Una cadena de caracteres terminada en nulo que contiene el nombre de seccin del fichero de inicializacin. Si la seccin no existe, la funcin lo crear. lpString: Puntero a un buffer que contiene una cadena o serie de cadenas. Cada cadena tiene el formato: Clave = Valor Si el buffer contiene ms de una cadena, cada cadena se separa de la siguiente mediante un carcter nulo. A la ltima cadena le siguen dos caracteres nulos.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE.

GetProfileSection, WritePrivateProfileSection

procedure var array begin of

if repeat

and

then

until else end procedure var array begin of

for begin

to

do

end

end

WriteProfileString(

lpAppName:PChar; lpKeyName:PChar; lpString: PChar ): BOOL;

{puntero a nombre de seccin} {puntero a nombre de clave} {puntero a buffer que contiene la cadena} {devuelve TRUE o FALSE}

Esta funcin graba o elimina valores de cadena de caracteres de la clave del registro especificada en la seccin especificada del fichero Win.ini.

lpAppName: Una cadena de caracteres terminada en nulo que contiene el nombre de seccin del fichero de inicializacin. Si la seccin no existe, la funcin la crear. lpKeyName: Una cadena de caracteres terminada en nulo que contiene el nombre de clave del fichero de inicializacin. Si el valor de este parmetro es nil, la seccin identificada por el parmetro lpAppName y todos los valores contenidos en ella sern eliminados. lpString: Puntero a un buffer que contiene una cadena o serie de cadenas. Cada cadena tiene el formato: Clave = Valor Si el buffer contiene ms de una cadena, cada cadena se separa de la siguiente mediante un carcter nulo. A la ltima cadena le siguen dos caracteres nulos. Si el valor de este parmetro es nil, la clave identificada por el parmetro lpKeyName y todos sus valores sern eliminados.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE.

GetProfileString, WritePrivateProfileString

procedure var array begin of

if else

and

then

end procedure begin end

Las funciones del API Win32 para la gestin de la memoria brindan al programador de Delphi herramientas efectivas para la reserva y monitorizacin de los recursos de memoria. El API de 32 bits fue diseado para ofrecer un nivel de compatibilidad razonable a las aplicaciones de 16 bits, an cuando incorpora los cambios dramticos en la estructura de la memoria tpicos de los sistema operativos de 32 bits. El conocimiento sobre cmo utilizar de forma eficiente los recursos de memoria permiten al desarrollador crear un cdigo ms estable y eficiente. El hecho de que ahora es frecuentemente necesario escribir cdigo que ser colocado en DLLs y ejecutado desde hilos concurrentes hace an ms necesario el estudio de las funciones que se describen en este captulo.

En el sentido estricto, no es necesario utilizar en un programa Delphi las funciones de asignacin de memoria que se presentan aqu. Las aplicaciones pueden utilizar las funciones New o GetMem de Object Pascal, que solicitan memoria del espacio de memoria implcito. Sin embargo, utilizar solamente estas funciones impedir al desarrollador controlar aspectos avanzados, como la reserva de heaps adicionales, la seleccin de la estrategia de control de errores que Windows debe utilizar, o la gestin eficiente de grandes buffers. Windows ofrece varias funciones de gestin de memoria para la creacin de heaps y la reserva de espacio en ellos, as como funciones para la gestin de memoria virtual. Internamente, Delphi no utiliza las funciones de manejo de heaps para la asignacin de memoria. En vez de eso, Delphi utiliza las funciones de memoria virtual. Aunque el uso de las funciones del API de Windows ofrece al programador un mayor control sobre la utilizacin de la memoria, las pruebas de velocidad realizadas muestran que las funciones de gestin de memoria de Delphi ofrecen una velocidad comparable a la que se puede obtener utilizando directamente las funciones de memoria de Windows.

Windows 95/98 y Windows NT introducen un nuevo diseo de memoria que difiere significativamente del diseo de Windows 3.1 y MS-DOS. Al programador se le ofrece un modelo de memoria plana que se extiende ms all de los lmites de la memoria fsica. Este modelo de memoria virtual se apoya en un gestor de memoria que mapea las referencias a memoria virtual de una aplicacin a direcciones fsicas en tiempo de ejecucin. Un fichero de intercambio (swap file) en disco duro es utilizado para intercambiar pginas de memoria entre la RAM y el disco cuando el sistema utiliza una cantidad de memoria virtual superior a la cantidad fsicamente disponible. Este diseo de memoria ofrece toda clase de facilidades al programador. Bajo el modelo de memoria virtual se hace posible crear estructuras de datos de dimensiones anteriormente imposibles. Independientemente de cunta memoria fsica haya instalada en un ordenador, el modelo de memoria cuyo lmite es 2 gigabytes est ah para que el programador solicite la cantidad que necesita. Por supuesto, se debe tener en cuenta que la cantidad de espacio en disco disponible puede imponer un lmite a la disponibilidad de memoria virtual. Cada programa tiene su propio espacio de direcciones virtuales de 4 gigabytes, donde los 2 gigabytes inferiores estn disponibles al programador para el uso que estime pertinente. Los 2 gigabytes superiores estn reservados para uso del sistema. Las funciones de memoria del API reservan las cantidades de memoria que se soliciten de los 2 gigabytes inferiores del espacio de direcciones virtual.

Existen cuatro categoras de funciones para la gestin de memoria. Las funciones de gestin de memoria virtual se utilizan para gestionar grandes buffers de memoria. Las funciones de gestin de heaps estn indicadas para bloques de memoria de menores dimensiones. Las funciones de gestin de memoria global y de memoria local estn indicadas para bloques relativamente pequeos, y se ofrecen para facilitar la compatibilidad con aplicaciones de 16 bits. En el entorno Win32 existen nicamente espacios de direcciones privadas. En las versiones de Windows de 16 bits exista un espacio de direcciones local a la aplicacin y otro global. El API Win32 mantiene versiones locales y globales de las funciones de heap por compatibilidad, pero ambas clases de funciones utilizan memoria del mismo espacio local de direcciones de 2 gigabytes. Todo el heap es local a un proceso y no puede ser accedido por ningn otro proceso.

Cuando un programa necesita solicitar espacio para buffers de al menos varios kilobytes, lo ms apropiado es utilizar la funcin VirtualAlloc para obtener el bloque de memoria. VirtualAlloc satisface peticiones en bloques de tamaos mltiplos de 4KB,

redondeando por exceso a fronteras de 4KB la cantidad de memoria que se solicita. Cuando la memoria que un programa solicita se utilizar fundamentalmente para objetos, arrays o registros pequeos, las llamadas a HeapAlloc sern ms eficientes. Utilizar VirtualAlloc para un registro muy pequeo implicara un gasto considerable de memoria y una mala utilizacin de los recursos, sobre todo si se tratase de registros que forman parte de estructuras de datos navegables como listas enlazadas o rboles binarios. Ello podra adicionalmente causar la ralentizacin del sistema debido a la actividad de intercambio de pginas entre memoria y disco si la cantidad de memoria solicitada superase la fsicamente disponible. Cada proceso dispone de un heap implcito, pero una aplicacin puede reservar heaps adicionales en aras de una gestin ms eficiente de los recursos. Cada heap se identifica mediante un manejador. Una aplicacin puede obtener el manejador del heap implcito mediante una llamada a la funcin GetProcessHeap. Nota en relacin con el rendimiento: Los hilos pertenecientes a un proceso tienen acceso al heap implcito del proceso. El acceso a los heaps es serializado por el gestor de memoria Win32. Cuando un hilo ejecuta una funcin de reserva de memoria de un heap, los dems hilos que solicitan memoria se mantienen en espera hasta que la funcin termine. Ello se traduce en una pequea demora que sufre la aplicacin. Si un hilo necesita obtener cierta cantidad de memoria que no compartir con otros hilos, ser mucho ms eficiente que el hilo reserve su propio heap y no utilice el implcito. Cuando un hilo crea su propio heap, puede opcionalmente especificar que no desea que se aplique la serializacin durante las peticiones de memoria. Los otros hilos que soliciten espacio de otros heaps no se vern retrasados. Al disear la estrategia de acceso a memoria en aplicaciones multihilos, el programador tiene dos posibilidades: utilizar el heap implcito por conveniencia y un tamao de cdigo ligeramente inferior, o utilizar heaps privados a los hilos para un rendimiento superior. Las DLLs no contienen de forma implcita su propio heap. Una DLL comparte el espacio de heap con la aplicacin que hace la llamada. Sin embargo, una DLL puede reservar su propio espacio de heap y utilizarlo, del mismo modo que el hilo principal de un proceso puede reservar un heap en adicin al implcito. Es muy importante liberar la memoria de heaps tan pronto una aplicacin termina de utilizarla. Los programas que no logran hacerlo se dice que provocan goteos de memoria, y provocarn errores graves si se les permite funcionar durante largos perodos. La regla bsica es: si una aplicacin reserv un heap, es responsable de liberarlo.

Las versiones de 16 bits de Windows mantienen un heap global que es comn a todo el sistema y un heap local privado al proceso. El heap local est limitado a un segmento de 64 KB, y normalmente los programadores establecen un valor mucho menor. De las funciones que se describen en este captulo, slo las funciones de heap global y local estaban disponibles en el API de Windows de 16 bits.

Las llamadas a estas funciones bajo Win32 realizan la misma tarea. Las funciones globales no son globales como eran en Windows 16 bits; bajo Win32 no existe memoria compartida, a excepcin de los ficheros mapeados en memoria. Toda la memoria disponible en los 2 gigabytes de espacio de direcciones virtual es de uso privado de la aplicacin e invisible para el resto de las aplicaciones; las funciones de gestin de memoria global y local reservan ambas memoria de este espacio de direcciones comn.

Las peticiones de memoria mediante VirtualAlloc son directas, con pocas opciones que puedan confundir al programador. Lo principal es solicitar la cantidad adecuada de memoria. Debe tenerse en cuenta que VirtualAlloc garantiza bloques de memoria en mltiplos de 4 KB. Si esta cantidad es excesiva, se debe considerar la utilizacin de HeapAlloc. Aunque es cierto que la aplicacin no puede quedarse sin memoria virtual cuando utilice VirtualAlloc, podra provocar un trabajo innecesario de las rutinas de intercambio de pginas si se malgasta mucha memoria. Si la aplicacin compromete un bloque a memoria fsica, ste ser intercambiado a disco cuando sea necesario, ya que Windows siempre asume que la memoria confirmada est siendo utilizada. Una aplicacin debe reservar memoria para evitar que sea utilizada por otras aplicaciones y comprometerla (commit) cuando la memoria va a ser realmente utilizada. Esto reduce sensiblemente el acceso al fichero de intercambio, con la consiguiente mejora en el rendimiento. Siempre libere la memoria tan pronto como la aplicacin termine de utilizarla. Es ms fcil y rpido para el gestor de memoria virtual de Windows mantener las pginas de memoria actuales mapeadas a memoria fsica cuando hay menos pginas que gestionar.

La memoria puede encontrarse en tres estados diferentes. El estado de un objeto de memoria cambia en la medida en que es reservado, modificado y liberado. Los tres estados son: Libre: La pgina no est ni confirmada ni reservada. No est accesible al proceso, pero est disponible para ser reservada mediante alguna de las funciones de asignacin de memoria. Reservada: La memoria ha sido reservada para su uso por el proceso que hace la llamada, y no puede ser utilizada por otros procesos o hilos. No est siendo utilizada, y no est comprometida a memoria fsica. Comprometida: El objeto de memoria est comprometido a memoria fsica. Est marcado como que est siendo usado, y puede contener informacin voltil. Si en cierto momento es necesario utilizar la memoria fsica para otro bloque de memoria virtual, la pgina ser guardada en el fichero de intercambio. Esta memoria puede ser utilizada nicamente por el proceso que la reserv.

Tericamente existen 2 gigabytes de memoria para la aplicacin bajo el modelo de memoria virtual. Sin embargo, comprometer la memoria virtual a almacenamiento fsico exige el soporte de un fichero de intercambio en disco. Windows utilizar todo el espacio en disco disponible en el sistema para fichero de intercambio, a menos que se configure explcitamente para utilizar menos. En la medida en que VirtualAlloc u otras funciones se utilicen para comprometer memoria virtual, el gestor de memoria virtual comenzar a consumir la memoria RAM disponible. Cuando la memoria fsica est cerca de quedar exhausta, el gestor de memoria virtual comenzar a mapear pginas de memoria al disco. Cuando el espacio en disco tambin se agote, las funciones de asignacin comenzarn a generar errores. Por lo tanto, el lmite del diseo no son realmente los 2 gigabytes tericos, sino la cantidad de memoria RAM disponible ms el tamao del fichero de intercambio (descontando algn espacio que el sistema utiliza para la gestin). Al hacer una solicitud de reserva de memoria, es conveniente verificar antes la cantidad de memoria disponible. No utilice todos los recursos del sistema, ya que Windows u otro software que est ejecutndose podra necesitar alguna cantidad. Los 2 gigabytes de memoria virtual son privados al proceso, pero el fichero de intercambio es un recurso que el sistema operativo comparte con las aplicaciones en ejecucin. La verificacin del margen de memoria disponible se realiza llamando a la funcin GlobalMemoryStatus y comprobando los valores de los campos dwMemoryLoad o dwAvailPageFile del registro devuelto. Mantenga libres varios megabytes de memoria virtual para dejar sitio al sistema operativo y a las otras aplicaciones. El valor de dwMemoryLoad alcanzar el nivel de 100% bastante antes de que el lmite sea alcanzado. Para un ejemplo detallado de la reserva de memoria virtual, consulte el programa de ejemplo SwapTest.exe que se puede descargar desde el apartado referente a este libro en http://editorial.danysoft.com.

Un programa puede realizar todas las peticiones de memoria de heap sobre el heap implcito, obteniendo el manejador de ste mediante la funcin GetProcessHeap. Sin embargo, eso obligar a la aplicacin a sufrir prdidas de rendimiento debido a las esperas de los hilos que realicen peticiones de memoria. La creacin de mltiples heaps ayuda al desarrollador a poner a punto el rendimiento de su aplicacin. Se puede utilizar mltiples heaps con varios propsitos diferentes. Si la aplicacin utiliza varias listas enlazadas o rboles binarios de gran tamao, podra ser ms eficiente reservar un heap separado para cada una de estas estructuras de datos. Y la utilizacin de heaps separados permitira a mltiples hilos hacer peticiones de memoria evitando los conflictos que surgen en caso de utilizar un nico heap. Por ltimo, utilizar heaps separados permite activar la gestin de excepciones adicional

slo para algunos de ellos. La utilizacin de mltiples heaps no tiene desventajas evidentes.

Un diseo de software slido debe verificar el resultado de cada llamada a funcin de reserva de memoria para asegurarse de que el puntero recibido es vlido. Adems de las comprobaciones de puntero tradicionales, el API ofrece opciones para activar o desactivar el tratamiento de errores de Windows. Lo ms simple y seguro es mantener todas las opciones de tratamiento de errores activadas. Sin embargo, en caso de que la aplicacin est bien depurada, y si sta realiza miles o millones de peticiones de memoria de heap, el desarrollador puede ganar en rendimiento eliminando el tratamiento de errores de Windows, que implica una gestin de excepciones. Windows, por supuesto, devolver punteros nulos para que la aplicacin pueda detectar el fallo de una peticin de memoria. El desarrollador puede poner a punto la gestin de excepciones especificando exactamente qu llamadas a funcin utilizarn el tratamiento de errores de Windows. Utilizando la opcin HEAP_GENERATE_EXCEPTIONS de la funcin HeapCreate, el tratamiento de errores estar activo para cada llamada posterior que opere sobre el heap especificado. Omitiendo esa opcin en la llamada a HeapCreate, el desarrollador puede seleccionar individualmente qu llamadas a funcin utilizarn la gestin de excepciones. Sin embargo, tenga en cuenta que la aplicacin siempre puede detectar el error simplemente verificando el puntero que recibe, independientemente de si la opcin HEAP_GENERATE_EXCEPTIONS estaba activa o no.

Las peticiones de memoria de heap pueden provocar conflictos en caso de que dos o ms hilos soliciten memoria de un heap compartido. Para evitar tales conflictos, omita la opcin HEAP_NO_SERIALIZE. De forma implcita, cuando un hilo realiza una llamada a HeapAlloc y otra peticin similar de otro hilo est en curso, el primer hilo ser suspendido hasta que el heap est libre para atender otra peticin. Se dice entonces que la reserva de memoria en el heap est serializada. Esto incide negativamente en el rendimiento del hilo que ha sido suspendido. Esta disminucin del rendimiento puede ser significativa si hay muchos hilos simultneos realizando peticiones o cuando hay miles o millones de peticiones. Para eliminar este cuello de botella de los heaps comunes, cree heaps que sean privados a los hilos. Utilice una llamada a CreateHeap para asignar un heap a cada hilo (o varios heaps por hilo si es necesario). Esto asegura que no habr conflictos de reserva de memoria entre los hilos, y el desarrollador podr especificar la opcin HEAP_NO_SERIALIZE para las llamadas que reservan memoria. Ello significa que Windows ni siquiera comprobar la existencia de conflictos de acceso a los heaps, dado que el programador ha asumido la responsabilidad en ese asunto. Las peticiones de

memoria sern satisfechas ms rpidamente, y el incremento de rendimiento podr ser significativo.

Cuando una aplicacin utiliza varios heaps, o hace diferentes usos del mismo heap, se debe intentar obtener toda la memoria necesaria para un objetivo en un bloque contiguo de memoria. Ello se logra realizando todas las peticiones a HeapAlloc de forma consecutiva, y no mezcladas con otro cdigo que pueda hacer peticiones de memoria. Considere el caso en que se est cargando una base de datos enorme, probablemente a una lista o rbol binario. Si se trata de varios megabytes de datos, las peticiones al heap podran exceder la cantidad de memoria disponible. Ello provocara una gran actividad de intercambio a disco, ya que el gestor de memoria virtual intenta mantener en RAM la memoria actualmente direccionada. Una aplicacin puede reducir esta actividad de acceso a disco manteniendo toda la memoria que est utilizando unida, en lugar de fragmentada. Aqu estamos en presencia de decisiones de diseo que pueden hacer que un sistema funcione o no funcione. Suponga que la aplicacin necesita leer un fichero cuyo tamao supera la cantidad de memoria fsica disponible, y la aplicacin necesita dos copias diferentes de los mismos datos para dos propsitos diferentes. Sera sabio utilizar dos heaps para mantener unidas las pequeas peticiones realizadas con cada uno de los dos propsitos. Los heaps se gestionarn en pginas de 4 KB por el gestor de memoria virtual, por lo que cuando un conjunto de datos est activo, esas pginas estarn residentes en memoria fsica. El registro inactivo en el otro heap tendr sus pginas en disco. Esto minimizar la actividad de disco mientras la aplicacin est trabajando sobre cada uno de los heaps. Dado que las llamadas a HeapAlloc tienen al manejador del heap como primer parmetro, no se requiere un esfuerzo extra del programador para especificar el heap adecuado. La aplicacin slo tiene que crear los heaps necesarios al inicio del proceso, y destruirlos al final. Note que no es importante el orden en el que se hagan las peticiones de memoria de los heaps creados. Si las peticiones a varios heaps se entremezclan, el sistema continuar funcionando eficientemente. Cada heap utilizar pginas de memoria virtual separadas para sus propias peticiones. La aplicacin no necesita realizar todas las peticiones sobre un heap antes de comenzar a trabajar sobre el otro. Lo nico que tiene que hacer el programador para optimizar el uso de los heaps es utilizar un heap para cada propsito y establecer las opciones de forma adecuada.

En este captulo se describen las siguientes funciones de gestin de memoria:

CopyMemory( Destination: Pointer; Source: Pointer; Length: DWORD );

{direccin del bloque de memoria destino} {direccin del bloque de memoria a copiar} {tamao del bloque de memoria en bytes} {no devuelve nada}

CopyMemory copia el nmero de bytes solicitados de una direccin de memoria a otra. Es similar al procedimiento Move de Delphi, con la excepcin de que los parmetros de origen y destino estn en orden inverso. Los bloques de memoria no tienen que comenzar o finalizar en ninguna frontera especfica, pero todas las direcciones referenciadas deben pertenecer al rango de memoria asignado al proceso por el gestor de memoria. Los bloques de memoria apuntados por Source y Destination no deben solaparse. Si los bloques de memoria se solapan, utilice la funcin MoveMemory. Utilizar CopyMemory en bloques que se solapen puede provocar efectos impredecibles.

Des tination: La direccin de destino a la que se copiar la cantidad de memoria especificada. Source: La direccin de origen a partir de la cual la memoria especificada ser copiada. Length: La cantidad de bytes a copiar.

FillMemory, MoveMemory, ZeroMemory

var array of

implementation procedure var begin for begin end end procedure var begin to do

for end

to

do

FillMemory( Destination: Pointer; Length: DWORD; Fill: Byte );

{direccin del bloque de memoria a inicializar} {tamao del bloque de memoria en bytes} {valor a utilizar en la inicializacin} {no devuelve nada}

FillMemory inicializa los bytes que componen el bloque de memoria especificado con el valor que se indica. FillMemory es til cuando cada byte del bloque debe ser inicializado con el mismo valor. El bloque de memoria no tiene que comenzar o finalizar en ninguna frontera especfica, pero todas las direcciones referenciadas deben pertenecer al rango de memoria asignado al proceso por el gestor de memoria.

Des tination: La direccin del bloque de memoria a inicializar. Length: La cantidad de bytes de memoria a inicializar. Fill: Byte con el valor a asignar a cada byte del bloque de memoria.

CopyMemory, MoveMemory, ZeroMemory

procedure var array begin

of

for end

to

do

GetProcessHeap: THandle;

{devuelve el manejador del heap implcito}

Esta funcin devuelve el manejador del heap implcito para el proceso que hace la llamada. Esta funcin puede utilizarse con las funciones HeapAlloc, HeapReAlloc, HeapFree y HeapSize para reservar memoria del heap del proceso sin tener que haber creado antes un heap explcitamente mediante HeapCreate.

Si la funcin tiene xito, devuelve el manejador del heap implcito para el proceso actual; en caso contrario devuelve cero.

HeapAlloc, HeapCreate, HeapDestroy, HeapFree, HeapReAlloc, HeapSize

procedure type array var begin of

for

to

do

end

GlobalAlloc( uFlags: UINT; dwBytes: DWORD ): HGLOBAL;

{atributos de reserva} {cantidad de bytes a reservar} {devuelve un manejador a un objeto de memoria global}

La funcin GlobalAlloc reserva el nmero de bytes solicitados del heap de Windows. La memoria reservada con esta funcin estar alineada a doble palabra, y puede constar de una cantidad de bytes superior a la especificada para facilitar la alineacin.

uFlags: Especifica cmo la memoria debe ser reservada. El valor por defecto es GMEM_FIXED, que es utilizado si este parmetro tiene el valor cero. Excepto cuando se indique lo contrario, a este parmetro pueden asignrsele uno o ms valores de la Tabla 9-2.

dwBytes: La cantidad de bytes a reservar.

Si la funcin tiene xito, devuelve el manejador del bloque de memoria global; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GlobalFree, GlobalLock, GlobalReAlloc, GlobalSize, LocalAlloc

procedure type array var of

begin if begin end then

if begin end for begin end

nil then

to

do

end

GlobalDiscard( h: THandle ): THandle;

{manejador de memoria global a descartar} {devuelve un manejador del objeto de memoria global}

La funcin GlobalDiscard descarta el bloque de memoria especificado por el parmetro h. Un bloque de memoria puede ser descartado solamente si fue creado anteriormente con la opcin GMEM_DISCARDABLE. El contador de bloqueos de este objeto de memoria debe ser cero para que la funcin tenga xito. Despus que un objeto de memoria global es descartado, su manejador se mantiene vlido y puede ser utilizado en llamadas posteriores a GlobalReAlloc.

h: El manejador del objeto de memoria a descartar.

Si la funcin tiene xito, devuelve un manejador del objeto de memoria global descartado; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GlobalAlloc, GlobalReAlloc

Consulte el Listado 9-6, correspondiente a la funcin GlobalReAlloc.

GlobalFlags( hMem: HGLOBAL ): UINT;

{manejador del objeto de memoria} {devuelve informacin de opciones y contador de bloqueos}

GlobalFlags ofrece informacin acerca de las opciones de reserva y el valor del contador de bloqueos del objeto de memoria especificado.

hMem: Un manejador del objeto de memoria cuya informacin se desea recuperar.

Si la funcin tiene xito, devuelve un valor de 32 bits que indica el contador de bloqueos y las opciones de reserva del objeto de memoria especificado. El byte ms bajo de la palabra ms baja del resultado contiene el valor actual del contador de bloqueos del objeto de memoria especificado, y puede ser obtenido combinando el resultado de la funcin con la constante GMEM_LOCKCOUNT mediante el operador booleano and. El byte ms alto de la palabra ms baja del resultado contiene las opciones de reserva que se utilizaron al crear el objeto de memoria especificado, que pueden ser cero o cualquier combinacin de valores de la Tabla 9-3. Si la funcin falla, devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GlobalAlloc, GlobalDiscard, GlobalLock, GlobalReAlloc, GlobalUnlock, LocalFlags

Consulte el Listado 9-6, correspondiente a la funcin GlobalReAlloc.

GlobalFree( hMem: HGLOBAL ): HGLOBAL;

{manejador del objeto de memoria a liberar} {devuelve cero o el manejador del objeto de memoria}

GlobalFree libera el bloque de memoria especificado; devuelve la memoria al heap y hace que el manejador sea invlido. Esta funcin liberar el objeto de memoria independientemente del valor de su contador de bloqueos.

hMem: El puntero al bloque de memoria a devolver al sistema.

Si la funcin tiene xito, devuelve cero; en caso contrario devuelve el manejador del objeto de memoria global. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GlobalAlloc, GlobalFlags, GlobalLock, GlobalReAlloc, GlobalUnlock, LocalFree

Consulte el Listado 9-4, correspondiente a la funcin GlobalAlloc, y el Listado 9-6, correspondiente a la funcin GlobalReAlloc.

9
GlobalHandle( Mem: Pointer ): HGLOBAL; {puntero al comienzo del bloque de memoria} {devuelve cero o el manejador del objeto de memoria}

GlobalHandle convierte el puntero al bloque de memoria especificado por el parmetro Mem en un manejador de objeto de memoria global. Para los objetos de memoria reservados con la opcin GMEM_FIXED, las funciones GlobalHandle y GlobalLock no son necesarias, ya que el manejador y el puntero a memoria son el mismo valor. Cuando se utiliza GMEM_FIXED, el desarrollador es responsable de asegurarse de que todas las rutinas han terminado de utilizar el objeto de memoria cuando ste es liberado.

Mem: Puntero al primer byte del bloque de memoria cuyo manejador de memoria global se desea recuperar.

Si la funcin tiene xito, devuelve un manejador del objeto de memoria global; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GlobalAlloc, GlobalFree, GlobalLock

Consulte el Listado 9-6, correspondiente a la funcin GlobalReAlloc.

GlobalLock( hMem: HGLOBAL ): Pointer;

{manejador de objeto de memoria} {devuelve un puntero al bloque de memoria}

GlobalLock incrementa el contador de bloqueos del objeto de memoria especificado en uno, y fuerza a que el objeto de memoria sea mantenido en una direccin especfica de memoria. Un objeto de memoria que est bloqueado no ser movido a otra direccin por el gestor de memoria, excepto en el caso de llamadas a la funcin GlobalReAlloc. La direccin devuelta por la funcin ser una direccin vlida del objeto de memoria mientras que el contador de bloqueos del objeto sea mayor o igual a uno. Varias rutinas pueden establecer bloqueos sobre un objeto, por lo que ste no ser movido en memoria mientras tanto alguna rutina est utilizando la memoria. El contador de bloqueos puede ser decrementado llamando a la funcin GlobalUnlock. Cuando un objeto de memoria es reservado con la opcin GMEM_FIXED, siempre tendr un contador de bloqueos igual a cero, pero nunca ser movido en memoria.

hMem: Manejador del objeto de memoria cuyo puntero se desea recuperar.

Si la funcin tiene xito, devuelve un puntero al primer byte del bloque de memoria global; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GlobalAlloc, GlobalFlags, GlobalReAlloc, GlobalUnlock

Consulte el Listado 9-4, correspondiente a la funcin GlobalAlloc, y el Listado 9-6, correspondiente a la funcin GlobalReAlloc.

GlobalMemoryStatus( var lpBuffer: TMemoryStatus );

{puntero a registro TMemoryStatus} {no devuelve nada}

Este procedimiento rellena un registro de tipo TMemoryStatus con informacin relativa al estado de la memoria fsica y la memoria virtual. Sin embargo, debido a la naturaleza de la gestin de memoria de Windows, dos llamadas consecutivas a esta funcin pueden producir diferentes resultados.

lpBuffer: Puntero a un registro de tipo TMemoryStatus que recibir la informacin acerca del estado de la memoria fsica y virtual. El registro TMemoryStatus se define de la siguiente forma: TMemoryStatus = record dwLength: DWORD; dwMemoryLoad: DWORD; dwTotalPhys: DWORD; dwAvailPhys: DWORD; dwTotalPageFile: DWORD; dwAvailPageFile: DWORD; dwTotalVirtual: DWORD; dwAvailVirtual: DWORD; end; {tamao de registro en bytes} {uso estimado de la memoria} {cantidad total de memoria fsica} {cantidad de memoria fsica disponible} {cantidad total de espacio de intercambio} {cantidad de espacio de intercambio disponible} {cantidad total de memoria virtual} {cantidad de memoria virtual disponible}

dwLength: Contiene el tamao de registro en bytes, y debe ser inicializado con el valor SizeOf(TMemoryStatus) antes de realizar la llamada a GlobalMemoryStatus. dwMemoryLoad: Contiene un valor entre 0 y 100 que indica el porcentaje aproximado de memoria actualmente en uso. dwTotalPhys: Indica la cantidad total de memoria fsica en bytes. dwAvailPhys: Indica la cantidad de memoria fsica disponible en bytes. dwTotalPageFile: Indica la cantidad mxima de espacio disponible en el fichero de intercambio en bytes, incluyendo tanto el espacio usado como el disponible. Esta cifra no representa el tamao fsico real del fichero de intercambio. dwAvailPageFile: Indica la cantidad total de espacio disponible en el fichero de intercambio en bytes. dwTotalVirtual: Indica el tamao total del espacio virtual de direcciones del proceso que hace la llamada en bytes.

dwAvailVirtual: Indica la cantidad total de espacio no reservado y no comprometido en el espacio virtual de direcciones del proceso que hace la llamada en bytes.

GlobalFree, LocalFree

procedure var begin

end

GlobalReAlloc( hMem: HGLOBAL; dwBytes: DWORD; uFlags: UINT ): HGLOBAL;

9
{manejador de objeto de memoria global} {tamao del objeto de memoria} {opciones de relocalizacin} {devuelve un manejador de objeto de memoria global}

Esta funcin se utiliza para cambiar el tamao o los atributos del objeto de memoria global especificado. Si esta funcin relocaliza un objeto de memoria fijo, el manejador de memoria global devuelto puede ser utilizado como un puntero a ese bloque de memoria.

hMem: Un manejador del objeto de memoria global cuyo tamao o atributos se desea modificar. dwBytes: El nuevo tamao del objeto de memoria global en bytes. Si el parmetro uFlags contiene la opcin GMEM_MODIFY, este parmetro es ignorado. uFlags: Especifica cmo el objeto de memoria global ser modificado. Este parmetro puede contener uno o ms valores de la Tabla 9-4. Esos valores pueden combinarse con la constante GMEM_MODIFY, que modifica su comportamiento segn se describe en la propia tabla.

Si la funcin tiene xito, devuelve un manejador del objeto de memoria relocalizado; en caso contrario devuelve cero y el manejador original se mantiene vlido. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GlobalAlloc, GlobalFree, GlobalLock

var

implementation procedure var begin

for begin

to

do

end

if

then

and

end procedure var begin if then

if begin end

then

if begin end

then

for begin end

to

do

if if not

then and then

if end

then

GlobalSize( hMem: HGLOBAL ): DWORD;

{manejador del objeto de memoria} {devuelve el tamao del objeto de memoria en bytes}

Esta funcin devuelve el tamao del objeto de memoria especificado en bytes.

hMem: El manejador del objeto de memoria cuyo tamao se desea recuperar.

Si la funcin tiene xito, devuelve el tamao del objeto de memoria global especificado en bytes; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GlobalAlloc, GlobalFlags, GlobalReAlloc

Consulte el Listado 9-6, correspondiente a la funcin GlobalReAlloc.

GlobalUnlock( hMem: HGLOBAL ): BOOL;

{manejador del objeto de memoria} {devuelve TRUE o FALSE}

GlobalUnlock decrementa el contador de bloqueos de los objetos de memoria mviles reservados con la opcin GMEM_MOVEABLE, y no tiene efecto alguno sobre los objetos fijos en memoria, reservados con la opcin GMEM_FIXED.

hMem: Manejador del objeto de memoria a desbloquear.

Si esta funcin tiene xito y el objeto an sigue bloqueado despus que se decremente su contador de bloqueos, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError. Si GetLastError devuelve ERROR_SUCCESS, entonces el objeto de memoria no est bloqueado.

GlobalAlloc, GlobalFlags, GlobalLock, GlobalReAlloc

Consulte el Listado 9-4, correspondiente a la funcin GlobalAlloc, y el Listado 9-6, correspondiente a la funcin GlobalReAlloc.

HeapAlloc( hHeap: THandle; dwFlags: DWORD; dwBytes: DWORD ): Pointer;

{manejador de heap} {opciones de reserva} {tamao solicitado en bytes} {devuelve un puntero a la memoria reservada}

HeapAlloc reserva el nmero de bytes solicitados del heap especificado.

hHeap: Un manejador del heap de cuya memoria se reservar espacio. Puede tratarse de un heap creado mediante una llamada a HeapCreate o del heap del proceso, recuperado mediante la funcin GetProcessHeap. dwFlags: Especifica cmo se reservar el espacio del heap. Si el valor de este parmetro es cero, entonces las opciones correspondientes que se suministraron en su momento a HeapCreate tendrn efecto; en caso contrario, las opciones que se especifiquen aqu tendrn precedencia sobre las indicadas a HeapCreate. Si el parmetro hHeap contiene el manejador del heap del sistema devuelto por GetProcessHeap, este parmetro es ignorado. Este parmetro puede tomar uno o ms de los valores especificados en la Tabla 9-5. dwBytes: Especifica el tamao del bloque de memoria solicitado en bytes. Si el heap no puede crecer, el tamao solicitado deber ser inferior a 524.280 bytes ($7FFF8).

Si la funcin tiene xito, devuelve un puntero al bloque de memoria reservado. Si la funcin falla y la opcin HEAP_GENERATE_EXCEPTIONS no fue especificada, la funcin devuelve nil. Si la funcin falla y se haba especificado la opcin HEAP_GENERATE_EXCEPTIONS, la funcin devuelve uno de los valores de la Tabla 9-6.

GetProcessHeap, HeapCreate, HeapDestroy, HeapFree, HeapReAlloc, HeapSize

var

implementation procedure var begin if begin end then

if begin if not end

nil then

then

for begin

to

do

end

end procedure begin

if

nil then

if not

then

if not end

then

HeapCreate( flOptions: DWORD; dwInitialSize: DWORD; dwMaximumSize: DWORD ): THandle;

{opciones de reserva} {tamao inicial del heap} {tamao mximo del heap} {devuelve el manejador del nuevo heap}

Esta funcin reserva un bloque de memoria del espacio de direcciones virtual para que sea utilizado como un heap por el proceso que hace la llamada. El tamao inicial del heap se reserva de la memoria fsica disponible en el espacio de direcciones virtual.

flOptions: Especifica los atributos del heap, que afectarn a todos los accesos posteriores al mismo. Este parmetro puede tomar uno o ms de los valores de la Tabla 9-7. dwInitialSize: El tamao inicial del heap en bytes que se comprometern a memoria fsica. Este valor es redondeado por exceso a la prxima frontera de pgina utilizada por el gestor de memoria virtual. El tamao de una pgina puede obtenerse llamando a la funcin GetSystemInfo. dwMaximumSize: El tamao mximo del heap en bytes, redondeado por exceso a la prxima frontera de pgina utilizada por el gestor de memoria virtual. Este espacio quedar marcado como reservado en el espacio de direcciones virtual del proceso. Si el valor de este parmetro es diferente de cero, el heap no podr crecer, y de l podr reservarse memoria nicamente hasta el tamao mximo. Si este parmetro es cero, el heap podr crecer y el sistema continuara satisfaciendo peticiones de memoria en el heap hasta el lmite de la memoria virtual disponible.

Si la funcin tiene xito, devuelve el manejador del heap recin creado; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetProcessHeap, GetSystemInfo, HeapAlloc, HeapReAlloc, HeapDestroy, HeapFree, HeapSize, HeapValidate, VirtualAlloc

Consulte el Listado 9-7, correspondiente a la funcin HeapAlloc.

HeapDestroy( hHeap: THandle ): BOOL;

{manejador del heap a destruir} {devuelve TRUE o FALSE}

Esta funcin descompromete y libera todas las pginas de un heap creado mediante una llamada a HeapCreate, destruye el objeto de heap, e invalida el manejador de heap especificado. Un heap puede ser destruido sin haber llamado antes a HeapFree para liberar su memoria.

hHeap: El manejador del heap a destruir. Este parmetro NO puede tomar el valor devuelto por la funcin GetProcessHeap.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetProcessHeap, HeapAlloc, HeapCreate, HeapFree, HeapReAlloc, HeapSize

Consulte el Listado 9-7, correspondiente a la funcin HeapAlloc.

HeapFree( hHeap: THandle; dwFlags: DWORD; lpMem: Pointer ): BOOL;

{manejador del heap} {opciones} {puntero a la memoria a liberar} {devuelve TRUE o FALSE}

Esta funcin libera memoria previamente reservada del heap mediante las funciones HeapAlloc o HeapReAlloc. La memoria liberada quedar disponible para satisfacer peticiones futuras.

hHeap: El manejador del heap del que la memoria fue reservada originalmente. dwFlags: Especifica el comportamiento durante el acceso al heap. Este parmetro puede ser cero o HEAP_NO_SERIALIZE. Consulte la funcin HeapCreate para ver una descripcin de la opcin HEAP_NO_SERIALIZE. lpMem: Puntero al bloque de memoria a liberar.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetProcessHeap, HeapAlloc, HeapCreate, HeapDestroy, HeapReAlloc, HeapSize

Consulte el Listado 9-7, correspondiente a la funcin HeapAlloc.

HeapReAlloc( hHeap: THandle; dwFlags: DWORD; lpMem: Pointer; dwBytes: DWORD ): Pointer;

{manejador del heap} {opciones de reserva} {puntero al bloque de memoria a relocalizar} {tamao de relocalizacin solicitado en bytes} {devuelve un puntero al bloque de memoria}

Esta funcin relocaliza la memoria reservada de un heap, y cambia los atributos del bloque de memoria.

hHeap: Manejador del heap en el que la memoria ser reservada. Puede ser un heap creado mediante una llamada a HeapCreate, o el heap del sistema, recuperado mediante una llamada a GetProcessHeap. dwFlags: Especifica cmo se llevar a cabo la relocalizacin. Si el valor de este parmetro es cero, entonces las opciones correspondientes que se suministraron en su momento a HeapCreate tendrn efecto; en caso contrario, las opciones que se especifiquen aqu tendrn precedencia sobre las indicadas a HeapCreate. Si el parmetro hHeap contiene el manejador del heap del sistema devuelto por GetProcessHeap, este parmetro es ignorado. Este parmetro puede tomar uno o ms de los valores especificados en la Tabla 9-8. lpMem: Puntero al bloque de memoria a relocalizar. dwBytes: Especifica el nuevo tamao del bloque de memoria en bytes. Si el heap no tiene la posibilidad de crecer, el tamao solicitado no puede ser superior a 524.280 bytes ($7FFF8).

Si la funcin tiene xito, devuelve un puntero al bloque de memoria relocalizado. Si la funcin falla y la opcin HEAP_GENERATE_EXCEPTIONS no fue especificada, la function devuelve nil. Si la funcin falla y la opcin HEAP_GENERATE_EXCEPTIONS fue especificada, la funcin devuelve uno de los valores de la Tabla 9-9.

GetProcessHeap, HeapAlloc, HeapCreate, HeapDestroy, HeapFree, HeapSize

Consulte el Listado 9-7, correspondiente a la funcin HeapAlloc.

HeapSize( hHeap: THandle; dwFlags: DWORD; lpMem: Pointer ): DWORD;

{manejador del heap} {opciones} {puntero al bloque de memoria} {devuelve el tamao del bloque de memoria en bytes}

Esta funcin devuelve el tamao del bloque de memoria reservado del heap especificado en bytes.

hHeap: Manejador del heap del que la memoria ha sido reservada. Puede ser un heap creado mediante una llamada a HeapCreate, o el heap del sistema, recuperado mediante una llamada a GetProcessHeap. dwFlags: Especifica el comportamiento durante el acceso al heap. Este parmetro puede ser cero o HEAP_NO_SERIALIZE. Consulte la funcin HeapCreate para ver una descripcin de la opcin HEAP_NO_SERIALIZE. lpMem: Puntero al bloque de memoria cuyo tamao se desea recuperar.

Si la funcin tiene xito, devuelve el tamao en bytes del bloque de memoria. Si la funcin falla, devuelve $FFFFFFFF.

GetProcessHeap, HeapAlloc, HeapCreate, HeapDestroy, HeapFree, HeapReAlloc

Consulte el Listado 9-7, correspondiente a la funcin HeapAlloc.

IsBadCodePtr( lpfn: FARPROC ): BOOL;

{puntero a posible rea de memoria de cdigo} {devuelve TRUE o FALSE}

Esta funcin determina si la direccin apuntada por el parmetro lpfn contiene cdigo al que el proceso actual tiene acceso de lectura. Incluso si se utiliza IsBadCodePtr antes de acceder a la memoria en la direccin dada, es sabio utilizar la gestin estructurada de excepciones mientras se acceda a la memoria. Los derechos pueden ser cambiados por otros procesos en un entorno de multitarea apropiativa. Esta funcin comprueba el acceso de lectura slo a la direccin de memoria especificada. Para verificar el acceso a un bloque de memoria, utilice la funcin IsBadReadPtr.

lpfn: Puntero a la direccin de memoria a verificar.

Si esta funcin tiene xito y el proceso no tiene acceso de lectura a la direccin de memoria especificada, la funcin devuelve TRUE. Si la funcin falla, o el proceso tiene acceso de lectura a la direccin de memoria especificada, devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

IsBadReadPtr, IsBadStringPtr, IsBadWritePtr

procedure var

begin if then else end procedure var begin if then else end

IsBadReadPtr( lp: Pointer; ucb: UINT ): BOOL;

{puntero a bloque de memoria} {tamao del bloque de memoria en bytes} {devuelve TRUE o FALSE}

IsBadReadPtr comprueba si se tiene acceso de lectura al bloque de memoria especificado. Incluso si se utiliza IsBadReadPtr antes de acceder a la memoria en la direccin dada, es sabio utilizar la gestin estructurada de excepciones para atrapar los errores resultantes de los cambios en los derechos de acceso a la memoria en los sistemas con multitarea apropiativa.

lp: Puntero al bloque de memoria cuyos derechos de acceso de lectura se verifican. ucb: El tamao del bloque de memoria en bytes.

Si esta funcin tiene xito y el proceso no tiene acceso de lectura a cada uno de los bytes del bloque de memoria especificado, la funcin devuelve TRUE. Si la funcin falla, o el proceso tiene acceso de lectura a todos los bytes del bloque de memoria especificado, devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

IsBadCodePtr, IsBadStringPtr, IsBadWritePtr

procedure var array begin if then else end procedure var begin nil if then else end of

IsBadStringPtr( lpsz: PChar; ucchMax: UINT ): BOOL;

{puntero a cadena} {tamao mximo de la cadena en bytes} {devuelve TRUE o FALSE}

IsBadStringPtr verifica el acceso de lectura a todo el rango de memoria ocupado por la cadena apuntada por el parmetro lpsz. Se comprobar el rea ocupada por la cadena hasta el terminador nulo, o hasta la cantidad mxima especificada si no se encuentra un terminador. Esta funcin puede indicar un acceso vlido si el bloque de memoria contiene un carcter nulo cerca del inicio del rango de direcciones.

lpsz: Puntero a la cadena cuyo acceso de lectura se desea verificar.

ucchMax: El tamao mximo de la cadena, y la cantidad de bytes a verificar. Se verifica el acceso de lectura a cada byte hasta la cantidad que se especifica o hasta que se encuentre un carcter nulo.

Si esta funcin tiene xito y el proceso no tiene acceso de lectura a todos los bytes hasta el terminador nulo, o a toda el rea especificada por el parmetro ucchMax, la funcin devuelve TRUE. Si la funcin falla, o el proceso tiene acceso de lectura a todos los bytes hasta el terminador nulo o hasta la cantidad especificada por el parmetro ucchMax, devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

IsBadCodePtr, IsBadReadPtr, IsBadWritePtr

9
procedure var begin

if then else end procedure var begin if then else end

IsBadWritePtr( lp: Pointer;

{puntero a bloque de memoria}

ucb: UINT ): BOOL;

{tamao del bloque de memoria en bytes} {devuelve TRUE o FALSE}

IsBadWritePtr verifica si el proceso podra obtener derecho de escritura a todos los bytes del bloque de memoria especificado.

lp: Puntero al bloque de memoria cuyos derechos de escritura se verifican. ucb: El tamao del bloque de memoria en bytes.

Si esta funcin tiene xito y el proceso no tiene derecho de escritura a cada byte del bloque de memoria especificado, la funcin devuelve TRUE. Si la funcin falla, o el proceso tiene derecho de escritura a cada byte del bloque de memoria especificado, devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

IsBadCodePtr, IsBadReadPtr, IsBadStringPtr

procedure var array begin if then else end procedure var begin if then else end of

LocalAlloc( uFlags: UINT; uBytes: UINT ): HLOCAL;

{atributos de reserva} {cantidad de bytes a reservar} {devuelve manejador de un objeto de memoria local}

La funcin LocalAlloc reserva el nmero de bytes solicitados del heap de Windows. La memoria reservada con esta funcin estar alineada a doble palabra, y puede constar de una cantidad de bytes superior a la especificada para facilitar la alineacin.

uFlags: Especifica cmo la memoria debe ser reservada. El valor por defecto es LMEM_FIXED, que es utilizado si este parmetro tiene el valor cero. Excepto cuando se indique lo contrario, a este parmetro pueden asignrsele uno o ms valores de la Tabla 9-10. uBytes: La cantidad de bytes a reservar.

Si la funcin tiene xito, devuelve el manejador del bloque de memoria local; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GlobalAlloc, LocalFree, LocalLock, LocalReAlloc, LocalSize

procedure type array var of

begin if end then begin

if begin end for begin end

nil then

to

do

if if not begin end

then and then

if end

then

LocalDiscard( h: THandle ): THandle

{manejador de memoria local a descartar} {devuelve manejador del objeto de memoria local}

La funcin LocalDiscard descarta el bloque de memoria especificado por el parmetro h. Un bloque de memoria puede ser descartado solamente si fue creado anteriormente con la opcin LMEM_DISCARDABLE. El contador de bloqueos de este objeto de memoria debe ser cero para que la funcin tenga xito. Despus que un objeto de memoria global es descartado, su manejador se mantiene vlido y puede ser utilizado en llamadas posteriores a LocalReAlloc.

h: El manejador del objeto de memoria a descartar.

Si la funcin tiene xito, devuelve un manejador del objeto de memoria local descartado; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

LocalAlloc, LocalReAlloc

Consulte el Listado 9-13, correspondiente a la funcin LocalReAlloc.

LocalFlags( hMem: HLOCAL ): UINT;

{manejador del objeto de memoria} {devuelve informacin de opciones y contador de bloqueos}

LocalFlags ofrece informacin acerca de las opciones de reserva y el valor del contador de bloqueos del objeto de memoria especificado.

hMem: Un manejador del objeto de memoria cuya informacin se desea recuperar.

Si la funcin tiene xito, devuelve un valor de 32 bits que indica el contador de bloqueos y las opciones de reserva del objeto de memoria especificado. El byte ms bajo de la palabra ms baja del resultado contiene el valor actual del contador de bloqueos del objeto de memoria especificado, y puede ser obtenido combinando el resultado de la funcin con la constante LMEM_LOCKCOUNT mediante el operador booleano and. El byte ms alto de la palabra ms baja del resultado contiene las opciones de reserva que se utilizaron al crear el objeto de memoria especificado, que pueden ser cero o cualquier combinacin de valores de la Tabla 9-11. Si la funcin falla, devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GlobalFlags, LocalAlloc, LocalDiscard, LocalLock, LocalReAlloc, LocalUnlock

Consulte el Listado 9-13, correspondiente a la funcin LocalReAlloc.

LocalFree( hMem: HLOCAL

{manejador del objeto de memoria a liberar}

): HLOCAL;

{devuelve cero o el manejador del objeto de memoria}

LocalFree libera el bloque de memoria especificado. Devuelve la memoria al heap e invalida el manejador. Esta funcin libera el objeto de memoria independientemente de cul sea el valor de su contador de bloqueos.

hMem: El puntero al bloque de memoria a devolver al sistema.

Si la funcin tiene xito, devuelve cero; en caso contrario devuelve el manejador del objeto de memoria local. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GlobalFree, LocalAlloc, LocalFlags, LocalLock, LocalReAlloc, LocalUnlock

Consulte el Listado 9-12, correspondiente a la funcin LocalAlloc, y el Listado 9-13, correspondiente a la funcin LocalReAlloc.

LocalHandle( Mem: Pointer ): HGLOBAL;

{puntero al inicio del bloque de memoria} {devuelve cero o el manejador del objeto de memoria}

LocalHandle convierte el puntero al bloque de memoria especificado por el parmetro Mem en un manejador de objeto de memoria local. Para los objetos de memoria reservados con la opcin LMEM_FIXED, las funciones LocalHandle y LocalLock no son necesarias, ya que el manejador y el puntero a memoria son el mismo valor. Cuando se utiliza LMEM_FIXED, el desarrollador es responsable de asegurarse de que todas las rutinas han terminado de utilizar el objeto de memoria cuando ste es liberado.

Mem: Puntero al primer byte del bloque de memoria cuyo manejador de memoria local se desea recuperar.

Si la funcin tiene xito, devuelve el manejador del objeto de memoria local; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

LocalAlloc, LocalLock, LocalFree

Consulte el Listado 9-13, correspondiente a la funcin LocalReAlloc.

LocalLock( hMem: HLOCAL ): Pointer;

{manejador del objeto de memoria} {devuelve un puntero al bloque de memoria}

LocalLock incrementa el contador de bloqueos del objeto de memoria especificado en uno, y fuerza a que el objeto de memoria sea mantenido en una direccin especfica de memoria. Un objeto de memoria que est bloqueado no ser movido a otra direccin por el gestor de memoria, excepto en el caso de llamadas a la funcin LocalReAlloc. La direccin devuelta por la funcin ser una direccin vlida del objeto de memoria mientras que el contador de bloqueos del objeto sea mayor o igual a uno. Varias rutinas pueden establecer bloqueos sobre un objeto, por lo que ste no ser movido en memoria mientras que alguna rutina est utilizando la memoria. El contador de bloqueos puede ser decrementado llamando a la funcin LocalUnlock. Cuando un objeto de memoria es reservado con la opcin LMEM_FIXED, siempre tendr un contador de bloqueos igual a cero, pero nunca ser movido en memoria.

hMem: Manejador de objeto de memoria cuyo puntero se desea recuperar.

Si la funcin tiene xito, devuelve un puntero al primer byte del bloque de memoria local; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

LocalAlloc, LocalFlags, LocalReAlloc, LocalUnlock

Consulte el Listado 9-12, correspondiente a la funcin LocalAlloc, y el Listado 9-13, correspondiente a la funcin LocalReAlloc.

LocalReAlloc( hMem: HLOCAL; uBytes: UINT; uFlags: UINT ): HLOCAL;

{manejador de objeto de memoria local} {tamao de objeto de memoria} {opciones de relocalizacin} {devuelve un manejador de objeto de memoria local}

Esta funcin se utiliza para cambiar el tamao o los atributos del objeto de memoria local especificado. Si esta funcin relocaliza un objeto de memoria fijo, el manejador de memoria local devuelto puede ser utilizado como un puntero al bloque de memoria.

hMem: Manejador del objeto de memoria local cuyo tamao o atributos se desean modificar. uBytes: El nuevo tamao del objeto de memoria local en bytes. Si el parmetro uFlags contiene la opcin LMEM_MODIFY, este parmetro es ignorado. uFlags: Especifica cmo el objeto de memoria local va a ser modificado. Este parmetro puede contener uno o ms de los valores descritos en la Tabla 9-12. Estos valores pueden combinarse con la constante LMEM_MODIFY, que modifica su comportamiento segn se describe en la tabla.

Si la funcin tiene xito, devuelve el manejador del objeto de memoria relocalizado; en caso contrario devuelve cero y el manejador original se mantiene vlido. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

LocalAlloc, LocalFree, LocalLock

function

stdcall

var

implementation

function procedure var begin

external

name

for begin

to

do

end

if

then

and

end

procedure var begin if then

if begin end

then

9
if begin end then

for begin end

to

do

if if

then not and then

if end

then

LocalSize( hMem: HLOCAL ): UINT;

{manejador del objeto de memoria} {devuelve el tamao del objeto de memoria en bytes}

Esta funcin devuelve el tamao del objeto de memoria especificado en bytes.

hMem: El manejador del objeto de memoria cuyo tamao se desea recuperar.

Si la funcin tiene xito, devuelve el tamao de objeto de memoria local especificado en bytes; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

LocalAlloc, LocalFlags, LocalReAlloc

Consulte el Listado 9-13, correspondiente a la funcin LocalReAlloc.

LocalUnlock( hMem: HLOCAL ): BOOL;

{manejador del objeto de memoria} {devuelve TRUE o FALSE}

LocalUnlock decrementa el contador de bloqueos de los objetos mviles en memoria, reservados con la opcin LMEM_MOVEABLE, y no tiene efecto alguno sobre los objetos fijos en memoria, reservados con la opcin LMEM_FIXED.

hMem: Manejador del objeto de memoria a desbloquear.

Si esta funcin tiene xito y el objeto sigue bloqueado despus de decrementar su contador, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError. Si GetLastError devuelve ERROR_SUCCESS, entonces el objeto de memoria no est bloqueado.

LocalAlloc, LocalFlags, LocalLock, LocalReAlloc

Consulte el Listado 9-12, correspondiente a la funcin LocalAlloc, y el Listado 9-13, correspondiente a la funcin LocalReAlloc.

MoveMemory( Destination: Pointer; Source: Pointer; Length: DWORD );

{puntero al bloque de memoria destino} {puntero al bloque de memoria origen} {tamao de bloque de memoria en bytes} {no devuelve nada}

MoveMemory copia el nmero de bytes solicitados de una direccin de memoria a otra. Es similar al procedimiento Move de Delphi, con la excepcin de que los parmetros de origen y destino estn en el orden inverso. Los bloques de memoria no tienen que comenzar o finalizar en una frontera especfica, pero todas las direcciones referenciadas debern pertenecer al rango de memoria asignado al proceso por el gestor de memoria. Los rangos de direcciones identificadas por los parmetros Source y Destination pueden solaparse.

Destination: La direccin de destino a la que la cantidad de memoria especificada ser copiada. Source: La direccin de origen a partir de la cual la cantidad de memoria especificada ser copiada. Length: La cantidad de bytes a copiar.

CopyMemory, FillMemory, ZeroMemory

var array implementation procedure var begin of

for

to

do

begin end end procedure var begin for begin to do

end end

VirtualAlloc( lpvAddress: Pointer; dwSize: DWORD; flAllocationType: DWORD; flProtect: DWORD ): Pointer;

{puntero a regin de memoria a reservar/comprometer} {tamao de la regin de memoria en bytes} {tipo de reserva} {tipo de proteccin de acceso} {devuelve un puntero a la memoria reservada}

VirtualAlloc se utiliza para reservar o comprometer una regin de pginas en el espacio de direcciones virtual del proceso. La memoria comprometida por VirtualAlloc es inicializada a cero. La regin ser reservada o comprometida de acuerdo a las opciones que se establezcan en el parmetro flAllocationType. Para comprometer una regin de memoria a almacenamiento fsico utilizando la opcin MEM_COMMIT, la aplicacin deber primero haberla reservado mediante la opcin MEM_RESERVE. Esto puede hacerse en dos llamadas sucesivas a VirtualAlloc para la misma regin de memoria. VirtualAlloc puede utilizarse para reservar un bloque grande de pginas, para luego comprometer en la medida de la necesidad trozos ms pequeos del bloque reservado, lo que permite a la aplicacin reservar memoria en su espacio de direcciones virtual sin consumir memoria fsica hasta que sea necesario.

lpvAddress: Puntero a la direccin de inicio de la regin de memoria virtual a reservar. A este parmetro se le debe asignar el valor devuelto previamente por una llamada anterior a VirtualAlloc si la regin de memoria virtual ha sido ya reservada y ahora se desea comprometer. El valor nil le permite a Windows determinar la direccin de inicio de la regin, que debe ser el mtodo ms utilizado. Si la direccin es especificada, ser redondeada por exceso a la siguiente frontera de pgina de 64 KB. dwSize: Especifica la cantidad de bytes a reservar o comprometer. La regin de pginas que se reservar incluye todas las pginas que contienen uno o ms bytes en el rango de memoria que va desde lpvAddress hasta lpvAddress + dwSize. Por lo tanto, un rango de memoria de dos bytes que cruce una frontera de pgina de 64 KB provocar que ambas pginas de 64 KB sean reservadas. Si el parmetro lpvAddress es nil, este valor es redondeado a la siguiente frontera de pgina de 64 KB. flAllocationType: Especifica el tipo de reserva a realizar. Este parmetro puede tomar uno o ms de los valores de la Tabla 9-13. flProtect: Especifica el tipo de proteccin de acceso a aplicar a la memoria virtual reservada. Este parmetro puede tomar uno de los valores de la Tabla 9-14.

Si la funcin tiene xito, devuelve un puntero a la direccin base de la regin de memoria reservada; en caso contrario devuelve nil. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GlobalAlloc, HeapAlloc, VirtualFree, VirtualLock, VirtualProtect, VirtualQuery

procedure type array var of

begin nil or if begin end nil then

case

of

end case of

end if not then

for begin end if not if not end

to

do

then then

procedure begin case

of

end end

VirtualFree( lpAddress: Pointer; dwSize: DWORD; dwFreeType: DWORD ): BOOL;

{puntero a la regin de memoria} {tamao de regin de memoria en bytes} {opciones} {devuelve TRUE o FALSE}

Esta funcin devuelve al espacio de direcciones virtual del proceso que hace la llamada la memoria previamente reservada mediante VirtualAlloc. Esta memoria estar disponible para su utilizacin en llamadas posteriores a las funciones de reserva de memoria. VirtualFree puede asimismo descomprometer una regin de memoria, marcndola como reservada hasta que vuelva a ser comprometida mediante una llamada posterior a VirtualAlloc. El estado de todas las pginas de la regin de memoria a liberar deber ser compatible con el tipo de operacin que se especifica en el parmetro dwFreeType.

lpAddress: Puntero a la regin de memoria a descomprometer o liberar. Si el parmetro dwFreeType tiene el valor MEM_RELEASE, este parmetro deber recibir el valor obtenido de la llamada a VirtualAlloc en la que se reserv inicialmente la regin de memoria. dwSize: El tamao de la regin a liberar en bytes. La regin que ser liberada incluir todas las pginas que contienen uno o ms bytes en el rango de memoria que va desde lpAddress hasta lpAddress + dwSize. Por lo tanto, un rango de memoria de dos bytes que cruce una frontera de pgina de 64 KB provocar que ambas pginas de 64 KB sean reservadas. Si el parmetro dwFreeType tiene el valor MEM_RELEASE, este parmetro deber ser cero. dwFreeType: Especifica el tipo de operacin a realizar. Este parmetro puede tomar uno de los valores de la Tabla 9-15.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GlobalAlloc, GlobalFree, VirtualAlloc

Consulte el Listado 9-15, correspondiente a la funcin VirtualAlloc, y la aplicacin SwapTest.Exe que puede descargar de http://editorial.danysoft.com.

VirtualProtect( lpAddress: Pointer; dwSize: DWORD;

{puntero a la regin de memoria} {tamao de la regin en bytes}

flNewProtect: DWORD lpflOldProtect: Pointer ): BOOL;

{proteccin de acceso solicitada} {puntero a variable que recibe la proteccin anterior} {devuelve TRUE o FALSE}

VirtualProtect modifica los atributos de proteccin de la regin de memoria especificada. La regin de memoria entera deber estar comprometida a almacenamiento fsico.

lpAddress: Puntero a la direccin base de la regin de memoria cuyos atributos de proteccin de acceso se desea cambiar. Cada pgina de esta regin deber haber sido reservada mediante una nica llamada a VirtualAlloc. dwSize: Especifica el tamao de la regin apuntada por el parmetro lpAddress en bytes. La regin cuyos atributos sern modificados incluir todas las pginas que contienen uno o ms bytes en el rango de memoria que va desde lpAddress hasta lpAddress + dwSize. Por lo tanto, un rango de memoria de dos bytes que cruce una frontera de pgina de 64 KB provocar que ambas pginas de 64 KB sean modificadas. flNewProtect: Especifica el nuevo tipo de proteccin de acceso a aplicar a la regin de memoria virtual especificada. Este parmetro puede tomar uno de los valores de la Tabla 9-16. lpflOldProtect: Puntero a una variable que recibir el valor del tipo de proteccin de acceso que estaba en vigor antes de la llamada.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

VirtualAlloc

Consulte el Listado 9-15, correspondiente a la funcin VirtualAlloc.

VirtualQuery( lpAddress: Pointer; {puntero a la regin de memoria} var lpBuffer: TMemoryBasicInformation; {puntero a TMemoryBasicInformation} dwLength: DWORD {tamao del registro de informacin} ): DWORD; {devuelve la cantidad de bytes del registro}

VirtualQuery ofrece informacin acerca de un rango de pginas reservadas del espacio de direcciones virtual del proceso actual. VirtualQuery examina la primera pgina de memoria especificada por el parmetro lpAddress, buscando las siguientes pginas consecutivas que coinciden en atributos, hasta que se encuentre una pgina cuyos atributos no coincidan o se llegue al final de la memoria reservada. Entonces la funcin devuelve la cantidad de memoria consecutiva encontrada con los mismos atributos.

lpAddress: Puntero a la direccin base de la regin de memoria sobre la que se desea recuperar informacin. El valor se redondea por exceso a la siguiente frontera de 64 KB. lpBuffer: Puntero a un registro de tipo TMemoryBasicInformation que recibe la informacin relativa al rango de pginas especificado. El registro TMemoryBasicInformation se define de la siguiente forma: TMemoryBasicInformation = record BaseAddress : Pointer; AllocationBase : Pointer; AllocationProtect : DWORD; RegionSize : DWORD; State : DWORD; Protect : DWORD; Type_9 : DWORD; end; {puntero a la regin de memoria} {direccin base de la regin de memoria} {tipo de proteccin de acceso inicial} {tamao de la regin} {opciones de estado} {opciones de proteccin de acceso} {opciones de tipo de pgina}

BaseAddress: Puntero a la regin de pginas que se interroga. AllocationBase: Puntero a la direccin base de la regin de memoria, segn ha sido devuelta por la llamada a VirtualAlloc mediante la cual se reserv originalmente la regin. La direccin apuntada por el campo BaseAddress estar contenida en esa regin. AllocationProtect: Especifica los atributos de proteccin de acceso de la regin, segn fueron definidos originalmente. Consulte la funcin VirtualAlloc para ver los posibles atributos de proteccin de acceso.

RegionSize: Especifica el tamao en bytes de la regin de pginas que tienen atributos idnticos, comenzando en la direccin especificada por el campo BaseAddress. State: Especifica el estado de las pginas dentro de la regin examinada, y puede tomar uno de los valores de la Tabla 9-17. Protect: Especifica los atributos de proteccin de acceso actuales de la regin. Consulte la funcin VirtualAlloc para ver la lista de los posibles atributos de proteccin de acceso. Type_9: Especifica el tipo de pginas dentro de la regin especificada, y puede tomar uno de los valores de la Tabla 9-18. dwLength: Especifica el tamao del registro TMemoryBasicInformation en bytes, y debe ser inicializado con el valor de SizeOf(TMemoryBasicInformation).

Si la funcin tiene xito, devuelve la cantidad de bytes copiados al registro de tipo TMemoryBasicInformation; en caso contrario devuelve cero.

GetSystemInfo, VirtualAlloc, VirtualProtect

Consulte el Listado 9-15, correspondiente a la funcin VirtualAlloc.

ZeroMemory( Destination: Pointer; Length: DWORD );

{puntero a bloque de memoria} {tamao de bloque de memoria} {no devuelve nada}

ZeroMemory rellena con un cero cada byte del bloque de memoria especificado.

Destination: Puntero al bloque de memoria cuyo contenido se desea poner a cero. Length: El tamao del bloque de memoria apuntado por el parmetro Destination.

CopyMemory, FillMemory, MoveMemory

procedure var begin for begin end to do

end procedure var begin

for begin end end

to

do

Compartir informacin entre las aplicaciones activas permite al usuario de Windows ser ms productivo. La informacin puede ser preparada utilizando una aplicacin, como por ejemplo un programa de dibujo, para luego ser copiada y pegada hacia otra aplicacin, como por ejemplo un procesador de textos. La posibilidad de copiar y pegar informacin de una aplicacin a otra es una exigencia comn de los usuarios actuales de Windows, y las funciones de manipulacin del portapapeles ofrecen los mecanismos para implementar esa funcionalidad.

10
El portapapeles es poco ms que un entorno que ofrece el sistema para el almacenamiento y recuperacin de datos. Puede concebirse como un grupo de bandejas de almacenamiento, cada una de las cuales contiene un manejador de cierta informacin en un formato especfico. El portapapeles soporta varios formatos predefinidos para almacenar informacin de varios tipos, como grficos o texto, pero las aplicaciones pueden definir sus propios formatos. Los formatos predefinidos se listan en la descripcin correspondiente a las funciones GetClipboardData y SetClipboardData. Para colocar informacin en el portapapeles, una aplicacin debe inicialmente llamar a la funcin OpenClipboard. A continuacin deber llamar a la funcin EmptyClipboard, que elimina toda la informacin situada en el portapapeles en cada uno de los formatos, y asigna la propiedad del portapapeles a la ventana cuyo manejador se suministra en el parmetro hWndNewOwner de la llamada a OpenClipboard. En tercer lugar, la aplicacin debe llamar a SetClipboardData, pasndole una opcin que indique el formato asociado con el tipo de datos a colocar en el portapapeles, y el manejador de los datos en s. Una llamada a CloseClipboard completa la operacin. Cuando una aplicacin desea acceder a la informacin situada en el portapapeles, debe utilizar la funcin GetClipboardData, pasndole como parmetro una opcin que indique el

formato de los datos que desea recuperar; si existen datos de ese formato especfico en el portapapeles, la aplicacin recibir el manejador de los datos. Cuando una aplicacin coloca datos en el portapapeles, deber colocarlos en tantos formatos diferentes como tenga sentido. Ello permitir que un rango ms amplio de aplicaciones pueda recuperar esa informacin. Por ejemplo, un procesador de textos puede colocar texto en el portapapeles en un formato propietario que l utiliza internamente; colocar el texto adicionalmente en los formatos CF_UNICODETEXT y CF_TEXT permitir a otras aplicaciones Windows, tales como el Bloc de Notas, recuperar la informacin en un formato que ellas entienden. Si el procesador de textos coloca el texto en el portapapeles slo en el formato propietario, nicamente l ser capaz de recuperarlo.

Windows ofrece mecanismos de conversin de un formato a otro para muchos de los formatos predefinidos del portapapeles. Esta conversin es llevada a cabo al vuelo, en el momento necesario, y es transparente a la aplicacin. Cuando ciertos datos son colocados en el portapapeles en un formato para el que existe una conversin, cualquier aplicacin podr solicitar los datos en el formato deseado llamando a la funcin GetClipboardData sin necesidad de ningn tratamiento adicional. La siguiente tabla lista las conversiones de formato disponibles para cada plataforma.

Almacenar grandes cantidades de informacin en el portapapeles, tales como objetos del GDI o grficos, puede consumir tiempo y gran cantidad de recursos. Afortunadamente, Windows permite a las aplicaciones utilizar la tcnica que se conoce

como entrega demorada (delayed rendering). Para iniciar la entrega demorada, una aplicacin pasa un valor cero en el parmetro hMem de la funcin SetClipboardData. El portapapeles se comportar como si contuviera datos en el formato especificado, pero slo cuando una aplicacin solicite los datos, Win dows enviar el mensaje WM_RENDERFORMAT o WM_RENDERALLFORMATS al propietario del portapapeles (la aplicacin que inici la entrega demorada). Dentro de los gestores de esos mensajes la aplicacin deber preparar la informacin necesaria y llamar a la funcin SetClipboardData, pasndole esta vez el manejador de la informacin. Esta tcnica es til si la aplicacin soporta muchos formatos diferentes de datos complejos, ya que no tendr que preocuparse por entregar los datos en cada formato al portapapeles. El siguiente ejemplo ilustra la utilizacin de la entrega demorada.

type class

private public procedure message procedure message end record array end var of var var

10

implementation

procedure begin end procedure begin

end procedure var begin if begin then or

end else inherited end

procedure var begin

String

end procedure begin inherited end var

10

Una ventana puede registrarse ante el sistema como visor del portapapeles llamando a la funcin SetClipboardViewer. El objetivo de un visor de portapapeles es simplemente mostrar el contenido del portapapeles; nunca deber modificar el contenido del portapapeles en ningn modo, ni dejar los datos que recupera del portapapeles en un estado bloqueado. Windows mantiene una lista de visores de portapapeles llamada la cadena de visores (clipboard viewer chain), y cuando una ventana llama a la funcin SetClipboardViewer, la ventana es colocada en el tope de esa cadena. Un visor del portapapeles recibir el mensaje WM_DRAWCLIPBOARD cuando el contenido del portapapeles cambie, y el mensaje WM_CHANGECBCHAIN cuando una ventana haya sido aadida o eliminada de la cadena de visores del portapapeles. Cuando el visor del portapapeles recibe uno de estos mensajes, debe pasar el mensaje a los otros visores de la cadena. Consulte la funcin SetClipboardViewer para ver un ejemplo de cmo registrar un visor del portapapeles.

Este captulo cubre las siguientes funciones de manipulacin del portapapeles:

ChangeClipboardChain( hWndRemove: HWND; hWndNewNext:HWND ): BOOL;

{manejador de la ventana a eliminar} {manejador de la ventana siguiente} {devuelve TRUE o FALSE}

Esta funcin elimina la ventana identificada por el parmetro hWndRemove de la cadena de visores del portapapeles. La ventana identificada por el parmetro hWndNewNext pasa a ocupar la posicin de la ventana que se va a eliminar en la cadena de visores. Al parmetro hWndNewNext deber asignrsele el valor devuelto por la llamada a SetClipboardViewer que insert a la ventana hWndRemove en la cadena. ChangeClipboardChain provoca que el mensaje WM_CHANGECBCHAIN sea enviado a la primera ventana en la cadena de visores del portapapeles.

hWndRemove: Manejador de la ventana que se desea eliminar de la cadena de visores del portapapeles. hWndNewNext: Manejador de la siguiente ventana en la cadena de visores del portapapeles.

Esta funcin devuelve el resultado de la gestin del mensaje WM_CHANGECBCHAIN por las ventanas siguientes en la cadena de visores del portapapeles. Generalmente esas ventanas devolvern FALSE al procesar el mensaje. Esta funcin devolver TRUE si slo hay una ventana en la cadena de visores del portapapeles.

SetClipboardViewer, WM_CHANGECBCHAIN

10

Consulte el Listado 10-6, correspondiente a la funcin SetClipboardViewer.

CloseClipboard: BOOL;

{devuelve TRUE o FALSE}

Esta funcin cierra el portapapeles despus de que una aplicacin lo ha abierto mediante una llamada a OpenClipboard. El portapapeles deber cerrarse para que otras aplicaciones puedan acceder a l.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetOpenClipboardWindow, OpenClipboard

Consulte el Listado 10-5, correspondiente a la funcin SetClipboardData, y el Listado 10-6, correspondiente a la funcin SetClipboardViewer.

CountClipboardFormats: Integer; {devuelve la cantidad de formatos en el portapapeles}

Esta funcin devuelve la cantidad de formatos en los que hay datos actualmente en el portapapeles.

Si la funcin tiene xito, devuelve la cantidad de formatos en los que hay datos actualmente en el portapapeles; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

EnumClipboardFormats, RegisterClipboardFormat

Consulte el Listado 10-2, correspondiente a EnumClipboardFormats.

EmptyClipboard: BOOL;

{devuelve TRUE o FALSE}

Esta funcin vaca el portapapeles, liberando cualquier dato que est almacenado en l. El portapapeles debe haber sido abierto anteriormente mediante una llamada a la funcin OpenClipboard. Una vez que el portapapeles es vaciado, esta funcin asigna la propiedad del portapapeles a la ventana pasada como parmetro a la funcin OpenClipboard. Si la aplicacin pasa un valor cero a OpenClipboard como manejador de la ventana, esta funcin tendr xito pero al portapapeles no se le asignar propietario.

Si esta funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

OpenClipboard, SetClipboardData, WM_DESTROYCLIPBOARD

Consulte el Listado 10-5, correspondiente a la funcin SetClipboardData.

EnumClipboardFormats( format: UINT ): UINT;

{ID de formato del portapapeles disponible} {devuelve el ID del siguiente formato disponible}

Esta funcin devuelve los formatos de datos del portapapeles que estn actualmente disponibles en l. Los formatos se enumeran en el orden en el que fueron colocados en el portapapeles. Para comenzar la enumeracin, asigne cero al parmetro format y llame a la funcin. Esto devolver el primer formato disponible en el portapapeles. A continuacin, llame a la funcin EnumClipboardFormats de nuevo, pasando en el parmetro format el valor devuelto por la llamada anterior. El bucle debe interrumpirse cuando EnumClipboardFormats devuelva cero. El portapapeles debe haber sido abierto mediante una llamada a OpenClipboard para que la enumeracin pueda comenzar. En el caso de los formatos del portapapeles que ofrecen conversin de tipo automtica, cada formato de portapapeles que se enumere ir seguido por los formatos a los que l puede ser convertido.

10

format: Especifica un identificador de formato del portapapeles. Para conocer la lista de los posibles formatos del portapapeles, consulte la funcin SetClipboardData.

Si la funcin tiene xito, devuelve el identificador del siguiente formato del portapapeles disponible; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError. Si no quedan ms formatos del portapapeles por enumerar, la funcin tendr xito, pero devolver cero; en ese caso, GetLastError devolver ERROR_SUCCESS.

CountClipboardFormats, GetClipboardData, OpenClipboard, RegisterClipboardFormat, SetClipboardData

procedure const array of string

var array begin of

while begin

do

if else

then

end

end

10
GetClipboardData( uFormat: UINT ): THandle; {identificador de formato del portapapeles} {manejador de datos en el portapapeles}

Esta funcin recupera los datos colocados en el portapapeles en el formato especificado por el parmetro uFormat. Los datos son devueltos en forma de manejador de memoria global. Ese manejador pertenece al portapapeles, y no debe ser liberado o dejado en estado bloqueado por la aplicacin. Consecuentemente, la aplicacin deber hacer una copia de los datos inmediatamente despus de recibir el manejador. Si los datos situados en el portapapeles estn en un formato para el que el sistema operativo ofrece una conversin al formato solicitado, el sistema lo convierte automticamente en el momento (por ejemplo, los datos de tipo CF_OEMTEXT pueden ser recuperados como CF_TEXT).

uFormat: Especifica un identificador de formato del portapapeles. Puede tomar uno de los valores de la Tabla 10-3.

Si la funcin tiene xito, devuelve el manejador de los datos recuperados del portapapeles en el formato especificado; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

EnumClipboardFormats, SetClipboardData

Consulte el Listado 10-5, correspondiente a la funcin SetClipboardData.

10

El registro TMetafilePict se define de la siguiente forma:

TMetafilePict = packed record mm: LongInt; xExt: LongInt; yExt: LongInt; hMF: HMETAFILE; end;

{modo de mapeo} {ancho del metafichero} {altura del metafichero} {manejador del metafichero}

Para ver una descripcin detallada de esta estructura de datos, consulte la funcin SetClipboardData.

GetClipboardFormatName( format: UINT; lpszFormatName: PChar; cchMaxCount: Integer ): Integer;

{identificador de formato del portapapeles} {puntero a buffer que recibir nombre del formato} {tamao del buffer lpszFormatName} {devuelve la cantidad de caracteres copiados al buffer}

Esta funcin recupera el nombre de un formato del portapapeles registrado, almacenndolo en el buffer apuntado por el parmetro lpszFormatName. Esta funcin slo recupera los nombres de formato para los formatos del portapapeles registrados mediante la funcin RegisterClipboardFormat, y devuelve cero para los formatos del portapapeles predefinidos.

format: Especifica un identificador de formato del portapapeles definido por el usuario devuelto por la funcin RegisterClipboardFormat. lpszFormatName: Puntero a un buffer que recibir el nombre del formato del portapapeles registrado. cchMaxCount: Especifica la cantidad mxima de caracteres a copiar al buffer apuntado por el parmetro lpszFormatName. Los caracteres que sobrepasen este lmite sern truncados.

Si la funcin tiene xito, devuelve la cantidad de caracteres copiados al buffer apuntado por el parmetro lpszFormatName. Si la funcin falla, o el formato especificado es uno de los formatos del portapapeles predefinidos, devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

EnumClipboardFormats, RegisterClipboardFormat

Consulte el Listado 10-2, correspondiente a EnumClipboardFormats.

GetClipboardOwner: HWND;

{devuelve un manejador de ventana}

Esta funcin recupera el manejador de la ventana que es propietaria del portapapeles. El propietario del portapapeles es generalmente la ltima ventana que coloc datos en el portapapeles. La funcin EmptyClipboard puede reasignar el propietario del portapapeles a cero, indicando que el portapapeles no tiene propietario. El portapapeles puede contener datos aunque no tenga propietario.

Si la funcin tiene xito, devuelve un manejador de la ventana que actualmente es propietaria del portapapeles. Si la funcin falla, o el portapapeles no tiene propietario, la funcin devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

10

EmptyClipboard, GetClipboardViewer

Consulte el Listado 10-6, correspondiente a la funcin SetClipboardViewer.

GetClipboardViewer: HWND;

{devuelve el manejador de una ventana}

Esta funcin devuelve el manejador del primer visor del portapapeles en la cadena de visores del portapapeles.

Si esta funcin tiene xito, devuelve el manejador de la primera ventana en la cadena de visores del portapapeles. Si la funcin falla, o no hay visores del portapapeles, devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetClipboardOwner, SetClipboardViewer

Consulte el Listado 10-6, correspondiente a la funcin SetClipboardViewer.

GetOpenClipboardWindow: HWND;

{devuelve un manejador de ventana}

Esta funcin devuelve un manejador de la ventana que ha abierto el portapapeles y an no lo ha cerrado.

Si esta funcin tiene xito, devuelve un manejador de la ventana que tiene abierto el portapapeles. Si la funcin falla, el portapapeles no est abierto, o el portapapeles est abierto pero no est asociado a ninguna ventana, esta funcin devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetClipboardOwner, GetClipboardViewer, OpenClipboard

procedure var array begin of

string

end

GetPriorityClipboardFormat( var paFormatPriorityList; {puntero a array de identificadores de formato} cFormats: Integer {nmero de entradas en paFormatPriorityList} ): Integer; {devuelve el primer formato que contiene datos}

Esta funcin devuelve el identificador de formato de portapapeles del primer formato en el array apuntado por el parmetro paFormatPriorityList para el cual hay datos disponibles en el portapapeles. Los valores en el array paFormatPriorityList debern ordenarse segn el orden de importancia.

paFormatPriorityList: Puntero a un array de identificadores de formatos del portapapeles. Consulte la funcin SetClipboardData para ver una lista de los identificadores de formatos predefinidos. cFormats: Especifica la cantidad de entradas en el array apuntado por el parmetro paFormatPriorityList.

10

Si la funcin tiene xito, devuelve el identificador del primer formato del portapapeles en la lista para el que hay datos disponibles en el portapapeles. Si el portapapeles contiene datos, pero stos no estn en ninguno de los formatos de la lista, la funcin devuelve 1. Si la funcin falla o el portapapeles est vaco, devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CountClipboardFormats, EnumClipboardFormats, GetClipboardFormatName, IsClipboardFormatAvailable, RegisterClipboardFormat, SetClipboardData

Consulte el Listado 10-4, correspondiente a IsClipboardFormatAvailable.

IsClipboardFormatAvailable( format: UINT ): BOOL;

{identificador de formato del portapapeles} {devuelve TRUE o FALSE }

Esta funcin determina si el portapapeles contiene actualmente datos en el formato especificado por el parmetro format. Si una aplicacin tiene un elemento de men Pegar, entonces puede utilizar esta funcin para determinar si el elemento de men debe estar habilitado o deshabilitado, en caso de que la aplicacin soporte slo ciertos formatos del portapapeles.

format: Especifica el identificador de formato del portapapeles. Para ver una lista de los posibles formatos del portapapeles, consulte la funcin SetClipboardData.

Si esta funcin tiene xito y el portapapeles contiene datos en el formato especificado, la funcin devuelve TRUE. Si la funcin falla o el portapapeles no contiene datos en el formato especificado, devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CountClipboardFormats, EnumClipboardFormats, GetPriorityClipboardFormat, OpenClipboard, RegisterClipboardFormat, SetClipboardData

procedure const array of

begin if then

if else end

then

10
OpenClipboard( hWndNewOwner: HWND ): BOOL; {manejador de la ventana que abre el portapapeles} {devuelve TRUE o FALSE}

Esta funcin abre el portapapeles, preparndolo para su examen o modificacin. El portapapeles slo puede ser abierto por una ventana a la vez. El portapapeles debe ser cerrado mediante una llamada a la funcin CloseClipboard para que otra ventana pueda tener acceso a l.

hWndNewOwner: Manejador de la ventana que ser asociada al portapapeles. Si el valor de este parmetro es cero, el portapapeles ser abierto, pero no ser asociado a ninguna ventana.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CloseClipboard, EmptyClipboard

Consulte el Listado 10-5, correspondiente a la funcin SetClipboardData, y el Listado 10-6, correspondiente a la funcin SetClipboardViewer.

RegisterClipboardFormat( lpszFormat: PChar ): UINT;

{puntero a cadena de caracteres terminada en nulo} {devuelve el nuevo identificador de formato}

Esta funcin registra un formato del portapapeles definido por la aplicacin, y devuelve un valor en el rango entre $C000 y $FFFF. Este nuevo identificador de formato puede ser utilizado para colocar datos especficos de la aplicacin en el portapapeles. Si el formato registrado ya existe, esta funcin simplemente devuelve el identificador del formato del portapapeles registrado, permitiendo a dos aplicaciones que registren el mismo formato para compartir datos a travs del portapapeles.

lpszFormat: Puntero a cadena de caracteres terminada en nulo (y sensible a diferencias entre maysculas y minsculas) que contiene el nombre del nuevo formato del portapapeles.

Si la funcin tiene xito, devuelve el identificador del nuevo formato del portapapeles; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CountClipboardFormats, EnumClipboardFormats, GetClipboardFormatName

Consulte el Listado 10-5, correspondiente a la funcin SetClipboardData.

SetClipboardData( uFormat: UINT; hMem: THandle ): THandle;

{identificador de formato del portapapeles} {manejador de datos a copiar al portapapeles} {devuelve el manejador de los datos}

Esta funcin copia los datos identificados por el parmetro hMem al portapapeles en el formato especificado por el parmetro uFormat. La ventana que copia los datos deber inicialmente abrir el portapapeles utilizando OpenClipboard, y luego vaciarlo mediante EmptyClipboard antes de llamar a la funcin SetClipboardData. Sin embargo, si la aplicacin est respondiendo a un mensaje WM_RENDERFORMAT o WM_RENDERALLFORMATS, no debe llamar a la funcin OpenClipboard y puede llamar directamente a SetClipboardData.

uFormat: Especifica el identificador de formato del portapapeles de los datos a copiar al portapapeles. Este parmetro puede contener un formato del portapapeles definido por el usuario (devuelto por la funcin RegisterClipboardFormat), o uno de los formatos del portapapeles predefinidos, que se listan en la Tabla 10-4. hMem: Manejador de los datos a copiar al portapapeles. Si este manejador identifica a un objeto de memoria, el objeto de memoria debe haber sido reservado mediante una llamada a la funcin GlobalAlloc utilizando las opciones GMEM_MOVEABLE y GMEM_DDESHARE. Si el valor de este parmetro es cero, el portapapeles indicar que los datos en el formato especificado existen, aunque stos no hayan sido colocados en el portapapeles. Cuando una aplicacin intente recuperar esos datos del portapapeles, la aplicacin original recibir un mensaje WM_RENDERFORMAT o WM_RENDERALLFORMATS. La aplicacin deber tratar esos mensajes, llamando entonces a la funcin SetClipboardData con un valor real en el parmetro hData.

10

Si la funcin tiene xito, devuelve el manejador de los datos que se copian al portapapeles; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CloseClipboard, EmptyClipboard, GetClipboardData, GlobalAlloc, OpenClipboard, RegisterClipboardFormat, WM_RENDERFORMAT, WM_RENDERALLFORMATS

record array end var of

implementation procedure begin end procedure var begin or

end

procedure begin inherited end procedure var begin

var

string

10
end

10

El registro TMetafilePict se define de la siguiente forma: TMetafilePict = packed record mm: LongInt; xExt: LongInt; yExt: LongInt; hMF: HMETAFILE; end; {modo de mapeo} {ancho del metafichero} {altura del metafichero} {manejador del metafichero}

mm: Especifica el modo de mapeo en el que el metafichero ha sido dibujado. xExt: Especifica el ancho del rectngulo dentro del cual el metafichero ha sido dibujado, en unidades correspondientes al modo de mapeo especificado. yExt: Especifica la altura del rectngulo dentro del cual el metafichero ha sido dibujado, en unidades correspondientes al modo de mapeo especificado. hMF: Manejador del metafichero en memoria.

SetClipboardViewer( hWndNewViewer: HWND {manejador de nuevo visor del portapapeles} ): HWND; {devuelve el manejador del siguiente visor en la cadena}

Esta funcin aade la ventana especificada por el parmetro hWndNewViewer a la cadena de visores del portapapeles. Una ventana registrada como visor del portapapeles recibir el mensaje WM_DRAWCLIPBOARD cada vez que cambie el contenido del portapapeles, y el mensaje WM_CHANGECBCHAIN cuando alguna otra ventana sea insertada o eliminada de la cadena de visores del portapapeles. Estos mensajes deben ser enviados a la siguiente ventana de la cadena, cuyo manejador es devuelto por la funcin SetClipboardViewer, despus que hayan sido tratados por el visor del portapapeles actual. Cuando deja de ser necesario, un visor del portapapeles debe eliminarse a s mismo de la cadena de visores mediante una llamada a la funcin ChangeClipboardChain.

hWndNewViewer: Manejador de la ventana del nuevo visor del portapapeles que se desea aadir a la cadena de visores del portapapeles.

Si la funcin tiene xito, devuelve el manejador de la siguiente ventana en la cadena de visores del portapapeles. Si la funcin falla, o no hay ms ventanas en la cadena de visores del portapapeles, la funcin devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

ChangeClipboardChain, GetClipboardViewer, WM_CHANGECBCHAIN, WM_DRAWCLIPBOARD

class

procedure procedure private procedure message var

public end var

implementation procedure var array begin if then begin or of

10
String

if begin if raise then

then

end

if begin if raise then

then

end

end

end procedure var array begin of

if begin end else

then string

end procedure begin end

Windows tiene la responsabilidad de ofrecer servicios de entrada a las aplicaciones desde una amplia gama de dispositivos de entrada, que incluye el teclado, el ratn y la palanca de juegos (joystick). Los dispositivos de entrada son recursos compartidos. Windows realiza razonablemente bien la tarea de dirigir la entrada del usuario a la aplicacin correcta en un entorno de multitarea. Al mismo tiempo, una aplicacin puede lograr cierto grado de control sobre los dispositivos de entrada.

Windows ofrece servicios para la gestin de la entrada desde teclado en el contexto de los conjuntos de caracteres internacionales. El programador puede hacer que una aplicacin cargue, descargue o seleccione una configuracin de teclado. El API ofrece funciones para traducir los caracteres de teclado en el contexto de la configuracin de teclado activa en teclas virtuales. El estado del teclado puede ser consultado para conocer qu combinacin de teclas pudo haber sido pulsada por el usuario. El estado del teclado, unido a los cdigos de tecla virtual, dan al programador la posibilidad de implantar una aplicacin lista para su utilizacin en diferentes pases. El sistema operativo se hace cargo de una buena parte del trabajo de traduccin de bajo nivel. El teclado puede ser emulado mediante la funcin keybd_event. Esta funcin genera los mismos mensajes de Windows que el sistema producira a partir de pulsaciones reales. Los mensajes de teclado son enviados normalmente a la ventana que tiene el foco.

11

El ratn es otro dispositivo compartido que es monitorizado y gestionado por Windows. La actividad del ratn se informa normalmente a la ventana que est situada directamente debajo del cursor del ratn. Sin embargo, una aplicacin puede asignar o capturar la actividad del ratn, momento a partir del cual los mensajes del ratn irn a una ventana de captura. Este comportamiento se mantendr hasta que se libere la captura del ratn.

La funcin del API ClipCursor permite restringir el movimiento del ratn a un rea rectangular determinada de la pantalla. Una aplicacin que asuma tal control sobre un recurso del sistema tan valioso como el ratn deber asegurarse de liberar el dispositivo cuando sea apropiado. La actividad del ratn puede ser simulada de modo similar a como se emula el teclado. Consulte el programa de ejemplo que se ofrece con la funcin mouse_event. Usando esta funcin es posible sintetizar el movimiento, posicin y la pulsacin de los botones del ratn. Puede ser ms sencillo controlar el ratn desde el cdigo utilizando la funcin mouse_event que enviando mensajes de ratn a una ventana de destino. Las funciones de entrada que ofrecen simulacin pueden utilizarse para crear programas de enseanza o entrenamiento. Al ser capaz de simular pulsaciones de teclas o eventos del ratn, una aplicacin puede mostrar al usuario cmo ella misma u otras aplicaciones funcionan. El hecho de ver al cursor del ratn moverse por la pantalla a instancias de un programa puede tener un gran impacto en la efectividad del entrenamiento. La simulacin del ratn puede utilizarse tambin para ofrecer indicaciones u otros servicios de interfaz de usuario, segn las necesidades de la aplicacin.

En este captulo se describen en detalle las siguientes funciones de entrada:

11

ActivateKeyboardLayout( klh: HKL; flags: UINT ): HKL;

{manejador de configuracin de teclado} {opciones de activacin} {devuelve manejador anterior}

La funcin ActivateKeyboardLayout activa la configuracin de teclado identificada por el manejador de configuracin de teclado especificado. Bajo Windows 95/98, esta llamada afecta al hilo actual. Bajo Windows NT, afecta a todos los hilos.

klh: El manejador de configuracin de teclado. Este manejador puede obtenerse llamando a LoadKeyboardLayout o GetKeyboardLayoutList. Este parmetro puede tambin recibir los valores HKL_NEXT o HKL_PREV que se refieren, respectivamente, a la entrada siguiente o anterior en la lista de configuraciones de teclado. flags: Especifica las opciones de configuracin de teclado, y puede tomar uno de los valores de la Tabla 11-2.

Si esta funcin tiene xito, devuelve el manejador de la configuracin de teclado anterior. Si la funcin falla, devuelve cero, indicando que no se encontr la configuracin de teclado. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetKeyboardLayoutList, LoadKeyboardLayout, UnloadKeyboardLayout

Consulte el Listado 11-6, correspondiente a la funcin LoadKeyboardLayout.

ClipCursor( lpRect: PRect ): BOOL;

{especifica la regin rectangular de confinamiento} {devuelve TRUE o FALSE}

La funcin ClipCursor limita los movimientos del ratn a la regin rectangular especificada por el parmetro lpRect. Esto afectar al movimiento del cursor en todas las aplicaciones hasta que las coordenadas rectangulares originales sean restauradas. Para guardar las coordenadas originales, utilice la funcin GetClipCursor. Despus que el cursor haya sido confinado a una regin mediante ClipCursor, cualquier llamada a la funcin SetCursorPos devolver resultados basados en las coordenadas del rectngulo al que el ratn est confinado.

lpRect: Apunta a un registro TRect que especifica las coordenadas de la regin de confinamiento del ratn. Si este parmetro es nil, el cursor podr moverse libremente a donde quiera.

Si esta funcin tiene xito devuelve TRUE, en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetClipCursor

Consulte el Listado 11-10, correspondiente a la funcin SwapMouseButton.

DragDetect( p1: HWND; p2: TPoint ): BOOL;

{manejador de ventana que recibe la entrada del ratn} {posicin inicial del ratn} {devuelve TRUE o FALSE}

11

La funcin DragDetect captura los mensajes del ratn y recibe las coordenadas del cursor hasta que el botn izquierdo del ratn sea liberado, la tecla Esc sea pulsada, o el cursor salga de los lmites del rectngulo de arrastre situado alrededor del punto especificado a travs del parmetro p2. Las especificaciones del rectngulo de arrastre pueden obtenerse llamando a la funcin del API GetSystemMetrics.

p1: Manejador de la ventana que recibe la entrada del ratn. p2: Posicin del ratn en coordenadas relativas a la pantalla.

Si esta funcin tiene xito, y el ratn se mueve dentro del rectngulo de arrastre mientras se est pulsando el botn izquierdo del ratn, la funcin devuelve TRUE; en caso contrario devuelve FALSE.

GetSystemMetrics

procedure var begin

while begin

do

end end procedure begin end procedure begin end

GetAsyncKeyState( vKey: Integer ): SHORT;

{cdigo de tecla virtual} {cdigo de estado de tecla}

Esta funcin determina si la tecla indicada por el cdigo de tecla virtual especificado en el parmetro vKey est pulsada o no en el momento de la llamada. Asimismo determina si la tecla ha sido pulsada despus de la llamada anterior a GetAsyncKeyState. Esta funcin tambin trabaja con los botones del ratn, pero devuelve el estado de los botones fsicos del ratn, independientemente del mapeo lgico de esos botones.

11

vKey: Especifica un cdigo de tecla virtual.

Si esta funcin tiene xito, y el bit ms significativo del valor devuelto est activo, la tecla especificada estaba pulsada en el momento de la llamada a funcin. Si el bit menos significativo est activo, la tecla ha sido pulsada despus de la llamada anterior a GetAsyncKeyState. Si la funcin falla, o una ventana de otro hilo tiene el foco, devuelve cero.

GetKeyboardState, GetKeyState, GetSystemMetrics, MapVirtualKey, SetKeyboardState

Consulte el Listado 11-7, correspondiente a la funcin MapVirtualKey.

GetCapture: HWND; {devuelve el manejador de la ventana que posee la captura}

La funcin GetCapture determina qu ventana tiene capturado el ratn. Slo una ventana puede tener el ratn asignado a ella, y la entrada del ratn ser enviada a esa ventana, independientemente de la posicin del cursor del ratn en la pantalla.

Si esta funcin tiene xito, y una ventana del hilo actual tiene asignada la captura del ratn, devuelve un manejador de la ventana que tiene la captura del ratn; en caso contrario devuelve cero.

ReleaseCapture, SetCapture

Consulte el Listado 11-10, correspondiente a la funcin SwapMouseButton.

GetCaretBlinkTime: UINT; {devuelve el intervalo de parpadeo en milisegundos}

La funcin GetCaretBlinkTime devuelve el intervalo de parpadeo del cursor de edicin en milisegundos. El intervalo de parpadeo es el tiempo que transcurre entre dos apariciones consecutivas del cursor de edicin.

Si la funcin tiene xito, devuelve el intervalo de parpadeo del cursor de edicin en milisegundos; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

SetCaretBlinkTime

Consulte el Listado 11-9, correspondiente a la funcin SetCaretBlinkTime.

GetCaretPos( var lpPoint: TPoint ): BOOL;

{apunta a coordenadas del cursor de edicin} {devuelve TRUE o FALSE}

La funcin GetCaretPos recupera la posicin actual del cursor de edicin, en coordenadas de rea cliente.

lpPoint: Apunta a un registro TPoint que recibir las coordenadas del cursor de edicin. Las coordenadas siempre son relativas al rea cliente de la ventana.

Si la funcin tiene xito, devuelve TRUE, en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

SetCursorPos

Consulte el Listado 11-9, correspondiente a la funcin SetCaretBlinkTime.

11
GetClipCursor( var lpRect: TRect ): BOOL; {coordenadas de la regin de confinamiento} {devuelve TRUE o FALSE}

La funcin GetClipCursor recupera las coordenadas de la regin rectangular a la que estn limitados los movimientos del cursor del ratn.

lpRect: Apunta a un registro de tipo TRect que recibir las coordenadas de la regin de confinamiento del ratn. El registro TRect deber ser reservado por quien hace la llamada.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

ClipCursor, GetCursorPos

Consulte el Listado 11-10, correspondiente a la funcin SwapMouseButton.

GetCursorPos( var lpPoint: TPoint ): BOOL;

{recibe las coordenadas del cursor} {devuelve TRUE o FALSE}

La funcin GetCursorPos recupera la posicin del cursor del ratn relativa a la pantalla.

lpPoint: Apunta a un registro de tipo TPoint que recibe la posicin actual del cursor del ratn en coordenadas de pantalla. El registro debe ser reservado por quien hace la llamada.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

ClipCursor, SetCursorPos, SetCaretPos

Consulte el Listado 11-10, correspondiente a la funcin SwapMouseButton.

GetDoubleClickTime: UINT;

{devuelve el tiempo lmite de doble clic}

La funcin GetDoubleClickTime recupera el intervalo de tiempo en milisegundos que puede transcurrir entre dos clics de ratn para que sean considerados por el sistema como un nico doble clic. Para cambiar el valor de este parmetro, utilice la funcin SetDoubleClickTime.

Si la funcin tiene xito, devuelve el intervalo lmite de doble clic en milisegundos. Esta funcin no indica errores en caso de fallo.

SetDoubleClickTime

Consulte el Listado 11-10, correspondiente a la funcin SwapMouseButton.

GetInputState: BOOL;

{devuelve TRUE o FALSE}

GetInputState examina la cola de mensajes en busca de mensajes de ratn, de teclado o de temporizadores. La funcin devuelve un valor booleano que refleja la existencia o no de mensajes de esos tipos en la cola.

11

Esta funcin devuelve TRUE si hay mensajes de entrada en la cola, y FALSE en caso contrario. La funcin no indica ningn error en caso de fallo.

GetQueueStatus

Consulte el Listado 11-2, correspondiente a la funcin GetKeyboardType.

GetKeyboardLayout( dwLayout: DWORD ): HKL;

{hilo que es interrogado} {devuelve manejador de configuracin de teclado}

GetKeyboardLayout recupera el manejador de la configuracin de teclado activa para el hilo especificado. Para obtener la configuracin para el hilo actual, asigne cero al parmetro dwLayout. Bajo Windows NT, GetKeyboardLayout devuelve el manejador de configuracin de teclado del sistema.

dwLayout: Especifica el manejador del hilo cuya configuracin se desea obtener. Debe ser un manejador de hilo vlido.

Si la funcin tiene xito, devuelve el manejador de configuracin de teclado del hilo especificado. La palabra ms baja contiene el identificador de idioma del hilo, y la palabra ms alta el manejador de dispositivo asociado a la configuracin de teclado. Si la funcin falla, devuelve cero.

LoadKeyboardLayout, GetKeyboardLayoutList, UnloadKeyboardLayout

Consulte el Listado 11-11, correspondiente a la funcin VkKeyScanEx.

GetKeyboardLayoutList( nBuff: Integer; var List ): UINT;

{cantidad de configuraciones de teclado} {recibe array de manejadores de configuraciones} {devuelve la cantidad de manejadores}

La funcin GetKeyboardLayoutList recupera la lista de manejadores de configuraciones de teclado para la localidad actual del sistema. Puede tambin ser usada para conocer la cantidad de elementos en dicha lista.

nBuff: Especifica la cantidad de manejadores que el buffer puede contener. Si el valor de este parmetro es cero, la funcin slo devolver la cantidad de elementos en la lista. List: Apunta a un array que recibir los manejadores de configuraciones de teclado. Si el parmetro nBuff es cero, este parmetro es ignorado.

Si nBuff no es cero y la funcin tiene xito, devuelve la cantidad de manejadores colocados en el buffer apuntado por el parmetro List. Si nBuff es cero, GetKeyboardLayoutList devuelve la cantidad de manejadores de configuraciones de teclado. Esta funcin no indica ningn error en caso de fallo.

GetKeyboardLayout, LoadKeyboardLayout, UnloadKeyboardLayout

Consulte el Listado 11-6, correspondiente a la funcin LoadKeyboardLayout.

GetKeyboardLayoutName( pwszKLID: PChar ): BOOL;

{buffer para nombre de la configuracin de teclado} {devuelve TRUE o FALSE}

La funcin GetKeyboardLayoutName recupera el nombre de la configuracin de teclado activa. El buffer apuntado por el parmetro pwszKLID recibir una cadena de caracteres terminada en nulo que representa un valor hexadecimal compuesto por un identificador primario de idioma y de un identificador de subidioma. Bajo Windows 95/98, esta funcin recupera la configuracin de teclado activa slo para el hilo que hace la llamada. Bajo Windows NT, recupera la configuracin de teclado del sistema.

11

pwszKLID: Puntero a una cadena de caracteres terminada en nulo que recibir el identificador del nombre de la configuracin de teclado.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetKeyboardLayoutList, LoadKeyboardLayout, UnloadKeyboardLayout

Consulte el Listado 11-6, correspondiente a la funcin LoadKeyboardLayout.

GetKeyboardState( var KeyState: TKeyboardState ): BOOL;

{array que recibir cdigos de tecla virtual} {devuelve TRUE o FALSE}

La funcin GetKeyboardState recupera el estado actual de las 256 teclas virtuales en un array de 256 bytes. Utilice los cdigos de tecla virtual como ndices dentro de este array para recuperar el estado individual de cierta tecla virtual (por ejemplo, KeyState[VK_Shift]). Los valores del array cambian en la medida en que los mensajes de teclado van siendo extrados de la cola, y no cuando son enviados. Para obtener el estado de una sola tecla, utilice las funciones GetKeyState o GetAsyncKeyState.

KeyState: Apunta a una estructura de datos de tipo TKeyboardState, que es un array de 256 bytes. Este array recibir la informacin relativa al estado de las 256 teclas virtuales. Si el bit ms significativo de un elemento del array es uno (1), significa que esa tecla est pulsada. Si el bit menos significativo es uno, entonces la tecla est activada, como puede ser el caso de las teclas Bloq.Mays, May, o Alt. El registro TKeyboardState se define de la siguiente forma: TKeyboardState = array[0..255] of Byte; {estado de las teclas virtuales}

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetAsyncKeyState, GetKeyNameText, MapVirtualKey

Consulte el Listado 11-7, correspondiente a la funcin MapVirtualKey.

GetKeyboardType( nTypeFlag: Integer ): Integer;

{tipo de informacin} {devuelve la informacin solicitada}

La funcin GetKeyboardType recupera la informacin que se solicite acerca del teclado. El tipo, subtipo y la cantidad de teclas de funcin pueden obtenerse dependiendo del valor del parmetro nTypeFlag.

nTypeFlag: Especifica el tipo de informacin a recuperar. A este parmetro puede asignrsele uno de los valores de la Tabla 11-3. Si se solicita el subtipo de teclado, el valor devuelto ser un cdigo especfico del fabricante, cuyo significado se describe en la Tabla 11-4. Si se solicita la cantidad de teclas de funcin, el valor devuelto no es la cantidad de teclas de funcin sino un cdigo que se traduce de acuerdo a la Tabla 11-5.

Si la funcin tiene xito, devuelve la informacin solicitada acerca del teclado; en caso contrario devuelve cero.

keybd_event

procedure begin

11

end procedure begin if else end then

GetKeyNameText( lParam: LongInt; lpString: PChar; nSize: Integer ): Integer

{lParam del mensaje de entrada} {puntero a buffer de salida} {tamao mximo del buffer} {devuelve el tamao de los datos en el buffer}

La funcin GetKeyNameText recupera el nombre de la tecla especificada y lo almacena en el buffer apuntado por el parmetro lpString. El formato del nombre de la tecla depende de la configuracin de teclado activa. En algunos teclados, los nombres de las teclas son ms largos que un carcter. La lista de nombres de las teclas es mantenida por el controlador del teclado. Bajo Windows 95/98, el nombre de la tecla es traducido de acuerdo a la configuracin de teclado actualmente cargada para el hilo activo. Bajo Windows NT, el nombre de la tecla es traducido de acuerdo a la configuracin de teclado cargada para el sistema.

lParam: Especifica el parmetro lParam de un mensaje de teclado. Este parmetro contiene informacin sobre la tecla cuyo nombre de tecla se va a recuperar, y se interpreta segn se describe en la Tabla 11-6. lpString: Apunta al buffer de salida que recibir el nombre de la tecla. nSize: Especifica el tamao del buffer de salida apuntado por el parmetro lpString.

Si la funcin tiene xito, devuelve el tamao de la cadena copiada al buffer de salida en caracteres, sin contar el terminador nulo. Esta funcin no indica ningn error en caso de fallo.

11

GetKeyState

procedure var begin if begin

var

then

if else

then

if else

then

if else end inherited end procedure begin inherited var

then

or or end

or

GetKeyState ( nVirtKey: Integer ): SHORT;

{cdigo de tecla virtual} {devuelve el estado}

La funcin GetKeyState recupera el estado de la tecla especificada por el parmetro nVirtKey. El estado de la tecla puede ser: pulsada, no pulsada o activada (para las teclas Bloq.Mays., May. o Ctrl).

nVirtKey: Especifica el cdigo de tecla virtual cuyo estado se desea recuperar. El cdigo de tecla virtual para las teclas entre la A y la Z y entre el 0 y el 9 coincide con el valor ASCII de esas teclas. Consulte la Tabla 11-7.

Si la funcin tiene xito, devuelve el estado de la tecla especificada. Si el bit ms significativo est activo, la tecla est pulsada. Si el bit menos significativo est activo, la tecla est en estado activo (Bloq.Mays, May, Ctrl). Esta funcin no indica ningn error en caso de fallo.

11

GetAsyncKeyState, GetKeyboardState, MapVirtualKey, SetKeyboardState

Consulte el Listado 11-3, correspondiente a la funcin GetKeyNameText.

keybd_event( bVk: Byte; bScan: Byte; dwFlags: DWORD; dwExtraInfo: DWORD );

{cdigo de tecla virtual} {cdigo de barrido} {opciones} {informacin adicional acerca de la tecla} {no devuelve nada}

La funcin keybd_event simula la pulsacin o liberacin de una tecla. El sistema generar los mensajes WM_KEYDOWN o WM_KEYUP, como si la tecla hubiera sido pulsada en el teclado.

bVk: El cdigo de tecla virtual en el rango 1-254. Consulte la funcin GetKeyState para conocer los identificadores de teclas virtuales. bScan: El cdigo de barrido del hardware para la tecla. dwFlags: Opciones que identifican la operacin a realizar. Este parmetro puede contener uno o ms valores de la Tabla 11-8. dwExtraInfo: Especifica un valor de 32 bits adicional asociado con la tecla.

GetAsyncKeyState, GetKeyState, MapVirtualKey, SetKeyboardState

procedure var begin if else then

11

if begin try

then

finally end end end

joyGetDevCaps ( uJoyID: UINT; lpCaps: PJoyCaps; uSize: UINT ): MMRESULT;

{identificador de palanca de juegos} {apunta a registro TJoyCaps} {tamao del registro TJoyCaps} {devuelve cdigo de error}

La funcin joyGetDevCaps recupera las posibilidades de la palanca de juegos especificada en un registro de tipo TJoyCaps reservado por el que hace la llamada.

uJoyID: Identificador de palanca de juegos; puede ser JOYSTICKID1 JOYSTICKID2. lpCaps: Apunta a un registro TJoyCaps que recibe las posibilidades de la palanca de juegos. El registro TJoyCaps se define de la siguiente forma: TJoyCaps = record wMid: Word; {cdigo del fabricante} wPid: Word; {cdigo del producto} szPname: array[0..MAXPNAMELEN-1] of AnsiChar; {nombre del producto} wXmin: UINT; {valor de posicin x mnima} wXmax: UINT; {valor de posicin x mxima} wYmin: UINT; {valor de posicin y mnima} wYmax: UINT; {valor de posicin y mxima} wZmin: UINT; {valor de posicin z mnima} wZmax: UINT; {valor de posicin z mxima} wNumButtons: UINT; {cantidad de botones} wPeriodMin: UINT; {perodo mnimo de mensaje} wPeriodMax: UINT; {perodo mximo de mensaje} wRmin: UINT; {valor de posicin r mnima} wRmax: UINT; {valor de posicin r mxima} wUmin: UINT; {valor de posicin x mnima de quinto eje (u)} wUmax: UINT; {valor de posicin x mxima de quinto eje} wVmin: UINT; {valor de posicin x mnima de sexto eje (v)} wVmax: UINT; {valor de posicin x mxima de sexto eje} wCaps: UINT; {posibilidades de la palanca de juegos} wMaxAxes: UINT; {cantidad mxima de ejes que soporta} wNumAxes: UINT; {cantidad de ejes en uso} wMaxButtons: UINT; {cantidad mxima de botones que soporta} szRegKey: array[0..MAXPNAMELEN - 1] of AnsiChar; {clave del registro} szOEMVxD: array[0..MAX_JOYSTICKOEMVXDNAME - 1] of AnsiChar; {controlador VxD del fabricante} end; wMid: Identificador del fabricante. wPid: Identificador del producto. szPname: Nombre de la palanca de juegos, como una cadena de caracteres terminada en nulo. wXmin: Valor mnimo de la coordenada x de la palanca de juegos.

11

wXmax: Valor mximo de la coordenada x de la palanca de juegos. wYmin: Valor mnimo de la coordenada y de la palanca de juegos. wYmax: Valor mximo de la coordenada y de la palanca de juegos. wZmin: Valor mnimo de la coordenada z de la palanca de juegos. wZmax: Valor mximo de la coordenada z de la palanca de juegos. wNumButtons: Cantidad de botones de la palanca de juegos. wPeriodMin: Frecuencia mnima de interrogacin soportada cuando joySetCapture est activo. wPeriodMax: Frecuencia mxima de interrogacin soportada cuando joySetCapture est activo. wRmin: Valor mnimo del cuarto eje (timn). wRmax: Valor mximo del cuarto eje (timn). wUmin: Valor mnimo del quinto eje. wUmax: Valor mximo del quinto eje. wVmin: Valor mnimo del sexto eje. wVmax: Valor mximo del sexto eje. wCaps: Capacidades de la palanca de juegos, segn la Tabla 11-9. wMaxAxes: Cantidad mxima de ejes que soporta. wNu mAxes: Cantidad de ejes actualmente en uso. wMaxButtons: Cantidad de botones soportados. szRegKey: Clave del registro de la palanca de juegos, como una cadena de caracteres terminada en nulo. szOEMVxD: Nombre del fabricante, como una cadena de caracteres terminada en nulo. uSize: Especifica el tamao, en bytes, del registro TJoyCaps.

La funcin devolver un cdigo de resultado, que puede ser cualquier de los valores que se muestran en la Tabla 11-10.

joyGetPosEx, joyGetPos

Consulte el Listado 11-5, correspondiente a la funcin joySetCapture.

joyGetNumDevs: UINT;

{devuelve la cantidad de palancas de juegos soportadas}

11

La funcin joyGetNumDevs recupera la cantidad de palancas de juegos soportadas por el controlador de palanca de juegos activo. Utilice joyGetPos para determinar si una palanca de juegos est presente.

Si la funcin tiene xito, devuelve la cantidad de palancas de juegos soportadas por el controlador de palanca de juegos activo. Si la funcin falla, o no hay controlador de palanca de juegos presente, devuelve cero.

joyGetDevCaps

Consulte el Listado 11-5, correspondiente a la funcin joySetCapture.

joyGetPos( uJoyID: UINT; lpInfo: PJoyInfo ): MMRESULT;

{identificador de palanca de juegos} {apunta al registro TJoyInfo} {devuelve un cdigo de error}

La funcin joyGetPos recupera informacin acerca de la posicin y estado de los botones de la palanca de juegos identificada por el parmetro uJoyID. La posicin y el estado de los botones se devuelve en un registro TJoyInfo. Esta funcin puede ser utilizada para determinar si la palanca de juegos est conectada, verificando el valor de retorno.

uJoyID: El identificador de la palanca de juegos cuya posicin se desea obtener. A este parmetro puede asignrsele JOYSTICKID1 JOYSTICKID2. lpInfo: Puntero a un registro TJoyInfo que recibir la informacin sobre la posicin de la palanca de juegos. El registro TJoyInfo se define de la siguiente forma: TJoyInfo = record wXpos: UINT; wYpos: UINT; wZpos: UINT; wButtons: UINT; end;

{posicin en eje x} {posicin en eje y} {posicin en eje z} {estado de los botones}

wXpos: La posicin actual de la palanca de juegos en el eje x. wYpos: La posicin actual de la palanca de juegos en el eje y. wZpos: La posicin actual de la palanca de juegos en el eje z. wButtons: Estado de los botones, segn se describe en la Tabla 11-11.

La funcin devolver un cdigo de xito o fallo, segn se describe en la Tabla 11-12.

joyGetPosEx

Consulte el Listado 11-5, correspondiente a la funcin joySetCapture.

joyGetPosEx( uJoyID: UINT; lpInfo: PJoyInfoEx ): MMRESULT;

{identificador de palanca de juegos} {apunta a registro TJoyInfoEx} {devuelve un cdigo de error}

La funcin joyGetPosEx recupera informacin relativa a la posicin y estado de los botones de la palanca de juegos identificada por el parmetro uJoyID. La posicin y el estado de los botones se almacenan en un registro TJoyInfoEx. Esta funcin ofrece ms informacin acerca de la posicin de la palanca de juegos que la funcin joyGetPos.

11

uJoyID: El identificador de la palanca de juegos cuya posicin se desea verificar. A este parmetro puede asignrsele JOYSTICKID1 JOYSTICKID2. lpInfo: Puntero a un registro TJoyInfoEx que recibir la informacin sobre la posicin de la palanca de juegos. El registro TJoyInfoEx se define de la siguiente forma: TJoyInfoEx = record dwSize: DWORD; dwFlags: DWORD; {tamao del registro} {opciones para indicar qu se desea obtener}

wXpos: UINT; wYpos: UINT; wZpos: UINT; dwRpos: DWORD; dwUpos: DWORD; dwVpos: DWORD; wButtons: UINT; dwButtonNumber: DWORD; dwPOV: DWORD; dwReserved1: DWORD; dwReserved2: DWORD; end;

{posicin en el eje x} {posicin en el eje y} {posicin en el eje z} {posicin en el 4 eje} {posicin en el 5 eje} {posicin en el 6 eje} {estado de los botones} {nmero del botn pulsado} {estado del punto de vista} {reservado para uso del sistema} {reservado para uso futuro}

dwSize: El tamao de este registro en bytes. A este campo se le debe asignar el valor SizeOf(TJoyInfoEx). dwFlags: Opcin que especifica el dato solicitado, segn se describe en la Tabla 11-13. wXpos: Coordenada actual en el 1 eje. wYpos: Coordenada actual en el 2 eje. wZpos: Coordenada actual en el 3 eje. dwRpos: Coordenada actual en el 4 eje. dwUpos: Coordenada actual en el 5 eje. dwVpos: Coordenada actual en el 6 eje. wButtons: El estado actual de los hasta 32 botones soportados por el sistema. Cada botn tiene un identificador (JOY_BUTTON1 hasta JOY_BUTTON32) que se corresponden con cada uno de los 32 bits del valor de wButtons. Si un bit concreto est puesto a uno (1), el botn est pulsado. dwButtonNumber: El nmero del botn actualmente pulsado. dwPOV: La posicin actual del control de punto de vista, en centsimas de grado. Este valor puede oscilar en el rango entre 0 y 35.900. Si la opcin JOY_RETURNPOV ha sido establecida en el parmetro dwFlags, el valor de dwPOV ser uno de los valores de la Tabla 11-14. Una aplicacin que soporte nicamente los valores de punto de vista mostrados en esa tabla deber siempre utilizar la opcin JOY_RETURNPOV. Si la aplicacin soporta la informacin en grados, deber utilizar la opcin JOY_RETURNPOVCTS, que adems soporta las constantes JOY_POV de la tabla. dwReserved1: Reservado para uso del sistema. dwReserved2: Reservado para uso futuro.

La funcin devolver un cdigo de resultado cuyos posibles valores se muestran en la Tabla 11-15.

joyGetPos, joyGetDevCaps

Consulte el Listado 11-5, correspondiente a la funcin joySetCapture.

11

joyGetThreshold( uJoyID: UINT; lpuThreshold: PUINT ): MMRESULT;

{identificador de palanca de juegos} {puntero a variable que recibir el valor del umbral} {devuelve un cdigo de error}

La funcin joyGetThreshold recupera el umbral de movimiento de la palanca de juegos. El umbral es la distancia que debe moverse la palanca de juegos para que el controlador enve un mensaje WM_JOYMOVE.

uJoyID: Identificador de la palanca de juegos cuyo umbral se desea recuperar. A este parmetro puede asignrsele JOYSTICKID1 JOYSTICKID2. lpuThreshold: Puntero a un entero que recibir el valor del umbral de la palanca de juegos especificada.

La funcin devolver un cdigo de resultado cuyos posibles valores se muestran en la Tabla 11-16.

joySetThreshold

Consulte el Listado 11-5, correspondiente a la funcin joySetCapture.

joyReleaseCapture ( uJoyID: UINT ): MMRESULT;

{identificador de palanca de juegos} {devuelve un cdigo de error}

La funcin joyReleaseCapture libera una palanca de juegos capturada.

uJoyID: Identificador de la palanca de juegos a liberar. A este parmetro puede asignrsele JOYSTICKID1 JOYSTICKID2.

La funcin devolver un cdigo de resultado cuyos posibles valores se muestran en la Tabla 11-17.

joySetCapture

11

Consulte el Listado 11-5, correspondiente a la funcin joySetCapture.

joySetCapture( Handle: HWND; uJoyID: UINT; uPeriod: UINT; bChanged: BOOL ): MMRESULT;

{manejador de ventana} {identificador de palanca de juegos} {frecuencia de consulta} {opcin de cambio de frecuencia} {devuelve un cdigo de error}

La funcin joySetCapture captura los mensajes generados por el controlador de la palanca de juegos. Los mensajes de la palanca de juegos sern enviados a la ventana especificada por el parmetro Handle. La funcin fallar si la palanca de juegos ya ha sido capturada. La funcin joyReleaseCapture puede ser utilizada para liberar la captura antes de llamar a joySetCapture. La palanca de juegos es liberada automticamente cuando la ventana de captura es destruida.

Handle: Manejador de la ventana que recibir los mensajes de la palanca de juegos. uJoyID: Identificador de la palanca de juegos a capturar. A este parmetro puede asignrsele JOYSTICKID1 JOYSTICKID2. uPeriod: La frecuencia de consulta en milisegundos. bChanged: Este parmetro determina cundo se enviarn los mensajes a la ventana de captura. Si el valor de este parmetro es TRUE, los mensajes se enviarn a la ventana de captura solamente cuando el movimiento de la palanca exceda el valor del umbral establecido. Si el valor de este parmetro es FALSE, se enviarn mensajes a la ventana de captura cada vez que transcurra el intervalo establecido.

La funcin devolver un cdigo de resultado cuyos posibles valores se muestran en la Tabla 11-18.

joyReleaseCapture

var

implementation

procedure var begin if begin

var

then

if

and and

and then

else

end if begin if if end if begin if not if not end inherited end then and and then then and and then then then

11

procedure var

begin

if begin

then or

end

if

then

if

then

end procedure begin if begin then

end end procedure var begin var

if

then

end procedure begin

end procedure begin end procedure begin end

11

joySetThreshold ( uJoyID: UINT; uThreshold: UINT ): MMRESULT;

{identificador de palanca de juegos} {umbral de la palanca de juegos} {devuelve un cdigo de error}

La funcin joySetThreshold permite establecer el umbral de movimiento de la palanca de juegos. El umbral de la palanca de juegos se define como la distancia mnima que deber moverse la palanca de juegos para que se genere un mensaje WM_JOYMOVE.

uJoyID: Identificador de la palanca de juegos cuyo umbral se desea establecer. A este parmetro puede asignrsele JOYSTICKID1 JOYSTICKID2. uThreshold: Especifica el nuevo valor del umbral de movimiento.

La funcin devolver un cdigo de resultado cuyos posibles valores se muestran en la Tabla 11-19.

joySetCapture

Consulte el Listado 11-5, correspondiente a la funcin joySetCapture.

LoadKeyboardLayout( pwszKLID: PChar; Flags: UINT ): HKL;

{ID de configuracin de teclado} {opciones de configuracin} {devuelve manejador de configuracin de teclado}

LoadKeyboardLayout carga la configuracin de teclado especificada. Varias configuraciones de teclado pueden estar cargadas simultneamente, pero slo una de ellas estar activa en cada momento.

pwszKLID: Puntero a una cadena de caracteres terminada en nulo que contiene el nombre de la configuracin de teclado. Esta cadena de caracteres representa el valor hexadecimal del identificador de configuracin. Consulte la funcin del ejemplo que muestra cmo se combinan el identificador primario de idioma y el identificador de subidioma para producir el identificador de idioma (language ID). Flags: Especifica cmo se debe cargar la configuracin de teclado. Este parmetro podr contener uno de los valores descritos en la Tabla 11-20.

Si la funcin tiene xito, devuelve el manejador de la configuracin de teclado que ha sido cargada. Si la funcin falla, o si no se encontr la configuracin de teclado, devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

ActivateKeyboardLayout, GetKeyboardLayoutName, UnloadKeyboardLayout

11

var array implementation of

procedure var begin

if then end procedure begin if then

end procedure var begin

while begin end end procedure begin if not end

do

then

function begin SHL end

11

MapVirtualKey( uCode: UINT; uMapType: UINT ): UINT;

{cdigo de tecla, cdigo de barrido, o tecla virtual} {opciones de modo de traduccin} {devuelve el cdigo de tecla traducido}

La funcin MapVirtualKey traduce un cdigo de tecla virtual a cdigo de barrido o valor de carcter, o traduce un cdigo de barrido en cdigo de tecla virtual. El parmetro uMapType determina el tipo de conversin a realizar.

uCode: El cdigo de tecla, que puede ser un cdigo de tecla virtual o un cdigo de barrido. Cmo se interpreta este parmetro depende del modo de traduccin especificado en el parmetro uMapType. uMapType: Especifica el tipo de traduccin. Este parmetro podr contener uno de los valores descritos en la Tabla 11-21.

Si la funcin tiene xito, devuelve un cdigo de barrido, cdigo de tecla virtual o valor de carcter, dependiendo de los valores de los parmetros. Si la funcin falla, o no existe traduccin, devuelve cero.

GetAsyncKeyState, GetKeyboardState, GetKeyState, SetKeyboardState

var

implementation

procedure begin

var

end procedure var begin

if else

and

then

if else end procedure var begin

then

11

if else

and

then

end

MapVirtualKeyEx( uCode: UINT; uMapType: UINT; dwhkl: HKL ): UINT;

{cdigo de tecla, cdigo de barrido, o tecla virtual} {opcin de modo de traduccin} {manejador de configuracin de teclado} {devuelve el cdigo de tecla traducido}

La funcin MapVirtualKeyEx traduce un cdigo de tecla virtual a cdigo de barrido o valor de carcter, o traduce un cdigo de barrido en cdigo de tecla virtual. El parmetro uMapType determina el tipo de conversin a realizar.

La diferencia entre las funciones MapVirtualKeyEx y MapVirtualKey consiste en que MapVirtualKeyEx traduce el carcter utilizando el idioma de la configuracin de teclado especificada por el manejador dwhkl. La funcin MapVirtualKeyEx no distinguir entre las teclas de control situadas a la izquierda y a la derecha si se utilizan cdigos de teclas virtuales genricos, como por ejemplo para VK_SHIFT, VK_CONTROL o VK_MENU. Una aplicacin puede obtener el cdigo de barrido apropiado para las teclas de control del lado izquierdo o derecho utilizando los valores VK_LSHIFT, VK_RSHIFT, VK_LCONTROL, VK_RCONTROL, VK_LMENU o VK_RMENU en el parmetro uCode.

uCode: El cdigo de tecla virtual o cdigo de barrido a traducir. Este valor se interpreta en dependencia de la opcin especificada en el parmetro uMapType. uMapType: Especifica el tipo de traduccin a realizar. Este parmetro podr contener uno de los valores descritos en la Tabla 11-22. dwhkl: Especifica el manejador de configuracin de teclado que debe utilizarse para traducir los caracteres a sus cdigos de tecla virtual correspondientes. El manejador de configuracin de teclado puede obtenerse llamando a las funciones GetKeyboardLayout o LoadKeyboardLayout.

Si la funcin tiene xito, devuelve un cdigo de barrido, cdigo de tecla virtual o valor de carcter, dependiendo de los parmetros. Si la funcin falla o no existe traduccin, devuelve cero.

GetAsyncKeyState, GetKeyboardState, GetKeyState, SetKeyboardState, MapVirtualKey

Consulte el Listado 11-11, correspondiente a la funcin VkKeyScanEx.

11

mouse_event( dwFlags: DWORD; dx: DWORD; dy: DWORD; dwData: DWORD; dwExtraInfo: DWORD );

{cdigos de actividad del ratn} {posicin o cambio horizontal} {posicin o cambio vertical} {movimiento de la rueda} {datos definidos por la aplicacin} {no devuelve nada}

La funcin mouse_event simula la actividad del ratn. El sistema generar mensajes de ratn como si el ratn hubiese sido realmente movido o alguno de sus botones pulsado.

dwFlags: Especifica el tipo de actividad del ratn que se desea simular. Este parmetro puede contener uno o ms valores de la Tabla 11-23. dx: Especifica la posicin o cambio por la horizontal. Si el parmetro dwFlags contiene la opcin MOUSEEVENTF_ABSOLUTE, este parmetro especifica una posicin. En caso contrario, este parmetro especifica la cantidad de mickeys (unidad de medida de movimiento del ratn) de desplazamiento. dy: Especifica la posicin o cambio por la vertical. Si el parmetro dwFlags contiene la opcin MOUSEEVENTF_ABSOLUTE, este parmetro especifica una posicin. En caso contrario, este parmetro especifica la cantidad de mickeys (unidad de medida de movimiento del ratn) de desplazamiento. dwData: Especifica la cantidad de movimiento de la rueda del ratn si el parmetro dwFlags contiene la opcin MOUSEEVENTF_WHEEL. Un valor positivo indica el desplazamiento de la rueda en direccin de alejamiento del usuario; un valor negativo indica el desplazamiento de la rueda hacia el usuario. Este valor es relativo a la constante WHEEL_DELTA, aproximadamente igual a 120 mickeys. Si el parmetro dwFlags no contiene la opcin MOUSEEVENTF_WHEEL, dwData debe ser puesto a cero. dwExtraInfo: Datos adicionales definidos por la aplicacin (32 bits). Para recuperar ese valor, se debe llamar a la funcin GetMessageExtraInfo.

GetMessageExtraInfo, SystemParametersInfo

var

implementation

procedure begin if end procedure begin if not then then

if begin while begin

then do

end end end procedure begin end procedure begin end

11

procedure begin end

OemKeyScan( wOemChar: Word

{valor ASCII del carcter OEM}

): DWORD;

{devuelve el cdigo de barrido}

Esta funcin recupera el cdigo de barrido del fabricante (OEM) para el carcter con el cdigo ASCII del fabricante especificado (entre $00 y $FF) y el estado indicado de las teclas May., Ctrl y Alt. OemKeyScan funciona nicamente para caracteres que pueden producirse mediante una sola tecla.

wOemChar: Especifica el cdigo ASCII del carcter cuyo cdigo de barrido OEM se desea recuperar.

Si esta funcin tiene xito, el byte menos significativo del valor devuelto contiene el cdigo de barrido OEM, y el byte ms significativo contiene el estado de las teclas May, Ctrl y Alt, segn se describe en la Tabla 11-24. Si la funcin falla, devuelve $FFFFFFFF.

VkKeyScan, MapVirtualKey

Consulte el Listado 11-7, correspondiente a la funcin MapVirtualKey.

11
ReleaseCapture: BOOL; {devuelve TRUE o FALSE}

La funcin ReleaseCapture libera la captura del ratn por una ventana. El flujo normal de los mensajes de ratn es restaurado.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE.

GetCapture

Consulte el Listado 11-10, correspondiente a la funcin SwapMouseButton.

SetCapture( hWnd: HWND ): HWND;

{manejador de la ventana que captura los mensajes} {devuelve el manejador de ventana de captura anterior}

La funcin SetCapture captura los mensajes de ratn y los enva a la ventana especificada por el parmetro hWnd. Cuando el ratn es capturado, todos los mensajes de ratn son enviados a la ventana de captura, an cuando el cursor del ratn est fuera de las fronteras de esa ventana. Cuando la ventana deja de necesitar el monopolio de la entrada del ratn, debe llamar a la funcin ReleaseCapture.

hWnd: Especifica el manejador de la ventana que va a capturar la entrada del ratn.

Si la funcin tiene xito, devuelve el manejador de la ventana que tena anteriormente la captura del ratn. Si la funcin falla, o ninguna ventana tena anteriormente la captura del ratn, devuelve cero.

ReleaseCapture

Consulte el Listado 11-10, correspondiente a la funcin SwapMouseButton.

SetCaretBlinkTime( uMSeconds: UINT ): BOOL;

{intervalo de parpadeo del cursor de edicin} {devuelve TRUE o FALSE}

SetCaretBlinkTime cambia la frecuencia de parpadeo del cursor de edicin al intervalo especificado en el parmetro uMSeconds.

uMSeconds: Especifica el nuevo intervalo de parpadeo del cursor de edicin en milisegundos.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetCaretBlinkTime

procedure begin

end procedure begin end procedure var begin

11

end

procedure begin

end

SetCaretPos( X: Integer; Y: Integer ): BOOL;

{coordenada X de nueva posicin del cursor de edicin} {coordenada Y de nueva posicin del cursor de edicin} {devuelve TRUE o FALSE}

La funcin SetCaretPos mueve el cursor de edicin a las coordenadas especificadas por los parmetros X e Y. Si el estilo de la clase de la ventana contiene la opcin CS_OWNDC, las coordenadas del cursor de edicin son mapeadas al contexto de dispositivo de la ventana. Esta funcin mueve el cursor de edicin incluso si el cursor est escondido.

X: Especifica la posicin horizontal de la nueva posicin del cursor de edicin. Y: Especifica la posicin vertical de la nueva posicin del cursor de edicin.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetCaretPos

Consulte el Listado 11-9, correspondiente a la funcin SetCaretBlinkTime.

SetCursorPos( X: Integer; Y: Integer ): BOOL;

{coordenada X del cursor} {coordenada Ydel cursor} {devuelve TRUE o FALSE}

La funcin SetCursorPos relocaliza el cursor del ratn a la posicin especificada por los parmetros X e Y en coordenadas de pantalla. Si el cursor est confinado a una zona rectangular por causa de una llamada anterior a la funcin ClipCursor, el sistema traduce las coordenadas a las coordenadas apropiadas dentro de la zona rectangular.

X: Especifica la nueva coordenada horizontal del cursor. Y: Especifica la nueva coordenada vertical del cursor.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

ClipCursor, GetCursorPos, SetCaretPos

11

Consulte el Listado 11-10, correspondiente a la funcin SwapMouseButton.

SetDoubleClickTime( Interval: UINT ): BOOL;

{intervalo entre clics en milisegundos} {devuelve TRUE o FALSE}

La funcin SetDoubleClickTime cambia el intervalo de tiempo mximo entre dos clics consecutivos necesario para que el sistema los considere como un doble clic.

Interval: Especifica el nuevo intervalo de tiempo entre clics en milisegundos.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetDoubleClickTime

Consulte el Listado 11-10, correspondiente a la funcin SwapMouseButton.

SetKeyState( var KeyState: TKeyboardState ): BOOL;

{array de estado de las teclas virtuales} {devuelve TRUE o FALSE}

La funcin SetKeyboardState establece el estado de las 256 teclas virtuales. El estado de cada tecla virtual se almacena en un array de 256 bytes, identificado por el parmetro KeyState. Utilice el cdigo de cualquier tecla virtual como un ndice para conocer el estado de esa tecla (por ejemplo, KeyState[VK_Shift]).

KeyState: Apunta a un registro de tipo TKeyboardState, que es un array de 256 bytes. Cada ndice en el array debe recibir un valor que indique el estado de cada tecla virtual individual. Si el bit ms significativo de un elemento es uno (1), esa tecla est pulsada. Si el bit menos significativo es uno, la tecla est activada, como en el caso de las teclas Bloq. Mays., May o Alt. TKeyboardState se define de la siguiente forma: TKeyboardState = array[0..255] of Byte; {estado de teclas virtuales}

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetAsyncKeyState, GetKeyState, MapVirtualKey

Consulte el Listado 11-7, correspondiente a la funcin MapVirtualKey.

SwapMouseButton( fSwap: BOOL ): BOOL;

{invertir o restaurar configuracin de botones del ratn} {devuelve TRUE o FALSE}

La funcin SwapMouseButton intercambia o restaura a su estado normal la configuracin lgica de los botones del ratn. Si los botones estn intercambiados, el botn izquierdo del ratn producir mensajes correspondientes al botn derecho (por ejemplo, WM_RBUTTONDOWN), y el botn derecho del ratn generar mensajes correspondientes al botn izquierdo.

fSwap: Si el valor de este parmetro es TRUE, se intercambia la interpretacin de los botones izquierdo y derecho del ratn. Si el valor de este parmetro es FALSE, los botones del ratn sern restaurados a la configuracin original.

Si esta funcin tiene xito y los botones del ratn haban sido intercambiado antes, devuelve TRUE. Si la funcin falla, o los botones del ratn no estaban invertidos anteriormente, devuelve FALSE.

11

SetDoubleClickTime

var

implementation

procedure var begin

end procedure begin if else if end procedure begin then then

end procedure begin not end procedure var begin

end procedure begin if not end procedure begin then

end procedure begin

end procedure begin

11
if end procedure begin if not end procedure begin if not then then and then

end procedure begin end

UnloadKeyboardLayout( hkl: HKL ): BOOL;

{manejador de configuracin de teclado} {devuelve TRUE o FALSE}

UnloadKeyboardLayout elimina la configuracin de teclado especificada de la lista de configuraciones cargadas.

hkl: Especifica el manejador de configuracin de teclado a descargar.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

ActivateKeyboardLayout, GetKeyboardLayoutName, LoadKeyboardLayout

Consulte el Listado 11-6, correspondiente a la funcin LoadKeyboardLayout.

VkKeyScan( ch: Char ): SHORT;

{cdigo ASCII de carcter} {devuelve el cdigo traducido}

La funcin VkKeyScan traduce el cdigo de carcter especificado a cdigo de tecla virtual y devuelve el estado de las teclas May, Ctrl y Alt. Las teclas del teclado numrico no sern traducidas.

ch: Especifica el carcter de la tecla. Este valor ser traducido a cdigo de tecla virtual.

Si esta funcin tiene xito, el byte menos significativo del resultado contiene el cdigo de tecla virtual, y el byte ms significativo contiene un cdigo que indica el estado de las teclas May, Ctrl y Alt. Consulte en la Tabla 11-25 los posibles valores del byte ms significativo. Si la funcin falla, ambos bytes contendrn 1.

GetAsyncKeyState, GetKeyboardState, GetKeyNameText, MapVirtualKey, VkKeyScanEx

11

Consulte el Listado 11-7, correspondiente a la funcin MapVirtualKey.

VkKeyScanEx( ch: Char; dwhkl: HKL ): SHORT;

{carcter a traducir} {manejador de configuracin de teclado} {devuelve cdigo traducido}

La funcin VkKeyScanEx traduce el cdigo de carcter especificado a un cdigo de tecla virtual y devuelve el estado de las teclas May, Ctrl y Alt. Las teclas del teclado numrico no sern traducidas. La diferencia entre las funciones VkKeyScan y VkKeyScanEx consiste en que VkKeyScanEx recibe un parmetro adicional que especifica el manejador de configuracin de teclado. La traduccin se realizar en el contexto de esa configuracin de teclado. El manejador de configuracin de teclado puede obtenerse llamando a las funciones GetKeyboardLayout o LoadKeyboardLayout.

ch: Especifica el valor del carcter a ser traducido a un cdigo de tecla virtual. dwhkl: Especifica el manejador de configuracin de teclado a utilizar para la traduccin del carcter a un cdigo de tecla virtual.

Si esta funcin tiene xito, el byte menos significativo del resultado contiene el cdigo de tecla virtual, y el byte ms significativo contiene un cdigo que indica el estado de las teclas May, Ctrl y Alt. Consulte en la Tabla 11-26 los posibles valores del byte ms significativo. Si la funcin falla, ambos bytes contendrn 1.

GetAsyncKeyState, GetKeyboardState, GetKeyNameText, MapVirtualKey, VkKeyScan

procedure var

String begin

if

then

if begin if else begin end

then then

end end procedure begin end

11

Windows gestiona la creacin de ficheros a travs de la funcin CreateFile. Esta funcin puede adems abrir un fichero para su modificacin o simplemente para recuperar datos de l. A partir del momento en que un fichero es abierto o creado, el sistema mantiene un puntero a ese fichero. Ese puntero se desplaza en la medida en que se leen o escriben datos en el fichero. Una aplicacin puede desplazar ese puntero del fichero a diferentes posiciones utilizando la funcin SetFilePointer. Ello permite a la aplicacin el acceso aleatorio a la informacin contenida en el fichero si la estructura del fichero es conocida en tiempo de ejecucin. Cuando un fichero es abierto o creado, la aplicacin recibe un manejador de fichero. Este manejador opera de forma muy similar a un manejador de ventana, ya que identifica al fichero y permite que otras funciones puedan manipular el fichero. Cualquier proceso que sea iniciado por el proceso actual heredar los manejadores de ficheros abiertos, si stos fueron especificados como heredables. Aunque Windows cierra todos los ficheros abiertos cuando la aplicacin termina, podra perderse informacin si un fichero abierto no es cerrado explcitamente mediante una llamada a la funcin CloseHandle. Tenga en cuentra que algunas de las funciones de entrada/salida que se describen en este captulo hacen mencin de rutas relativas y absolutas. Una ruta absoluta consiste de un nombre de unidad, seguido por el nombre de directorio y los nombres de subdirectorios, hasta llegar al nombre del fichero (por ejemplo, C:\Archivos de programa\Borland\Delphi 5\Bin\Delphi32.EXE). Una ruta relativa hace uso de los pseudodirectorios . y .., para apuntar a un fichero utilizando el directorio actual como origen (por ejemplo, ..\..\Database Desktop\Dbd32.exe).

12

Windows almacena las fechas de creacin y ltima modificacin de ficheros en formato UTC (Coordinated Universal Time). Las coordenadas universales de tiempo se definen como la hora y fecha en Greenwich, Reino Unido. Especficamente, las horas se almacenan en registros de tipo TFileTime. El tipo TFileTime se define de la siguiente forma: TFileTime = record dwLowDateTime: DWORD; dwHighDateTime: DWORD; end;

{los 32 bits menos significativos} {los 32 bits ms significativos}

El registro TFileTime permite almacenar un valor de 64 bits que especifica la cantidad de intervalos de 100 nanosegundos transcurridos desde las 12:00 a.m. del primero de enero de 1601 (en coordenadas universales). Un registro de este tipo es guardado por el sistema cuando cualquier fichero es guardado a disco, utilizando la hora actual del sistema, que est en formato UTC. Sin embargo, una aplicacin generalmente desear mostrar las fechas de los ficheros en el formato de hora local. Por lo general, una aplicacin convierte la fecha y hora del fichero a la hora local utilizando la funcin FileTimeToLocalFileTime, pasndole como parmetro el registro TFileTime, resultado de una llamada previa a la funcin FileTimeToSystemTime. Esta funcin devuelve un registro con los valores apropiados para la fecha y la hora del fichero ajustada a la zona horaria local. Este es el mtodo que utiliza el Explorador de Windows para mostrar las horas de ficheros en el horario local.

En este captulo se describen las siguientes funciones de entrada/salida de ficheros:

12

CloseHandle ( hObject: THandle ): BOOL;

{manejador de objeto} {devuelve TRUE o FALSE}

La funcin CloseHandle cierra un dispositivo u objeto abierto, y debe ser utilizada para cerrar los manejadores de consola de entrada y salida, ficheros de eventos, ficheros mapeados en memoria, mutexes, canalizaciones (pipes), procesos, semforos, hilos, ficheros creados mediante una llamada a CreateFile, y tokens (slo bajo Windows NT). Esta funcin invalida el manejador especificado y disminuye en uno el contador de manejadores del objeto asociado con el manejador. Si el contador de manejadores del objeto llega a cero, el objeto es eliminado de memoria. Un intento de cerrar un manejador invalidado producir una excepcin.

hObject: Especifica un manejador abierto.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CreateFile, DeleteFile, FindClose, FindFirstFile

Consulte el Listado 12-4, correspondiente a la funcin CreateFile.

CompareFileTime ( const lpFileTime1: TFileTime; const lpFileTime2: TFileTime ): LongInt;

{puntero a registro TFileTime} {puntero a registro TFileTime} {devuelve indicador de igualdad}

Esta funcin compara las horas apuntadas por lpFileTime1 y lpFileTime2 y devuelve el resultado que indica su diferencia. Esta funcin puede utilizarse en combinacin con GetFileTime para determinar si un fichero fue modificado la ltima vez que se accedi a l.

lpFileTime1: Puntero a un registro TFileTime que contiene la hora de 64 bits del primer fichero. lpFileTime2: Puntero a un registro TFileTime que contiene la hora de 64 bits del segundo fichero.

Si la funcin tiene xito, devuelve -1, que indica que el primer fichero es ms antiguo que el segundo; 0, que indica que las horas de los ficheros son iguales; 1, que indica que el primer fichero es ms reciente que el segundo. Esta funcin no indica errores en caso de fallo.

12

FileTimeToLocalFileTime, FileTimeToSystemTime, GetFileTime

var

implementation procedure var

begin

if if

then then

else

end procedure var begin

if begin end

then

if begin nil end else begin nil end end

then nil

nil

procedure var begin

case

of

12

end end

CopyFile( lpExistingFileName: PChar; lpNewFileName: PChar; bFailIfExists: BOOL ): BOOL;

{puntero a nombre de fichero existente} {puntero a nuevo nombre de fichero} {qu hacer si el fichero ya existe} {devuelve TRUE o FALSE}

Esta funcin copia un fichero existente a un nuevo fichero. Los atributos de seguridad de un fichero no se copiarn, pero los atributos del fichero s (por ejemplo, si el fichero original es de slo lectura, el nuevo fichero tambin ser de slo lectura).

lpExistingFileName: Una cadena de caracteres terminada en nulo que contiene un puntero al nombre del fichero a copiar. lpNewFileName: Una cadena de caracteres terminada en nulo que contiene un puntero al nombre del nuevo fichero. bFailIfExists: Determina cmo se efectuar la copia si ya existe un fichero con el mismo nombre que el apuntado por el parmetro lpNewFileName. Si el valor de este parmetro es TRUE y el nuevo fichero ya existe, la funcin fallar. Si el valor de este parmetro es FALSE, el fichero existente ser sobreescrito, y la funcin tendr xito.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CreateFile, MoveFile

procedure var begin

if not not then

begin or nil end end nil String

12
CreateDirectory ( lpPathName: PChar; lpSecurityAttributes: PSecurityAttributes ): BOOL; {ruta del nuevo directorio} {atributos de seguridad del directorio} {devuelve TRUE o FALSE}

Esta funcin crea un nuevo directorio segn la ruta especificada por el parmetro lpPathName. Bajo Windows NT y otros sistemas de ficheros que soporten compresin de directorios y ficheros individuales (como NTFS), el nuevo directorio hereda los atributos de compresin de su directorio padre.

lpPathName: Puntero a una cadena de caracteres terminada en nulo que contiene el nombre del nuevo directorio. Esta cadena no debe superar MAX_PATH caracteres de longitud. lpSecurityAttributes: Puntero a un registro TSecurityAttributes que contiene informacin acerca de la herencia de manejadores y la seguridad de ficheros. A este parmetro puede asignrsele nil, que indica que el manejador del directorio no podr ser heredado por procesos hijos. El registro TSecurityAttributes se define de la siguiente forma: TSecurityAttributes = record nLength: DWORD; lpSecurityDescriptor: Pointer; bInheritHandle: BOOL; end; {tamao del registro TSecurityAttributes} {descriptor de seguridad} {opciones de herencia de manejador}

Los campos de este registro se describen bajo la funcin CreateFile. Note que bajo Windows 95/98 el campo lpSecurityDescriptor de este registro es ignorado.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CreateDirectoryEx, CreateFile, RemoveDirectory

procedure var begin if begin end then

if not nil begin or nil end nil String then

end procedure var begin if begin end if not nil begin or nil end nil String then then

12
end

CreateDirectoryEx ( lpTemplateDirectory: PChar; lpPathName: PChar; lpSecurityAttributes: PSecurityAttributes ): BOOL;

{directorio patrn} {ruta del nuevo directorio} {atributos de seguridad del directorio} {devuelve TRUE o FALSE}

Esta funcin crea un nuevo directorio en la ruta especificada por el parmetro lpPathName, asocindole los atributos del directorio patrn especificado por el parmetro lpTemplateDirectory. Bajo Windows NT y otros sistemas de ficheros que soporten compresin de directorios y ficheros individuales (como NTFS), el nuevo directorio hereda los atributos de compresin de su directorio padre.

lpTemplateDirectory: Una cadena de caracteres terminada en nulo que contiene el nombre de un directorio existente cuyos atributos sern aplicados al nuevo directorio a crear. lpPathName: Puntero a una cadena de caracteres terminada en nulo que contiene el nombre del nuevo directorio. Este nombre de directorio no deber superar MAX_PATH caracteres de longitud. lpSecurityAttributes: Puntero a un registro TSecurityAttributes que contiene informacin acerca de la herencia de manejadores y la seguridad de ficheros. A este parmetro puede asignrsele nil, que indica que el manejador del directorio no podr

ser heredado por procesos hijos. El registro TSecurityAttributes se define de la siguiente forma: TSecurityAttributes = record nLength: DWORD; lpSecurityDescriptor: Pointer; bInheritHandle: BOOL; end; {tamao del registro TSecurityAttributes} {descriptor de seguridad} {opciones de herencia de manejador}

Los campos de este registro se describen bajo la funcin CreateFile. Note que bajo Windows 95/98 el campo lpSecurityDescriptor de este registro es ignorado.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CreateDirectory, CreateFile, RemoveDirectory

Consulte el Listado 12-3, correspondiente a la funcin CreateDirectory.

CreateFile( lpFileName: PChar; {nombre del fichero a crear o abrir} dwDesiredAccess: Integer; {opciones de acceso de lectura/escritura} dwShareMode: Integer; {opciones de comparticin} lpSecurityAttributes: PSecurityAttributes; {atributos de seguridad} dwCreationDisposition: DWORD; {opciones de creacin/apertura} dwFlagsAndAttributes: DWORD; {atributos de acceso y seguridad de ficheros} hTemplateFile: THandle; {manejador de fichero patrn} ): THandle; {devuelve un manejador del fichero abierto}

Esta funcin abre o crea el fichero especificado por el parmetro lpFileName. Los ficheros pueden abrirse para lectura, escritura o ambas cosas, y pueden ser creados con numerosos atributos de fichero y opciones de acceso. Si un fichero va a ser creado, la funcin aade el atributo FILE_ATTRIBUTE_ARCHIVE a los que se especifiquen en el parmetro dwFlagsAndAttributes, y la longitud del fichero es inicializada a cero bytes. Cuando la aplicacin deja de necesitar el objeto, debe cerrar su manejador llamando a la funcin CloseHandle.

12

lpFileName: Puntero a una cadena de caracteres terminada en nulo que contiene el nombre del fichero a crear o abrir. Esta cadena no deber sobrepasar MAX_PATH caracteres de longitud. dwDesiredAccess: Especifica el tipo de acceso deseado para el fichero. Este parmetro puede contener uno o ms de los valores de la Tabla 12-2. dwShareMode: Especifica cmo el fichero va a ser compartido entre aplicaciones. Si el valor de este parmetro es cero, el fichero no podr ser compartido, y las operaciones de apertura subsiguientes sobre el fichero fallarn hasta que el manejador sea cerrado. Este parmetro puede contener uno o ms de los valores de la Tabla 12-3. lpSecurityAttributes: Puntero a un registro TSecurityAttributes que contiene informacin acerca de la herencia del manejador y la seguridad del fichero. A este parmetro puede asignrsele nil, que indica que el manejador no podr ser heredado por procesos hijos. El registro TSecurityAttributes se define de la siguiente forma: TSecurityAttributes = record nLength: DWORD; lpSecurityDescriptor: Pointer; bInheritHandle: BOOL; end; {tamao del registro TSecurityAttributes} {descriptor de seguridad} {opcin de herencia de manejador}

nLength: Especifica el tamao del registro TSecurityAttributes, en bytes. A este campo se le debe asignar SizeOf(TSecurityAttributes). lpSecurityDescriptor: Puntero a un descriptor de seguridad para el objeto que controla la comparticin del fichero. Si el valor de este campo es nil, al fichero se le asignar el descriptor de seguridad por defecto para el proceso. Si CreateFile va a abrir un fichero, este parmetro es ignorado. Ntese que bajo Windows 95/98 este campo siempre es ignorado. bInheritHandle: Indica si el manejador devuelto por la funcin ser heredado cuando un nuevo proceso sea creado. El valor TRUE indica que los nuevos procesos heredarn el manejador de fichero. dwCreationDisposition: Especifica el comportamiento de la funcin cuando un fichero existe o no existe. Este parmetro puede contener uno o ms de los valores de la Tabla 12-4. dwFlagsAndAttributes: Especifica los atributos del fichero y opciones de acceso. Este parmetro puede contener uno o ms de los valores de la Tabla 12-5. Si CreateFile va a abrir un fichero, este parmetro es ignorado. hTemplateFile: Especifica el manejador de un fichero que ha sido abierto previamente con acceso GENERIC_READ. El fichero que se crea recibir sus atributos del fichero patrn especificado por este parmetro. Ntese que bajo Windows 95/98 esta funcionalidad no est soportada y a este parmetro debe asignrsele cero. Si CreateFile va a abrir un fichero, este parmetro es ignorado.

Si la funcin tiene xito, devuelve un manejador del fichero abierto o creado. Si la funcin falla, devuelve INVALID_HANDLE_VALUE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CloseHandle, CreateDirectory, GetDiskFreeSpace, ReadFile, SetEndOfFile, SetFilePointer, VirtualAlloc, WriteFile

type record array array end var implementation procedure var of of

begin

or

nil

12

end procedure var

array begin

of

or if begin end then

nil

nil nil

end

12

CreateFileMapping( hFile: THandle; {manejador del fichero a mapear} lpFileMappingAttributes: PSecurityAttributes; {atributos de seguridad} flProtect: DWORD; {opciones de proteccin del mapeo} dwMaximumSizeHigh: DWORD; {doble palabra superior de tamao mximo} dwMaximumSizeLow: DWORD; {doble palabra inferior de tamao mximo} lpName: PChar {nombre del objeto de mapeo} ): Thandle; {devuelve manejador del objeto de mapeo}

12

Esta funcin crea un objeto de mapeo de fichero asociado al fichero identificado por el parmetro hFile. Este objeto es una representacin directa del fichero en memoria, y los cambios que se realicen al fichero en memoria se reflejarn en el fichero en disco.

Si el tamao especificado para el fichero mapeado en memoria es mayor que el tamao del fichero en disco, el fichero en disco ser expandido hasta el tamao especificado. Por el contrario, si el tamao del fichero en disco se incrementa ms all del tamao mximo del objeto de mapeo del fichero, el objeto de mapeo del fichero no contendr la informacin extra situada en el fichero. Un fichero mapeado en memoria puede ser compartido entre procesos a travs de la utilizacin de la funcin OpenFileMapping. Una vez que se crea un objeto de mapeo de fichero, la aplicacin puede acceder al contenido del fichero mapeando una vista del fichero mediante la funcin MapViewOfFile. Si dos procesos comparten el mismo manejador de objeto de mapeo, vern exactamente los mismos datos. Sin embargo, si dos procesos mapean un mismo fichero de forma individual (llamando cada uno a la funcin CreateFileMapping para el mismo fichero), los cambios realizados por un proceso no sern vistos por el otro proceso. Cuando la aplicacin termina de utilizar el fichero mapeado en memoria, debe cerrarlo llamando a la funcin UnmapViewOfFile para cada vista del fichero, y a CloseHandle para el manejador de objeto.

hFile: Manejador de un fichero abierto a partir del cual se crea un objeto de mapeo de fichero. Este fichero debe haber sido abierto con opciones de proteccin compatibles con las especificadas en el parmetro flProtect. A este parmetro puede asignrsele THandle($FFFFFFFF), que crear un objeto de mapeo de fichero del tamao que se especifique en el fichero de intercambio de Windows en lugar de un fichero en disco. En este caso, los parmetros dwMaximumSizeHigh y dwMaximumSizeLow debern contener valores. lpFileMappingAttributes: Puntero a un registro TSecurityAttributes que contiene informacin acerca de la herencia del manejador y la seguridad del fichero. A este parmetro puede asignrsele nil, que indica que el manejador no podr ser heredado por procesos hijos. El registro TSecurityAttributes se define de la siguiente forma: TSecurityAttributes = record nLength: DWORD; lpSecurityDescriptor: Pointer; bInheritHandle: BOOL; end;

{tamao de registro TSecurityAttributes} {descriptor de seguridad} {opciones de herencia}

Consulte la funcin CreateFile para ver una descripcin de esta estructura de datos. flProtect: Especifica la proteccin de acceso y los atributos del objeto de mapeo de fichero. Este parmetro puede tomar uno de los valores de la Tabla 12-6, ms cualquier combinacin de valores de la Tabla 12-7. dwMaximumSizeHigh: Especifica la doble palabra ms alta del tamao mximo para el objeto de mapeo de fichero. dwMaximumSizeLow: Especifica la doble palabra ms baja del tamao mximo para el objeto de mapeo de fichero. Si a este parmetro y a dwMaximumSizeHigh se les asigna

cero a ambos, el objeto de mapeo de fichero tendr el mismo tamao que el fichero identificado por el parmetro hFile. lpName: Puntero a una cadena de caracteres terminada en nulo que contiene el nombre del objeto de mapeo de fichero. Esta cadena puede contener cualquier carcter excepto la barra invertida (\). Si este parmetro contiene el nombre de un objeto de mapeo ya existente, la funcin solicitar acceso al objeto ya existente. Este parmetro puede contener nil, si se desea crear un objeto de mapeo annimo.

Si la funcin tiene xito, devuelve un manejador del objeto de mapeo de fichero, ya sea uno nuevo o uno existente (en caso de que lpName apuntara al nombre de un objeto ya existente). En este ltimo caso, GetLastError devolver ERROR_ALREADY_EXISTS. Si la funcin falla, devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CloseHandle, FlushViewOfFile, MapViewOfFile, OpenFileMapping, ReadFile, UnmapViewOfFile, VirtualAlloc, WriteFile

var

implementation function var begin string var

if

then or nil

12

if

then

nil

if begin end

then

if

nil

then

end function begin var

if

then

if

nil

then

end procedure var

begin

while begin

do

end

end procedure var begin if begin then

12
end end

procedure var begin if end procedure begin then

if not if not end

then then

DeleteFile( lpFileName: PAnsiChar ): BOOL;

{nombre del fichero a eliminar} {devuelve TRUE o FALSE}

DeleteFile elimina el fichero indicado en el parmetro lpFileName. Esta funcin fallar si la aplicacin intenta eliminar un fichero inexistente. Bajo Windows NT, la funcin fallar si la aplicacin intenta eliminar un fichero abierto o un fichero que ha sido mapeado a memoria. Bajo Windows 95/98, esas operaciones se realizarn con xito.

12

lpFileName: Una cadena de caracteres terminada en nulo que contiene el nombre del fichero a eliminar.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CloseHandle, CreateFile, RemoveDirectory

Consulte el Listado 12-8, correspondiente a la funcin FindFirstFile.

DosDateTimeToFileTime( wFatDate: WORD; wFatTime: WORD; var lpFileTime: TFileTime ): BOOL;

{fecha de DOS (16 bits)} {hora de DOS (16 bits)} {puntero a registro TFileTime} {devuelve TRUE o FALSE}

Esta funcin convierte valores de fecha y hora de 16 bits de DOS en un registro de 64 bits de tipo TFileTime utilizable por el sistema de ficheros de Windows 95/98/NT.

wFatDate: Especifica la fecha de 16 bits en formato DOS. Se trata de un valor empaquetado de 16 bits cuyos bits definen la fecha segn se describe en la Tabla 12-8. wFatTime: Especifica la hora de 16 bits en formato DOS. Se trata de un valor empaquetado de 16 bits cuyos bits definen la hora segn se describe en la Tabla 12-9. lpFileTime: Puntero a registro de tipo TFileTime que recibir el valor de la combinacin fecha-hora compatible Windows 95/98/NT.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

FileTimeToDosDateTime, FileTimeToLocalFileTime, FileTimeToSystemTime, GetFileTime, LocalFileTimeToFileTime, SetFileTime, SystemTimeToFileTime

Consulte el Listado 12-6, correspondiente a FileTimeToSystemTime.

FileTimeToDosDateTime( const lpFileTime: TFileTime; var lpFatDate: WORD; var lpFatTime: WORD ): BOOL;

{puntero a registro TFileTime} {puntero a buffer que recibir la fecha DOS} {puntero a buffer que recibir la hora DOS} {devuelve TRUE o FALSE}

Esta funcin descompone una fecha-hora de 64 bits de Windows 95/98/NT en dos partes de 16 bits en formato DOS. FileTimeToDosDateTime convierte solamente fechas comprendidas entre 1/1/1980 y 31/12/2107. La funcin fallar si la fecha apuntada por el parmetro lpFileTime est fuera de ese rango.

lpFileTime: Puntero a un registro de tipo TFileTime que contiene la hora de Windows 95/98/NT a descomponer. lpFatDate: Variable que recibir la fecha estilo DOS. Se trata de un valor empaquetado de 16 bits cuyos bits definen la fecha segn se describe en la Tabla 12-10. lpFatTime: Variable que recibir la hora estilo DOS. Se trata de un valor empaquetado de 16 bits cuyos bits definen la hora segn se describe en la Tabla 12-11.

12

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

DosDateTimeToFileTime, FileTimeToLocalFileTime, FileTimeToSystemTime, GetFileTime, LocalFileTimeToFileTime, SetFileTime, SystemTimeToFileTime

Consulte el Listado 12-6, correspondiente a FileTimeToSystemTime.

FileTimeToLocalFileTime( const lpFileTime: TFileTime; var lpLocalFileTime: TFileTime ): BOOL;

{puntero a registro TFileTime} {puntero a registro TFileTime} {devuelve TRUE o FALSE}

La funcin FileTimeToLocalFileTime convierte la hora en coordenadas universales apuntada por el parmetro lpFileTime a hora local.

lpFileTime: Puntero a un registro TFileTime que almacena la hora en coordenadas universales a convertir. lpLocalFileTime: Variable de tipo TFileTime que recibir la hora local convertida.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

DosDateTimeToFileTime, FileTimeToDosDateTime, FileTimeToSystemTime, GetFileTime, LocalFileTimeToFileTime, SetFileTime, SystemTimeToFileTime

Consulte el Listado 12-6, correspondiente a la FileTimeToSystemTime.

FileTimeToSystemTime( const lpFileTime: TFileTime; var lpSystemTime: TSystemTime ): BOOL;

{puntero a registro TFileTime} {puntero a registro TSystemTime} {devuelve TRUE o FALSE}

Esta funcin convierte la hora de 64 bits apuntada por el parmetro lpFileTime a un formato interno del sistema, que se almacenar en el registro TSystemTime apuntado por el parmetro lpSystemTime.

lpFileTime: Puntero a un registro TFileTime que almacena el valor de hora de 64 bits a convertir. lpSystemTime: Puntero a un registro TSystemTime que recibir la hora transformada. El registro TSystemTime se define de la siguiente forma: TSystemTime = record wYear: Word; wMonth: Word; wDayOfWeek: Word; wDay: Word; wHour: Word; wMinute: Word; wSecond: Word; wMilliseconds: Word; end; wYear: Especifica el ao. wMonth: Especifica el nmero del mes, donde 1 = Enero, 2 = Febrero, etc. {ao actual} {nmero del mes} {nmero del da de la semana} {da del mes} {hora} {minuto} {segundo} {milisegundos}

12

wDayOfWeek: Especifica el da de la semana, donde 0 = Domingo, 1 = Lunes, etc. wDay: Especifica el da del mes en el rango de 1 a 31. wHour: Especifica la hora en el rango de 0 a 23 (hora militar). wMinute: Especifica el minuto en el rango de 0 a 59. wSecond: Especifica el segundo en el rango de 0 a 59. wMilliseconds: Especifica los milisegundos en el rango de 0 a 999.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

DosDateTimeToFileTime, FileTimeToDosDateTime, FileTimeToLocalFileTime, GetFileTime, LocalFileTimeToFileTime, SetFileTime, SystemTimeToFileTime

type record

end record

end var

implementation function var begin and and and shr shr

end function var begin and and and end procedure var shr shr

begin nil

if begin

then

or or

if begin end end nil nil

then

12

if not

then

with

do

case begin end else end

of

end procedure var begin if and then

nil end

nil

FindClose( hFindFile: THandle ): BOOL;

{manejador de bsqueda} {devuelve TRUE o FALSE}

12
Esta funcin cierra un manejador de bsqueda de ficheros devuelto por las funciones FindFirstFile y FindNextFile. hFindFile: El manejador de bsqueda de ficheros a cerrar.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

FindFirstFile, FindNextFile

Consulte el Listado 12-8, correspondiente a la funcin FindFirstFile.

FindCloseChangeNotification ( hChangeHandle: THandle ): BOOL;

{manejador de objeto de notificacin de cambios} {devuelve TRUE o FALSE}

Esta funcin desactiva la monitorizacin por el sistema de los cambios que se produzcan sobre un objeto de notificacin de cambios.

hChangeHandle: Manejador de un objeto de notificacin de cambios en el sistema de ficheros, creado mediante una llamada a FindFirstChangeNotification.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

FindFirstChangeNotification, FindNextChangeNotification

Consulte el Listado 12-7, correspondiente a la FindFirstChangeNotification.

FindFirstChangeNotification( lpPathName: PChar; bWatchSubtree: BOOL;

{nombre del directorio a monitorizar} {opcin de monitorizacin de subrbol}

dwNotifyFilter: DWORD ): THandle;

{opciones de cambio} {devuelve un manejador de objeto de notificacin}

Esta funcin crea un objeto de notificacin de cambios en el sistema de ficheros. Esto hace que el sistema monitorice los cambios que puedan producirse en el directorio especificado, como eliminaciones de ficheros o cambios de nombres. Cuando las condiciones especificadas por el parmetro dwNotifyFilter se produzcan, el sistema notificar al objeto de notificacin de cambios que esta funcin produce. El manejador de este objeto puede ser utilizado en combinacin con WaitForSingleObject, para lograr que el hilo que hace la llamada sea suspendido hasta que se produzcan las condiciones indicadas. Despus de la notificacin, el sistema puede continuar monitorizando el directorio especificado pasando el manejador devuelto a la funcin FindNextChangeNotification. Cuando el objeto de notificacin deja de ser necesario, debe ser cerrado mediante una llamada FindCloseChangeNotification. Idealmente, esta funcin ser utilizada en una aplicacin multihilo, en la que ciertos hilos especficos se dedican a monitorizar el objeto de notificacin de cambios.

lpPathName: Puntero a una cadena de caracteres terminada en nulo que contiene el nombre del directorio a monitorizar. bWatchSubtree: Indica si el sistema debe monitorizar nicamente el directorio especificado. Si el valor de este parmetro es FALSE, slo el directorio especificado ser monitorizado; el valor TRUE indica que la monitorizacin debe extenderse tambin a todos los subdirectorios del directorio especificado. dwNotifyFilter: Conjunto de opciones que indican las condiciones bajo las cuales se sealizar una notificacin de cambio. Este parmetro puede contener uno o ms de los valores de la Tabla 12-12.

Si la funcin tiene xito, devuelve un manejador de un objeto de notificacin de cambios en el sistema de ficheros; en caso contrario devuelve INVALID_HANDLE_VALUE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

FindCloseChangeNotification, FindNextChangeNotification

12

var

implementation procedure begin

if begin end else begin

then

end end procedure var begin

while begin

do

if begin

then

if or then else

end end

end

12

FindFirstFile( lpFileName: PChar; {puntero a nombre de fichero} var lpFindFileData: TWin32FindData {puntero a registro TWin32FindData} ): THandle; {devuelve manejador de bsqueda}

Esta funcin busca en el directorio actual el primer fichero cuyo nombre coincida (en el sentido amplio) con el nombre de fichero especificado por el parmetro lpFileName (que puede contener comodines). Esta funcin podr buscar tanto ficheros como subdirectorios.

lpFileName: Puntero a una cadena de caracteres terminada en nulo que contiene la ruta y el nombre de fichero a buscar. Este nombre de fichero puede contener comodines (* y ?). lpFindFileData: Puntero a un registro TWin32FindData que contiene informacin acerca del fichero o subdirectorio encontrado. El registro TWin32FindData se define de la siguiente forma: TWin32FindData = record dwFileAttributes: DWORD; {atributos del fichero} ftCreationTime: TFileTime; {hora de creacin del fichero} ftLastAccessTime: TFileTime; {hora de ltimo acceso} ftLastWriteTime: TFileTime; {hora de ltima modificacin} nFileSizeHigh: DWORD; {doble palabra alta del tamao} nFileSizeLow: DWORD; {doble palabra baja del tamao} dwReserved0: DWORD; {reservado para uso futuro} dwReserved1: DWORD; {reservado para uso futuro} cFileName: array[0..MAX_PATH - 1] of AnsiChar;{nombre largo del fichero} cAlternateFileName: array[0..13] of AnsiChar; {nombre corto del fichero} end; dwFileAttributes: Especifica los atributos del fichero. Consulte la funcin GetFileAttributes para obtener la lista de los posibles atributos de un fichero. ftCreationTime: Especifica la hora a la que el fichero ha sido creado. ftLastAccessTime: Especifica la hora a la que el fichero ha sido accedido por ltima vez. ftLastWriteTime: Especifica la hora a la que el fichero ha sido modificado por ltima vez.

nFileSizeHigh: Especifica la doble palabra alta del tamao del fichero. nFileSizeLow: Especifica la doble palabra baja del tamao del fichero. dwReserved0: Este campo est reservado para uso futuro, y su valor es indefinido. dwReserved1: Este campo est reservado para uso futuro, y su valor es indefinido. cFileName: Una cadena de caracteres terminada en nulo que contiene la versin larga del nombre del fichero. cAlternateFileName: Una cadena de caracteres terminada en nulo que contiene la versin corta (en formato 8.3) del nombre del fichero.

Si la funcin tiene xito, devuelve un manejador de bsqueda que puede ser utilizado en llamadas posteriores a FindNextFile. Si la funcin falla, devuelve INVALID_HANDLE_VALUE.

FindClose, FindNextFile, SearchPath, SetCurrentDirectory

var

implementation

procedure var String begin

if

then

12

if repeat until not

then

end procedure var begin

if begin if

then nil then nil

else or end

end procedure begin if or then begin if if begin or then then

end

end end

procedure var begin

if not

then

12

end

FindNextChangeNotification( hChangeHandle: THandle ): BOOL;

{manejador de objeto de notificacin de cambios} {devuelve TRUE o FALSE}

Esta funcin indica al sistema que contine la monitorizacin de los cambios en el sistema de ficheros especificados por el objeto de notificacin de cambios hChangeHandle bajo las condiciones originales de notificacin. El objeto de notificacin se crea mediante una llamada a la funcin FindFirstChangeNotification. Despus de que la funcin FindNextChangeNotification haya reinicializado el objeto de notificacin de cambios, ste podr utilizarse en combinacin con la funcin WaitForSingleObject para suspender el hilo que hace la llamada hasta que los cambios especificados se produzcan.

hChangeHandle: Manejador de un objeto de notificacin de cambios en el sistema de ficheros, devuelto por FindFirstChangeNotification.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

FindCloseChangeNotification, FindFirstChangeNotification

Consulte el Listado 12-7, correspondiente a FindFirstChangeNotification.

FindNextFile( hFindFile: THandle; {manejador de bsqueda de ficheros} var lpFindFileData: TWin32FindData {puntero a registro TWin32FindData} ): BOOL; {devuelve TRUE o FALSE}

La funcin FindNextFile contina la bsqueda de ficheros que coincidan en el sentido amplio con el nombre de fichero ambiguo (con posibles comodines) especificado en una llamada previa a la funcin FindFirstFile.

hFindFile: Manejador de bsqueda, devuelto por una llamada anterior a FindFirstFile. lpFindFileData: Puntero a registro TWin32FindData que contiene informacin acerca del fichero o subdirectorio encontrado. El registro TWin32FindData se define de la siguiente forma: TWin32FindData = record dwFileAttributes: DWORD; {atributos del fichero} ftCreationTime: TFileTime; {hora de creacin del fichero} ftLastAccessTime: TFileTime; {hora de ltimo acceso} ftLastWriteTime: TFileTime; {hora de ltima modificacin} nFileSizeHigh: DWORD; {doble palabra alta del tamao} nFileSizeLow: DWORD; {doble palabra baja del tamao} dwReserved0: DWORD; {reservado para uso futuro} dwReserved1: DWORD; {reservado para uso futuro} cFileName: array[0..MAX_PATH - 1] of AnsiChar;{nombre largo del fichero} cAlternateFileName: array[0..13] of AnsiChar; {nombre corto del fichero} end; Consulte la funcin FindFirstFile para ver una descripcin detallada de esta estructura de datos.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

FindClose, FindFirstFile, SearchPath

Consulte el Listado 12-8, correspondiente a la funcin FindFirstFile.

FlushFileBuffers( hFile:THandle ): BOOL;

{manejador de un fichero abierto} {devuelve TRUE o FALSE}

12

Esta funcin vaca los buffers del fichero asociado con el manejador especificado en el parmetro hFile, haciendo que los datos que se mantienen en los buffers sean enviados inmediatamente a disco.

hFile: Manejador de fichero abierto cuyos buffers van a ser grabados a disco. El fichero debe haber sido abierto con la opcin GENERIC_WRITE.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CreateFile, WriteFile, ReadFile

Consulte el Listado 12-4, correspondiente a la funcin CreateFile.

FlushViewOfFile( const lpBaseAddress: Pointer; dwNumberOfBytesToFlush: DWORD ): BOOL;

{direccin base de datos mapeados} {cantidad de bytes a grabar} {devuelve TRUE o FALSE}

Esta funcin fuerza al sistema a volcar a disco inmediatamente el rango de bytes especificado de un fichero mapeado en memoria.

lpBaseAddress: Puntero a la direccin base del objeto de fichero mapeado en memoria cuyos datos se desea grabar a disco. dwNumberOfBytesToFlush: Especifica la cantidad de bytes a grabar a disco. Si el valor de este parmetro es cero, todo el contenido del fichero mapeado en memoria ser grabado a disco.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CreateFileMapping, MapViewOfFile, OpenFileMapping, UnmapViewOfFile

Consulte el Listado 12-5, correspondiente a la funcin CreateFileMapping.

GetCurrentDirectory ( nBufferLength: DWORD; {tamao de lpBuffer en caracteres} lpBuffer: PAnsiChar {puntero a buffer que recibir el nombre del directorio} ): DWORD; {devuelve la cantidad de caracteres copiados al buffer}

Esta funcin devuelve la ruta del directorio actual para el proceso que hace la llamada. El directorio se copiar al buffer apuntado por el parmetro lpBuffer.

nBufferLength: Especifica el tamao del buffer apuntado por el parmetro lpBuffer, en bytes, y debe incluir el terminador nulo. lpBuffer: Puntero a un buffer que recibir la ruta absoluta del directorio actual del proceso que hace la llamada. Si el valor de este parmetro es nil, el valor devuelto indicar el tamao de buffer necesario para almacenar el nombre de directorio, incluyendo el terminador nulo.

Si la funcin tiene xito, devuelve la cantidad de caracteres copiados al buffer, sin contar el terminador nulo. Si la funcin falla, devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CreateDirectory, GetSystemDirectory, GetWindowsDirectory, RemoveDirectory, SetCurrentDirectory

Consulte el Listado 12-11, correspondiente a la funcin SetFileAttributes.

12

GetFileAttributes( lpFileName: PChar ): DWORD;

{nombre de fichero cuyos atributos se solicitan} {devuelve atributos del fichero}

Esta funcin devuelve los atributos del fichero o directorio especificado por el parmetro lpFileName.

lpFileName: Una cadena de caracteres terminada en nulo que contiene el nombre del fichero o directorio cuyos atributos se desea recuperar. Esta cadena no debe superar MAX_PATH caracteres de longitud.

Si esta funcin tiene xito, el valor devuelto contiene uno o ms de los valores de la Tabla 12-13, que indican los atributos actuales del fichero o directorio especificado. Si la funcin falla, devuelve $FFFFFFFF. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

FindFirstFile, FindNextFile, SetFileAttributes

Consulte el Listado 12-11, correspondiente a la funcin SetFileAttributes.

GetFileInformationByHandle( hFile: THandle; {manejador de fichero} var lpFileInformation: TByHandleFileInformation {puntero informacin de fichero} ): BOOL; {devuelve TRUE o FALSE}

Esta funcin recupera informacin sobre el fichero asociado con el manejador identificado por el parmetro hFile. GetFileInformationByHandle depende del tipo de sistema de ficheros en el que resida el fichero especificado, y puede devolver informacin parcial, en caso de que el sistema de fichero no soporte ciertas posibilidades.

hFile: Manejador del fichero cuya informacin se recupera. lpFileInformation: Puntero a un registro de tipo TByHandleFileInformation que recibir la informacin relativa al fichero especificado. El registro TByHandleFileInformation se define de la siguiente forma: TByHandleFileInformation = record dwFileAttributes: DWORD; {atributos del fichero} ftCreationTime: TFileTime; {hora de creacin del fichero} ftLastAccessTime: TFileTime; {hora de ltimo acceso al fichero} ftLastWriteTime: TFileTime; {hora de ltima modificacin} dwVolumeSerialNumber: DWORD; {nmero de serie del volumen} nFileSizeHigh: DWORD; {doble palabra alta del tamao del fichero} nFileSizeLow: DWORD; {doble palabra baja del tamao del fichero} nNumberOfLinks: DWORD; {nmero de enlaces al fichero} nFileIndexHigh: DWORD; {doble palabra alta del identificador nico} nFileIndexLow: DWORD; {doble palabra baja del identificador nico} end;

12

dwFileAttributes: Especifica los atributos del fichero. Consulte la funcin GetFileAttributes para conocer los posibles atributos de un fichero. ftCreationTime: Especifica la hora a la que el fichero ha sido creado. ftLastAccessTime: Especifica la hora del ltimo acceso al fichero. ftLastWriteTime: Especifica la hora de ltima modificacin del fichero. dwVolumeSerialNumber: Especifica el nmero de serie del volumen que contiene al fichero. nFileSizeHigh: Especifica la doble palabra alta del tamao del fichero. nFileSizeLow: Especifica la doble palabra baja del tamao del fichero. nNumberOfLinks: Especifica la cantidad de enlaces al fichero. El sistema de ficheros FAT siempre asigna el valor uno (1) a este campo. En otros sistemas de ficheros, como NTFS, este valor puede ser mayor. nFileIndexHigh: Especifica la doble palabra alta del identificador nico asociado al fichero. nFileIndexLow: Especifica la doble palabra baja del identificador nico asociado al fichero.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CreateFile, GetFileAttributes, GetFileTime, GetFileSize

procedure var

String begin

if begin

then

and and and and and and and and

if if

then then

else

12
nil case of

end

end else end

GetFileSize( hFile: THandle; lpFileSizeHigh: Pointer ): DWORD;

{manejador de fichero} {puntero a doble palabra alta del tamao del fichero} {devuelve la doble palabra baja del tamao del fichero}

Esta funcin devuelve el tamao, en bytes, del fichero asociado con el manejador especificado por el parmetro hFile. Este manejador de fichero debe identificar a un fichero en disco.

hFile: Manejador del fichero cuyo tamao se desea recuperar. El fichero debe haber sido abierto con las opciones GENERIC_READ y GENERIC_WRITE.

lpFileSizeHigh: Puntero a variable que recibir la doble palabra alta del tamao del fichero, si el fichero es grande. Si la capacidad del tamao del fichero consultado no exceder la capacidad de una doble palabra, a este parmetro puede asignrsele nil.

Si la funcin tiene xito, devuelve la doble palabra baja del tamao del fichero, y la doble palabra alta se deposita en la variable apuntada por el parmetro lpFileSizeHigh. Si la funcin falla, devuelve $FFFFFFFF. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetFileInformationByHandle, GetFileType

Consulte el Listado 12-9, correspondiente a GetFileInformationByHandle.

GetFileTime( hFile: THandle; lpCreationTime: PFileTime; lpLastAccessTime: PFileTime; lpLastWriteTime: PFileTime ): BOOL;

{manejador de fichero abierto} {buffer que recibir hora de creacin} {buffer que recibir hora de ltimo acceso} {buffer que recibe hora de ltima modificacin} {devuelve TRUE o FALSE}

Esta funcin recupera la hora de creacin, la hora de ltimo acceso y la hora de ltima modificacin del fichero asociado con el manejador especificado en el parmetro hFile.

hFile: Manejador del fichero abierto cuyas horas se desean recuperar. El fichero debe haber sido creado con la opcin de acceso GENERIC_READ. lpCreationTime: Puntero a registro TFileTime que recibir la hora de creacin del fichero. A este parmetro puede asignrsele nil si no se necesita obtener este valor. Bajo Windows 95/98, el resultado ser indefinido. lpLastAccessTime: Puntero a registro TFileTime que recibir la hora del ltimo acceso al fichero. A este parmetro puede asignrsele nil si no se necesita obtener este valor. Bajo Windows 95/98, el resultado ser indefinido. lpLastWriteTime: Puntero a un registro TFileTime que recibir la hora de ltima modificacin del fichero. A este parmetro puede asignrsele nil si no se necesita

12

obtener este valor. Esta es la hora asociada al fichero que muestra el Explorador de Windows.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

FileTimeToLocalFileTime, FileTimeToSystemTime, SetFileTime

Consulte el Listado 12-6, correspondiente a FileTimeToSystemTime.

GetFileType( hFile: THandle ): DWORD;

{manejador de fichero} {devuelve indicador de tipo de fichero}

Esta funcin recupera el tipo de fichero al que est asociado el manejador especificado.

hFile: El manejador de fichero cuyo tipo se desea recuperar.

Si la funcin tiene xito, devuelve uno de los valores de la Tabla 12-14; en caso contrario devuelve cero.

GetFileSize, GetFileTime

Consulte el Listado 12-9, correspondiente a GetFileInformationByHandle.

GetFileVersionInfo( lptstrFilename: PChar; dwHandle: DWORD; dwLen: DWORD; lpData: Pointer ): BOOL;

{puntero a nombre de fichero} {este parmetro es ignorado} {tamao del buffer al que apunta lpData} {puntero a buffer que recibe recurso de versin} {devuelve TRUE o FALSE}

Esta funcin recupera la informacin almacenada en el recurso de versin de fichero asociada al fichero especificado. Tiene sentido nicamente para imgenes de fichero de Win32; fallar si se aplica a imgenes de ficheros de 16 bits.

lptstrFilename: Puntero a una cadena de caracteres terminada en nulo que contiene la ruta y el nombre del fichero cuyo recurso de informacin de versin se desea recuperar. dwHandle: Este parmetro es ignorado. dwLen: Especifica el tamao del buffer apuntado por el parmetro lpData, en bytes. A este parmetro se le debe asignar el valor devuelto por la funcin GetFileVersionInfoSize. lpData: Puntero a buffer que recibir el recurso de informacin de versin del fichero especificado. Este buffer puede ser utilizado en llamadas posteriores a VerQueryValue para recuperar elementos individuales de la informacin de versin del fichero.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetFileVersionInfoSize, LoadResource, VerQueryValue

12

Consulte el Listado 12-12, correspondiente a la funcin VerQueryValue.

GetFileVersionInfoSize( lptstrFilename: PChar; var lpdwHandle: DWORD ): DWORD;

{puntero a nombre de fichero} {variable a la que se asignar cero} {devuelve el tamao del recurso VERSIONINFO}

Esta funcin recupera el tamao del recurso de informacin de versin del fichero especificado, en bytes, que ser utilizado en llamadas posteriores a GetFileVersionInfo. Tiene sentido nicamente para imgenes de fichero de Win32; fallar si se aplica a imgenes de ficheros de 16 bits.

lptstrFilename: Puntero a una cadena de caracteres terminada en nulo que contiene la ruta y el nombre del fichero cuyo tamao de recurso de informacin de versin se desea recuperar. lpdwHandle: Puntero a variable a la que la funcin asignar cero.

Si la funcin tiene xito, devuelve el tamao del recurso de informacin de versin del fichero especificado, en bytes; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetFileVersionInfo, LoadResource, VerQueryValue

Consulte el Listado 12-12, correspondiente a la funcin VerQueryValue.

GetFullPathName( lpFileName: PAnsiChar; nBufferLength: DWORD; lpBuffer: PAnsiChar; var lpFilePart: PAnsiChar ): DWORD;

{nombre de fichero} {tamao de lpBuffer, en caracteres} {puntero a buffer que recibir el nombre completo} {puntero al nombre de fichero dentro de lpBuffer} {devuelve la cantidad de caracteres copiados al buffer}

Esta funcin devuelve la ruta completa (incluyendo la unidad) y el nombre de fichero del fichero identificado por el parmetro lpFileName. Esta funcin no verifica la validez del nombre resultante, ni si ste apunta a un fichero realmente existente. El nombre de fichero devuelto utiliza formato de nombres de fichero largos.

lpFileName: Una cadena de caracteres terminada en nulo que contiene el nombre del fichero cuya ruta completa se desea obtener. nBufferLength: Especifica el tamao del buffer apuntado por el parmetro lpBuffer, en caracteres, y debe incluir el terminador nulo. lpBuffer: Puntero a buffer que recibir la ruta completa incluyendo el nombre de fichero. Si el valor de este parmetro es nil, el valor de retorno de la funcin indicar el tamao de buffer necesario para almacenar la ruta completa y el nombre del fichero. lpFilePart: Puntero a una variable que recibir un puntero a la posicin dentro de lpBuffer donde comienza el nombre del fichero dentro de la ruta completa.

Si la funcin tiene xito, devuelve la cantidad de caracteres copiados al buffer apuntado por el parmetro lpBuffer, incluyendo el terminador nulo. Si la funcin falla, devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetShortPathName, GetTempPath, SearchPath

Consulte el Listado 12-11, correspondiente a la funcin SetFileAttributes.

GetShortPathName ( lpszLongPath: PChar; lpszShortPath: PChar; cchBuffer: DWORD ): DWORD;

{ruta de fichero larga} {puntero a buffer que recibir la ruta corta} {tamao del buffer, en caracteres} {devuelve la cantidad de caracteres copiados al buffer}

12

Esta funcin extrae la versin corta de la ruta especificada por el parmetro lpszLongPath (o sea, una ruta en la que los nombres de directorios se han reducido a 8

caracteres mediante la utilizacin del carcter ~ y el nombre del fichero est en formato 8.3). Si el volumen en el que est situado el fichero cuyo nombre corto se solicita no soporta el formato de nombre de ficheros 8.3, esta funcin devolver ERROR_INVALID_PARAMETER si la longitud de la ruta supera los 67 caracteres.

lpszLongPath: Una cadena de caracteres terminada en nulo que contiene la ruta larga de la que se desea obtener su versin corta. Puede no ser una ruta completa. lpszShortPath: Puntero a un buffer que recibir la versin corta de la ruta especificada en lpszLongPath. Si el valor de este parmetro es nil, el valor devuelto por la funcin indicar el tamao de buffer necesario para almacenar la ruta corta. Este puntero puede coincidir con lpszLongPath. cchBuffer: Especifica el tamao del buffer apuntado por el parmetro lpszShortPath, y debe incluir el terminador nulo.

Si la funcin tiene xito, devuelve la cantidad de caracteres copiados al buffer apuntado por el parmetro lpszShortPath, sin contar el terminador nulo. Si la funcin falla, devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetFullPathName, GetTempPath, FindFirstFile, SearchPath

Consulte el Listado 12-11, correspondiente a la funcin SetFileAttributes.

GetTempFileName( lpPathName: PChar; lpPrefixString: PChar; uUnique: UINT; lpTempFileName: PChar ): UINT;

{puntero a ruta} {puntero a prefijo de nombre de fichero} {nmero nico utilizado en el nombre de fichero} {puntero a buffer que recibir el nombre temporal} {devuelve el nmero nico del nombre de fichero}

Esta funcin crea un nombre de fichero temporal a partir de la ruta, el prefijo y el nmero nico especificados. El nombre de fichero que se crea siempre tiene la extensin .TMP. Los ficheros temporales creados mediante esta funcin no son eliminados automticamente cuando Windows es cerrado.

lpPathName: Puntero a una cadena de caracteres terminada en nulo que contiene la ruta en la que se desea crear el fichero temporal. Tradicionalmente aqu se pasa el valor obtenido de una llamada anterior a GetTempPath. lpPrefixString: Puntero a una cadena de caracteres terminada en nulo que contiene el prefijo que se desea utilizar para el nombre del fichero. Las primeras tres letras del nombre de fichero temporal sern las tres primeras letras de este prefijo. uUnique: Un entero sin signo que es convertido a una cadena hexadecimal que seguir al prefijo en el nombre de fichero temporal. Si este parmetro es distinto de cero, la cadena hexadecimal formada a partir de este valor es aadida al prefijo especificado en lpPrefixString para crear el nombre de fichero temporal, pero el fichero no ser creado y la funcin no verificar que el nombre de fichero obtenido es nico. Si el valor de este parmetro es cero, la funcin utiliza una cadena hexadecimal obtenida a partir de la hora del sistema. La funcin entonces ensamblar el nombre de fichero y, si ste es nico, lo crear en el directorio de destino. Si el nombre no es nico, el nmero hexadecimal ser incrementado en uno y la prueba se repetir, hasta que se obtenga un nombre de fichero nico. lpTempFileName: Puntero a buffer de cadena de caracteres terminada en nulo que recibir el nombre del fichero temporal creado.

Si la funcin tiene xito, devuelve el valor numrico nico utilizado para construir el nombre de fichero temporal; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CreateFile, GetTempPath

var array implementation procedure begin of

12
string string

end procedure var array begin of

string end

GetTempPath( nBufferLength: DWORD; {tamao del buffer} lpBuffer: PChar {puntero al buffer que recibir ruta temporal} ): DWORD; {devuelve la cantidad de caracteres copiados al buffer}

Esta funcin recupera el directorio designado para almacenar ficheros temporales. El directorio se obtiene de la variable de entorno TMP, de la variable de entorno TEMP si TMP no est definida, o el directorio actual si no estn definidas ni TMP ni TEMP.

nBufferLength: Especifica el tamao del buffer apuntado por el parmetro lpBuffer. Si el valor de este parmetro es cero, la funcin devuelve el tamao necesario para almacenar la ruta de ficheros temporales. lpBuffer: Puntero a buffer de cadena de caracteres que recibir la ruta de ficheros temporales.

Si esta funcin tiene xito, devuelve la cantidad de caracteres copiados al buffer, sin contar el terminador nulo. Si la funcin falla, devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetTempFileName

Consulte el Listado 12-10, correspondiente a la funcin GetTempFileName.

LocalFileTimeToFileTime ( const lpLocalFileTime: TFileTime; var lpFileTime: TFileTime ): BOOL;

{puntero a registro TFileTime} {puntero a registro TFileTime} {devuelve TRUE o FALSE}

La funcin LocalFileTimeToFileTime convierte la hora de fichero local especificada por el parmetro lpLocalFileTime en una hora basada en el sistema universal.

lpLocalFileTime: Puntero a registro TFileTime que contiene la hora local a convertir. lpFileTime: Variable de tipo TFileTime que recibir la hora transformada a coordenadas universales (UTC).

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

12

DosDateTimeToFileTime, FileTimeToDosDateTime, FileTimeToLocalFileTime, FileTimeToSystemTime, GetFileTime, SetFileTime, SystemTimeToFileTime

Consulte el Listado 12-6, correspondiente a FileTimeToSystemTime.

LockFile( hFile: THandle; dwFileOffsetLow: DWORD; dwFileOffsetHigh: DWORD; nNumberOfBytesToLockLow: DWORD; nNumberOfBytesToLockHigh: DWORD ): BOOL;

{manejador de fichero abierto} {doble palabra baja de direccin de inicio} {doble palabra alta de direccin de inicio} {doble palabra baja de tamao de zona a bloquear} {doble palabra alta de tamao de zona a bloquear} {devuelve TRUE o FALSE}

Esta funcin reserva una regin de un fichero abierto para su acceso exclusivo por el proceso que hace la llamada. Mientras el fichero est bloqueado, ningn otro proceso tendr acceso de lectura o escritura a la regin bloqueada. Aunque las regiones bloqueadas no pueden solaparse, no provoca error el intento de bloquear una regin que se extienda ms all del final del fichero. Una regin bloqueada puede desbloquearse mediante una llamada a la funcin UnlockFile. Todos los bloqueos que se impongan a un fichero debern eliminarse antes de que el fichero sea cerrado o la aplicacin finalice. Esta funcin slo tiene xito bajo el sistema de ficheros FAT si Share.EXE est ejecutndose.

hFile: Manejador del fichero abierto que se desea bloquear. El fichero debe haber sido creado con alguna de las opciones GENERIC_READ o GENERIC_WRITE. dwFileOffsetLow: Especifica la doble palabra baja de la posicin a partir del inicio del fichero donde comienza la regin a bloquear. dwFileOffsetHigh: Especifica la doble palabra alta de la posicin a partir del inicio del fichero donde comienza la regin a bloquear. nNumberOfBytesToLockLow: Especifica la doble palabra baja de la longitud, en bytes, de la regin a bloquear. nNumberOfBytesToLockHigh: Especifica la doble palabra alta de la longitud, en bytes, de la regin a bloquear.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CreateFile, UnlockFile

Consulte el Listado 12-4, correspondiente a la funcin CreateFile.

MapViewOfFile( hFileMappingObject: THandle; dwDesiredAccess: DWORD; dwFileOffsetHigh: DWORD; dwFileOffsetLow: DWORD; dwNumberOfBytesToMap: DWORD ): Pointer;

{manejador de objeto de mapeo de fichero} {opciones de acceso a vista} {doble palabra alta del desplazamiento} {doble palabra baja del desplazamiento} {cantidad de bytes a mapear} {devuelve un puntero a los datos mapeados}

Esta funcin hace visible y accesible a la aplicacin el rango de bytes indicado del fichero mapeado en memoria especificado por el parmetro hFileMappingObject. La funcin devuelve un puntero al inicio de la memoria mapeada, dando a la aplicacin acceso directo a los datos del fichero.

hFileMappingObject: Manejador de un objeto de mapeo, obtenido como resultado de una llamada a CreateFileMapping o a OpenFileMapping. dwDesiredAccess: Especifica el acceso deseado a la memoria ocupada por la vista del fichero mapeado. Este parmetro puede tomar uno de los valores de la Tabla 12-15. dwFileOffsetHigh: Especifica la doble palabra alta del desplazamiento a partir del inicio del fichero a partir de donde se desea que comience el mapeo. dwFileOffsetLow: Especifica la doble palabra baja del desplazamiento a partir del inicio del fichero a partir de donde se desea que comience el mapeo. El desplazamiento combinado de 64 bits deber ser mltiplo de la granularidad de reserva de memoria del sistema operativo. Esta granularidad puede obtenerse llamando a la funcin GetSystemInfo. dwNumberOfBytesToMap: Especifica la cantidad de bytes del fichero a mapear. Si el valor de este parmetro es cero, el fichero entero ser mapeado a la vista.

12

Si la funcin tiene xito, devuelve un puntero al inicio de la vista mapeada del fichero. Si la funcin falla, devuelve nil. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CreateFileMapping, GetSystemInfo, OpenFileMapping, UnmapViewOfFile

Consulte el Listado 12-5, correspondiente a la funcin CreateFileMapping.

MoveFile( lpExistingFileName: PAnsiChar; {ruta y nombre del fichero existente} lpNewFileName: PAnsiChar {ruta y nombre del nuevo fichero} ): BOOL; {devuelve TRUE o FALSE}

Esta funcin renombra el fichero o directorio identificado por el parmetro lpExistingFileName con el nuevo nombre especificado en el parmetro lpNewFileName. Si un directorio es movido (o sea, renombrado) tambin lo sern sus directorios hijos. Sin embargo, esta funcin fallar si la aplicacin intenta mover el directorio de un volumen a otro.

lpExistingFileName: Una cadena de caracteres terminada en nulo que contiene el nombre (y ruta) del fichero o directorio a renombrar. lpNewFileName: Una cadena de caracteres terminada en nulo que contiene el nuevo nombre y ruta para el fichero o directorio. El nuevo fichero o directorio no deber existir en el momento de la llamada.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CopyFile

Consulte el Listado 12-8, correspondiente a la funcin FindFirstFile.

OpenFileMapping( dwDesiredAccess: DWORD; {opciones de acceso a fichero mapeado} bInheritHandle: BOOL; {opcin de herencia} lpName: PChar {puntero al nombre del objeto de mapeo} ): THandle; {devuelve un manejador de objeto de mapeo de fichero}

Esta funcin abre un objeto de mapeo de fichero existente. Puede tratarse de un objeto de mapeo de fichero creado por el proceso actual o por otro proceso.

dwDesiredAccess: Especifica el tipo de acceso deseado a la memoria ocupada por la vista del fichero mapeado. Este parmetro puede tomar uno de los valores de la Tabla 12-16. bInheritHandle: Indica si el manejador devuelto debe ser heredado si se creasen procesos hijos. El valor TRUE indica que los nuevos procesos heredarn el manejador de fichero devuelto. lpName: Puntero a una cadena de caracteres terminada en nulo que contiene el nombre de un objeto de mapeo de fichero previamente creado mediante CreateFileMapping, ya sea en el proceso actual o en otro proceso. Si se abre un objeto de mapeo de fichero con

12

este nombre, y sus atributos de acceso a memoria no entran en conflicto con los especificados por el parmetro dwDesiredAccess, la funcin tendr xito.

Si la funcin tiene xito, devuelve un manejador del objeto de mapeo especificado; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CreateFileMapping, MapViewOfFile, UnmapViewOfFile

Consulte el Listado 12-5, correspondiente a la funcin CreateFileMapping.

ReadFile( hFile: THandle; {manejador de fichero abierto} var Buffer; {puntero a buffer que recibir los datos} nNumberOfBytesToRead: DWORD; {cantidad de bytes a leer} var lpNumberOfBytesRead: DWORD; {cantidad de bytes ledos} lpOverlapped: POverlapped {puntero a registro TOverlapped} ): BOOL; {devuelve TRUE o FALSE}

Esta funcin recupera la cantidad de bytes especificada por el parmetro nNumberOfBytesToRead del fichero asociado con el manejador especificado en el parmetro hFile. Esos bytes se almacenarn en el buffer apuntado por el parmetro Buffer. El origen de la operacin de lectura dentro del fichero depende de cmo ha sido abierto el fichero y del valor del parmetro lpOverlapped. Generalmente el parmetro lpOverlapped contiene nil, y la operacin de lectura comienza en la posicin actual del puntero. Despus de que la operacin de lectura es efectuada, el puntero del fichero es incrementado en la cantidad de bytes ledos, a menos que el fichero hubiese sido abierto con la opcin FILE_FLAG_OVERLAPPED. En ese caso, el puntero del fichero no es incrementado, y la aplicacin debe mover el puntero del fichero explcitamente. La operacin de lectura fallar si se intenta leer algn fragmento del fichero que haya sido bloqueado con la funcin LockFile. La aplicacin no debe acceder al buffer hasta que la operacin de lectura se haya completado.

hFile: Manejador del fichero del que se desea leer. Este fichero debe haber sido abierto con la opcin GENERIC_READ. Ntese que Windows 95/98 no soporta la lectura asncrona de ficheros en disco. Buffer: Puntero a buffer que recibir la informacin leda del fichero. nNumberOfBytesToRead: Especifica la cantidad de bytes a leer del fichero. lpNumberOfBytesRead: Puntero a una doble palabra que recibir la cantidad de bytes realmente ledos del fichero. Esta variable es inicializada a cero antes de que la lectura comience. Este parmetro debe contener un puntero si el parmetro lpOverlapped tiene valor nil. lpOverlapped: Puntero a un registro TOverlapped. Si el fichero identificado por el parmetro hFile ha sido abierto con la opcin FILE_FLAG_OVERLAPPED, este parmetro debe contener un puntero. Si el fichero ha sido abierto con la opcin FILE_FLAG_OVERLAPPED, la operacin de lectura comenzar en la posicin especificada dentro del registro, y ReadFile puede retornar antes de que la operacin de lectura haya finalizado. En ese caso, ReadFile devolver FALSE, y GetLastError devolver ERROR_IO_PENDING. El evento especificado en el registro TOverlapped ser sealizado al finalizar la operacin de lectura. Si el fichero no ha sido abierto con la opcin FILE_FLAG_OVERLAPPED y este parmetro es distinto de nil, la operacin de lectura comenzar en la posicin especificada dentro del registro y ReadFile no retornar hasta que la operacin de lectura haya finalizado. Si el fichero no ha sido abierto con la opcin FILE_FLAG_OVERLAPPED y este parmetro es nil, la operacin de lectura comenzar a partir de la posicin actual de puntero del fichero y ReadFile no retornar hasta que la operacin de lectura haya finalizado. El registro TOverlapped se define de la siguiente forma: TOverlapped = record Internal: DWORD; {reservado para uso interno}

12

InternalHigh: DWORD; Offset: DWORD; OffsetHigh: DWORD; hEvent: THandle; end;

{reservado para uso interno} {posicin de inicio dentro del fichero} {doble palabra ms alta de la posicin de inicio} {manejador de objeto de evento}

Internal: Este campo est reservado para uso interno del sistema operativo. InternalHigh: Este campo est reservado para uso interno del sistema operativo. Offset: Especifica la doble palabra baja del desplazamiento a partir del cual se desea comenzar la operacin. OffsetHigh: Especifica la doble palabra alta del desplazamiento a partir del cual se desea comenzar la operacin. hEvent: Manejador del objeto de evento que ser sealizado cuando la operacin sea completada.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CreateFile, LockFile, UnlockFile, WriteFile

Consulte el Listado 12-4, correspondiente a la funcin CreateFile.

RemoveDirectory( lpPathName: PAnsiChar ): BOOL;

{nombre del directorio a borrar} {devuelve TRUE o FALSE}

Esta funcin elimina el directorio especificado por el parmetro lpPathName. El directorio no debe contener ficheros, y el proceso que hace la llamada debe tener acceso de borrado al directorio.

lpPathName: Una cadena de caracteres terminada en nulo que contiene la ruta y el nombre del directorio a borrar.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CreateDirectory, CreateDirectoryEx

Consulte el Listado 12-8, correspondiente a la funcin FindFirstFile.

SearchPath( lpPath: PChar; lpFileName: PChar; lpExtension: PChar; nBufferLength: DWORD; lpBuffer: PChar; var lpFilePart: PChar ): DWORD;

{puntero a ruta de bsqueda} {puntero a nombre de fichero} {puntero a extensin de fichero} {tamao del buffer} {puntero a buffer} {puntero al nombre de fichero} {devuelve la cantidad de caracteres copiados}

La funcin SearchPath recorre la ruta apuntada por el parmetro lpPath en busca del nombre de fichero apuntado por el parmetro lpFileName.

lpPath: Puntero a una cadena de caracteres terminada en nulo que contiene la ruta en la que se desea buscar el nombre de fichero especificado. Si el valor de este parmetro es nil, SearchPath buscar en los siguientes directorios, segn el orden: 1. El directorio que contiene la aplicacin. 2. El directorio actual. 3. El directorio de sistema de Windows, segn indica la funcin GetSystemDirectory. 4. El directorio de Windows, segn indica la funcin GetWindowsDirectory. 5. Los directorios listados en la variable de entorno PATH. lpFileName: Puntero a una cadena de caracteres terminada en nulo que contiene el fichero a buscar. lpExtension: Puntero a una cadena de caracteres terminada en nulo que contiene la extensin del fichero, incluyendo el punto. Si la extensin no se necesita, o el nombre de fichero apuntado por el parmetro lpFileName contiene una extensin, a este parmetro puede asignrsele nil.

12

nBufferLength: Especifica el tamao del buffer apuntado por el parmetro lpBuffer, en caracteres. Si el valor de este parmetro es cero, la funcin devuelve el tamao de buffer necesario para almacenar la ruta completa y el nombre del fichero. lpBuffer: Puntero al buffer que recibir la ruta y el nombre del fichero encontrado. lpFilePart: Recibe un puntero a la posicin dentro del buffer donde termina la ruta y comienza el nombre de fichero, inmediatamente despus de la barra invertida final de la ruta.

Si la funcin tiene xito, devuelve la cantidad de caracteres copiados al buffer apuntado por el parmetro lpBuffer. Si la funcin falla, devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

FindFirstFile, FindNextFile, GetSystemDirectory, GetWindowsDirectory, SetCurrentDirectory

Consulte el Listado 12-8, correspondiente a la funcin FindFirstFile.

SetCurrentDirectory( lpPathName: PAnsiChar ): BOOL;

{nombre del nuevo directorio actual} {devuelve TRUE o FALSE}

Esta funcin cambia el directorio actual del proceso que hace la llamada al nuevo directorio identificado por el parmetro lpPathName.

lpPathName: Una cadena de caracteres terminada en nulo que contiene la ruta del nuevo directorio actual. Esta ruta puede ser absoluta o relativa.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetCurrentDirectory

Consulte el Listado 12-11, correspondiente a la funcin SetFileAttributes.

SetEndOfFile( hFile: THandle ): BOOL;

{manejador de fichero abierto} {devuelve TRUE o FALSE}

Esta funcin establece el fin de fichero en la posicin actual del puntero al fichero, ya sea extendindolo o truncndolo. Si el fichero es extendido, el contenido del fichero entre la antigua posicin del fin de fichero y la nueva es indefinido. Si la funcin CreateFileMapping ha sido utilizada para crear un objeto de mapeo de fichero para el fichero asociado con el manejador especificado en el parmetro hFile, la aplicacin debe llamar a UnmapViewOfFile y a CloseHandle para cerrar el objeto de mapeo de fichero antes de poder llamar a SetEndOfFile.

hFile: Manejador del fichero cuya posicin de fin de fichero se desea mover. Este fichero debe haber sido abierto con la opcin GENERIC_WRITE.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CloseHandle, CreateFile, CreateFileMapping, SetFilePointer, UnmapViewOfFile

Consulte el Listado 12-4, correspondiente a la funcin CreateFile.

SetFileAttributes( lpFileName: PChar; dwFileAttributes: DWORD ): BOOL;

12
{nombre de fichero} {atributos} {devuelve TRUE o FALSE}

Esta funcin establece los atributos para el fichero o directorio especificado por el parmetro lpFileName.

lpFileName: Una cadena de caracteres terminada en nulo que contiene el nombre del fichero o directorio al que se desea modificar los atributos. Esta cadena no debe superar en longitud los MAX_PATH caracteres. dwFileAttributes: Especifica los atributos del fichero que se desea establecer. Este parmetro puede contener uno o ms valores de la Tabla 12-17.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetFileAttributes

procedure var array begin if begin nil nil nil nil then nil nil nil nil of

and and and and and and

and and

string string

string

end end procedure var

begin nil nil nil nil nil nil nil nil

if if if if

then or then or then or then or

12

if if if if

then or then or then or then or

if not begin or nil end nil string

then

end procedure begin

end

SetFilePointer( hFile: THandle; {manejador de fichero abierto} lDistanceToMove: LongInt; {distancia a desplazarse, en bytes} lpDistanceToMoveHigh: Pointer; {apunta a doble palabra alta de la distancia} dwMoveMethod: DWORD {origen de desplazamiento} ): DWORD; {devuelve doble palabra baja de la posicin del fichero}

12

Esta funcin reposiciona el puntero del fichero identificado por el parmetro hFile. La nueva posicin se basa en el origen de desplazamiento especificado por el parmetro

dwMoveMethod y el desplazamiento de 64 bits formado por los parmetros lDistanceToMove y lpDistanceToMoveHigh. Si el fichero identificado por el parmetro hFile ha sido abierto con la opcin FILE_FLAG_NO_ BUFFERING, el puntero del fichero slo podr moverse en incrementos del tamao de sector del volumen. El tamao de sector de un volumen puede determinarse llamando a la funcin GetDiskFreeSpace.

hFile: Manejador del fichero abierto cuyo puntero se desea mover. El fichero debe haber sido abierto con alguna de las opciones GENERIC_READ o GENERIC_WRITE. lDistanceToMove: Especifica la doble palabra baja de la distancia, en bytes, que debe moverse el puntero del fichero. Un valor positivo indica que se debe desplazar el puntero del fichero hacia adelante, y un valor negativo indica que se debe desplazar hacia atrs. lpDistanceToMoveHigh: Puntero a la doble palabra alta de la distancia, en bytes, que se desea desplazar el puntero del fichero. A este parmetro puede asignrsele nil, lo que limitar el desplazamiento del puntero a un mximo de 2^32 - 2 bytes. Si este parmetro es distinto de nil, el puntero del fichero podr moverse dentro de un rango de 2^64 - 2 bytes, y el valor apuntado por este parmetro recibir la doble palabra alta de la nueva posicin del puntero del fichero cuando la funcin retorne. dwMoveMethod: Especifica la posicin inicial a partir de la cual debe realizarse el movimiento del puntero del fichero. Puede tomar uno de los valores de la Tabla 12-18.

Si la funcin tiene xito, devuelve la doble palabra baja de la nueva posicin del puntero del fichero. Si la funcin falla, devuelve $FFFFFFFF. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError. Si el parmetro lpDistanceToMoveHigh no es nil y la funcin falla, GetLastError devolver NO_ERROR.

CreateFile, GetDiskFreeSpace, ReadFile, SetEndOfFile, WriteFile

Consulte el Listado 12-4, correspondiente a la funcin CreateFile.

SetFileTime( hFile: THandle; lpCreationTime: PFileTime; lpLastAccessTime: PFileTime; lpLastWriteTime: PFileTime ): BOOL;

{manejador del fichero abierto} {buffer que contiene hora de creacin} {buffer que contiene hora de ltimo acceso} {buffer que contiene hora de ltima modificacin} {devuelve TRUE o FALSE}

Esta funcin establece la hora de creacin, de ltimo acceso y de ltima modificacin del fichero abierto cuyo manejador se entrega en el parmetro hFile.

hFile: Manejador del fichero abierto cuyas horas se desea modificar. El fichero debe haber sido abierto con la opcin de acceso GENERIC_READ. lpCreationTime: Puntero a registro de tipo TFileTime que contiene la hora de 64 bits que ser asignada como la hora de creacin del fichero. Este parmetro puede ser nil si no se desea modificar esta hora. lpLastAccessTime: Puntero a un registro de tipo TFileTime que contiene la hora de 64bits que ser asignada como la hora de ltimo acceso del fichero. Este parmetro puede ser nil si no se desea modificar esta hora. lpLastWriteTime: Puntero a un registro TFileTime que contiene la hora de 64 bits que ser asignada como la hora de ltima modificacin del fichero. Este parmetro puede ser nil si no se desea modificar esta hora. Esta es la hora asociada al fichero que muestra el Explorador de Windows.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

FileTimeToLocalFileTime, FileTimeToSystemTime, GetFileTime

Consulte el Listado 12-6, correspondiente a FileTimeToSystemTime.

12

SystemTimeToFileTime( const lpSystemTime: TSystemTime; {puntero a registro TSystemTime} var lpFileTime: TFileTime {puntero a registro TFileTime} ): BOOL; {devuelve TRUE o FALSE}

Esta funcin convierte el valor almacenado en el registro TSystemTime apuntado por el parmetro lpSystemTime en una hora de fichero de 64 bits.

lpSystemTime: Puntero a registro de tipo TSystemTime que contiene la hora de sistema a convertir. El registro TSystemTime se define de la siguiente forma: TSystemTime = record wYear: Word; wMonth: Word; wDayOfWeek: Word; wDay: Word; wHour: Word; wMinute: Word; wSecond: Word; wMilliseconds: Word; end; {ao} {nmero del mes} {nmero del da de la semana} {da del mes} {hora} {minuto} {segundo} {milisegundos}

Consulte la funcin FileTimeToSystemTime para ver una descripcin de esta estructura de datos. lpFileTime: Puntero a un registro de tipo TFileTime que recibir la hora de 64 bits.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

DosDateTimeToFileTime, FileTimeToDosDateTime, FileTimeToLocalFileTime, FileTimeToSystemTime, GetFileTime, LocalFileTimeToFileTime, SetFileTime

Consulte el Listado 12-6, correspondiente a FileTimeToSystemTime.

UnlockFile( hFile: THandle; dwFileOffsetLow: DWORD; dwFileOffsetHigh: DWORD; nNumberOfBytesToLockLow: DWORD; nNumberOfBytesToLockHigh: DWORD ): BOOL;

{manejador de fichero abierto} {doble palabra baja de direccin de inicio} {doble palabra alta de direccin de inicio} {doble palabra baja de tamao de zona a bloquear} {doble palabra alta de tamao de zona a bloquear} {devuelve TRUE o FALSE}

Esta funcin desbloquea una regin previamente bloqueada de un fichero, permitiendo el acceso a la regin por otros procesos. La regin a desbloquear debe coincidir exactamente con una regin bloqueada previamente mediante una llamada a LockFile. Todas las regiones bloqueadas de un fichero deben ser desbloqueadas antes de que el fichero sea cerrado o la aplicacin finalice.

hFile: Manejador del fichero abierto que se desea desbloquear. El fichero debe haber sido creado con alguna de las opciones GENERIC_READ o GENERIC_WRITE. dwFileOffsetLow: Especifica la doble palabra baja de la posicin a partir del inicio del fichero donde comienza la regin a desbloquear. dwFileOffsetHigh: Especifica la doble palabra alta de la posicin a partir del inicio del fichero donde comienza la regin a desbloquear. nNumberOfBytesToLockLow: Especifica la doble palabra baja de la longitud, en bytes, de la regin a desbloquear. nNumberOfBytesToLockHigh: Especifica la doble palabra alta de la longitud, en bytes, de la regin a desbloquear.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

12

CreateFile, LockFile

Consulte el Listado 12-4, correspondiente a la funcin CreateFile.

UnmapViewOfFile( lpBaseAddress: Pointer ): BOOL;

{puntero a la direccin base de la vista} {devuelve TRUE o FALSE}

Esta funcin elimina una vista de un objeto de mapeo de fichero del espacio de direcciones de un proceso. Un fichero que haya sido mapeado en memoria mediante la funcin CreateFileMapping no ser cerrado hasta que todas las vistas del fichero hayan sido cerradas mediante llamadas a UnmapViewOfFile.

lpBaseAddress: Puntero a la direccin base de la vista mapeada del objeto de mapeo de fichero. Este puntero debe coincidir con la direccin original que fue devuelta por la llamada original a la funcin MapViewOfFile.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CreateFileMapping, MapViewOfFile, OpenFileMapping

Consulte el Listado 12-5, correspondiente a la funcin CreateFileMapping.

VerQueryValue( pBlock: Pointer; lpSubBlock: PChar; var lplpBuffer: Pointer; var puLen: UINT ): BOOL;

{puntero a recurso de versin} {puntero a cadena con nombre de valor} {puntero a buffer que recibe puntero al valor} {puntero a buffer que recibir longitud del valor} {devuelve TRUE o FALSE}

Esta funcin recupera un puntero a la informacin especificada por el parmetro lpSubBlock dentro del recurso de informacin de versin de fichero especificado por el parmetro pBlock. El puntero a esta informacin se almacenar en el buffer apuntado por el parmetro lplpBuffer. Esta funcin slo tiene sentido para imgenes de fichero

Win32; las imgenes de fichero de 16 bits no soportan informacin de versin. Use la funcin GetFileVersionInfo para recuperar el recurso de versin que se debe utilizar en el parmetro pBlock.

pBlock: Puntero a un buffer que contiene el recurso de informacin de versin, tal como es devuelto por GetFileVersionInfo. lpSubBlock: Puntero a una cadena de caracteres terminada en nulo que contiene el tipo de informacin de versin de fichero a recuperar del recurso. Esta cadena puede contener uno de los valores de la Tabla 12-19. La informacin de versin de fichero a recuperar podr ser un registro con informacin especfica, o el nombre del tipo de informacin que se desea. Para utilizar nombres, la aplicacin deber inicialmente utilizar el valor de \\VarFileInfo\\Translation para recuperar un cdigo de traduccin (translation code). Este cdigo ser utilizado en lo sucesivo en lugar de los nombres de valores. Para utilizar el cdigo de versin para especificar cierta informacin, el cdigo de versin deber ser insertado en los nombres en forma de cadena hexadecimal consistente en la concatenacin de las palabras alta y baja del cdigo. Vea ms adelante un ejemplo de utilizacin de cdigos de versin. lplpBuffer: Puntero a un buffer que recibir un puntero a la informacin de versin solicitada. El puntero recibido apuntar a una cadena de caracteres terminada en nulo. puLen: Puntero a un buffer que recibir la longitud de la informacin de versin solicitada en caracteres.

Si esta funcin tiene xito y el recurso de informacin de versin contiene el tipo de informacin solicitada, devuelve TRUE. Si la funcin falla, o no existe informacin del tipo solicitado en el recurso de informacin de versin, devuelve FALSE.

GetFileVersionInfo, GetFileVersionInfoSize, LoadResource

procedure var

12
string begin

if begin

then

string

string

string

string

string if then

string else

string

string

string if then string else

if begin

then and and and and and and

end else begin

12
end end else

begin

end end

El registro TVSFixedFileInfo se define de la siguiente forma: TVSFixedFileInfo = packed record dwSignature: DWORD; dwStrucVersion: DWORD; dwFileVersionMS: DWORD; dwFileVersionLS: DWORD; dwProductVersionMS: DWORD; dwProductVersionLS: DWORD; dwFileFlagsMask: DWORD; dwFileFlags: DWORD; dwFileOS: DWORD; dwFileType: DWORD; dwFileSubtype: DWORD; dwFileDateMS: DWORD; dwFileDateLS: DWORD; end; {firma del registro} {versin del registro} {doble palabra alta de versin del fichero} {doble palabra baja de versin del fichero} {doble palabra alta de versin del producto} {doble palabra baja de versin del producto} {mscara que representa atributos de versin} {opciones de atributos} {tipo de fichero del sistema operativo} {opciones de tipo de fichero} {opciones de subtipo de fichero} {doble palabra alta de hora del fichero} {doble palabra baja de hora del fichero}

dwSignature: Siempre contiene el valor $FEEF04BD. dwStrucVersion: Especifica el nmero de versin del registro, donde la palabra ms alta indica el nmero de versin mayor y la ms baja el nmero de versin menor.

12

dwFileVersionMS: Especifica los 32 bits ms significativos del nmero de versin del fichero. Este valor puede combinarse con el valor del campo dwFileVersionLS para obtener el nmero de versin completo, de 64 bits. dwFileVersionLS: Especifica los 32 bits menos significativos del nmero de versin del fichero. Este valor puede combinarse con el valor del campo dwFileVersionMS para obtener el nmero de versin completo, de 64 bits. dwProductVersionMS: Especifica los 32 bits ms significativos del nmero de versin del producto al que el fichero pertenece. Este valor puede combinarse con el valor del campo dwProductVersionLS para obtener el nmero de versin completo, de 64 bits. dwProductVersionLS: Especifica los 32 bits menos significativos del nmero de versin del producto al que el fichero pertenece. Este valor puede combinarse con el valor del campo dwProductVersionMS para obtener el nmero de versin completo, de 64 bits. dwFileFlagsMask: Mscara de bits que indica cules de los bits del campo dwFileFlags son vlidos. dwFileFlags: Serie de indicadores de un bit que muestran varios atributos del fichero. Este campo puede contener uno o ms valores de la Tabla 12-20. dwFileOS: Especifica el sistema operativo para el que este fichero ha sido diseado. Este campo puede tomar uno de los valores de la Tabla 12-21. dwFileType: Indica el tipo de fichero. Este campo puede tomar uno de los valores de la Tabla 12-22. dwFileSubtype: Indica la funcin del fichero. Este valor depende del valor del campo dwFileType, y puede tomar uno de los valores de la Tabla 12-23. Para valores de dwFileType que no se listan en la tabla, dwFileSubtype contendr cero. Si el parmetro dwFileType contiene VFT_VXD, dwFileSubtype contendr el identificador de dispositivo virtual. dwFileDateMS: Especifica los 32 bits ms significativos de la marca de fecha y hora del fichero. dwFileDateLS: Especifica los 32 bits menos significativos de la marca de fecha y hora del fichero.

12

WriteFile( hFile: THandle; const Buffer; nNumberOfBytesToWrite: DWORD; var lpNumberOfBytesWritten: DWORD; lpOverlapped: POverlapped ): BOOL;

{manejador de fichero abierto} {buffer que contiene los datos a grabar} {cantidad de bytes a grabar al fichero} {recibe la cantidad de bytes grabados} {puntero a registro TOverlapped} {devuelve TRUE o FALSE}

Esta funcin graba la cantidad de bytes especificada por el parmetro nNumberOfBytesToWrite al fichero asociado al manejador especificado en el parmetro hFile. Los bytes a grabar se obtienen del buffer apuntado por el parmetro Buffer. El origen de la operacin de escritura dentro del fichero depende de cmo el fichero ha sido abierto y del valor del parmetro lpOverlapped. Generalmente el parmetro lpOverlapped contiene nil, y la operacin de escritura comienza en la posicin actual del puntero. Despus que la operacin de escritura ha sido efectuada, el puntero del fichero es incrementado en la cantidad de bytes escritos, a menos que el fichero hubiese sido abierto con la opcin FILE_FLAG_OVERLAPPED. En ese caso, el puntero del fichero no es incrementado, y la aplicacin debe mover el puntero del

fichero explcitamente. La operacin de escritura fallar si se intenta grabar sobre algn fragmento del fichero que haya sido bloqueado con la funcin LockFile. La aplicacin no debe acceder al buffer hasta que la operacin de escritura se haya completado.

hFile: Manejador del fichero en el que se desea escribir. El fichero debe haber sido abierto con la opcin GENERIC_WRITE. Ntese que Windows 95/98 no soporta grabaciones asncronas sobre ficheros en disco. Buffer: Puntero a buffer que contiene la informacin a grabar en el fichero especificado. nNumberOfBytesToWrite: Especifica la cantidad de bytes a grabar al fichero. lpNumberOfBytesWritten: Puntero a doble palabra que recibir la cantidad de bytes realmente escritos en el fichero. Esta variable es inicializada a cero antes de que la funcin comience a escribir. Este parmetro debe contener un puntero si el parmetro lpOverlapped es nil. lpOverlapped: Puntero a un registro TOverlapped. Si el fichero identificado por el parmetro hFile ha sido abierto con la opcin FILE_FLAG_OVERLAPPED, este parmetro debe contener un puntero. Si el fichero ha sido abierto con la opcin FILE_FLAG_OVERLAPPED, la operacin de escritura comenzar en la posicin especificada dentro del registro, y WriteFile puede retornar antes de que la operacin de lectura haya finalizado. En ese caso, WriteFile devolver FALSE, y GetLastError devolver ERROR_IO_PENDING. El evento especificado en el registro TOverlapped ser sealizado al finalizar la operacin de escritura. Si el fichero no ha sido abierto con la opcin FILE_FLAG_OVERLAPPED y este parmetro es distinto de nil, la operacin de escritura comenzar en la posicin especificada dentro del registro y ReadFile no retornar hasta que la operacin de escritura haya finalizado. Si el fichero no ha sido abierto con la opcin FILE_FLAG_OVERLAPPED y este parmetro es nil, la operacin de escritura comenzar a partir de la posicin actual de puntero del fichero y ReadFile no retornar hasta que la operacin de escritura haya finalizado. El registro TOverlapped se define de la siguiente forma: TOverlapped = record Internal: DWORD; InternalHigh: DWORD; Offset: DWORD; OffsetHigh: DWORD; hEvent: THandle; end; {reservado para uso interno} {reservado para uso interno} {posicin de inicio dentro del fichero} {doble palabra ms alta de la posicin de inicio} {manejador de objeto de evento}

12

Consulte la funcin ReadFile para ver una descripcin de esta estructura de datos.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

CreateFile, LockFile, ReadFile, SetEndOfFile, UnlockFile

Consulte el Listado 12-4, correspondiente a la funcin CreateFile.

13

Aunque la librera de tiempo de ejecucin de Object Pascal ofrece un amplio conjunto de funciones para la manipulacin y formato de cadenas, Windows ofrece un conjunto de funciones equivalentes que pueden ser tiles para todo lo relacionado con la internacionalizacin. Las funciones de Windows ofrecen a la aplicacin acceso a las cadenas de caracteres internas que se utilizan en los mensajes de error. Adicionalmente, Windows ofrece un mecanismo sencillo para compartir informacin alfanumrica entre procesos.

Las aplicaciones Windows pueden almacenar cadenas de hasta 255 caracteres en lo que se conoce como tablas de tomos. Cada proceso tiene acceso a la tabla de tomos global y a su propia tabla de tomos local. La tabla de tomos global permite hasta 37 elementos y es compartida con los otros procesos. La tabla de tomos local es privada al proceso, e inicialmente tambin tiene un tamao implcito de 37 entradas, pero ese tope puede ser aumentado al crear la tabla mediante una llamada a la funcin InitAtomTable. Las cadenas se aaden a la tabla de tomos mediante las funciones AddAtom o GlobalAddAtom, y se eliminan mediante llamadas a DeleteAtom o GlobalDeleteAtom. Cuando se aade una cadena a una tabla de tomos, el valor devuelto es un nmero que identifica nicamente a esa cadena dentro de la tabla. Las tablas de tomos se utilizan normalmente para almacenar cadenas. Sin embargo, pueden utilizarse adems para almacenar enteros de 16 bits. Para almacenar los enteros se utilizan las mismas funciones que para almacenar cadenas, pero en el caso de los enteros stos deben inicialmente pasarse a travs del filtro MakeIntAtom. MakeIntAtom es una macro de Windows que pro duce un puntero a una cadena de caracteres terminada en nulo que es compatible con las funciones AddAtom y GlobalAddAtom. A partir de ese momento, el dato es tratado como una cadena. Los nmeros de tomo para almacenar enteros estn en el rango que va desde 0 hasta 49151 ($0001 hasta $BFFF), mientras que los nmeros de tomos que representan cadenas de

caracteres estn en el rango que va desde 49152 hasta 65535 ($C000 hasta $FFFF). El nmero cero se utiliza como indicador de error. El uso ms comn de la tabla de tomos global es para compartir cadenas de caracteres entre aplicaciones DDE. En lugar de pasar cadenas como parmetros, la aplicacin que hace la llamada almacena la cadena en la tabla de tomos global y pasa solamente el nmero de tomo de 16 bits. El servidor DDE puede entonces buscar la cadena en la tabla de tomos global utilizando el nmero de tomo. Esta tcnica puede utilizarse tambin para compartir informacin entre aplicaciones regulares pasando el nmero de tomo como parmetro dentro de un mensaje definido por el usuario. La tabla de tomos local existe durante el tiempo de vida del proceso. Cuando un proceso termina, su tabla de tomos es destruida. La tabla de tomos global existe mientras Windows est funcionando, y no es reinicializada hasta que Windows sea cerrado y vuelto a iniciar. Los tomos permanecen en la tabla de tomos global incluso despus de que termine el proceso que las almacen. Es una buena idea siempre eliminar los tomos de las tablas de tomos tan pronto se termina de utilizarlos. Esto se aplica tanto a la tabla global como a las tablas locales. Dado que existe un lmite del tamao de tabla de tomos global e implcitamente tambin para las locales (37 entradas), es sabio utilizar estas estructuras slo durante el tiempo que sea imprescindible. En el caso de la tabla de tomos global, como puede haber varias aplicaciones almacenando simultneamente entradas en la tabla, el lmite para una aplicacin ser normalmente menor que 37. Cada tomo de cadena de caracteres en ambos tipos de tablas lleva asociado un contador de referencias. Cuando las funciones AddAtom o GlobalAddAtom intentan aadir a una tabla de tomos una cadena que ya existe en ella, no se crea una nueva entrada en la tabla; en lugar de ello, el contador de referencias de la entrada existente ser incrementado en uno, y el nmero del tomo ser devuelto como resultado. Cuando se aade a una tabla una cadena que previamente no se encuentra en ella, se crea una nueva entrada y se le asigna uno a su contador de referencias. Por otra parte, las funciones DeleteAtom y GlobalDeleteAtom disminuyen el contador de referencias en uno, y eliminan la entrada de la tabla de tomos slo si el contador alcanza cero. A diferencia de los tomos asociados a cadenas, los tomos enteros NO utilizan contadores de referencia. Las funciones de eliminacin borran siempre los valores enteros de la tabla de tomos inmediatamente. Por desgracia, no hay manera de determinar el valor del contador de referencia de un tomo. Para asegurarse de la eliminacin de un tomo de una tabla, la aplicacin deber llamar continuamente a DeleteAtom o GlobalDeleteAtom hasta que la funcin falle. Una aplicacin slo debe eliminar los tomos que hayan sido colocados por ella misma en las tablas de tomos. Nunca elimine un tomo que haya sido colocado en tablas de tomos por otros procesos.

13
Varias de las funciones de manipulacin de cadenas tienen relacin con la conversin a maysculas o minsculas. Estas operaciones son vlidas tanto para cadenas de caracteres de un byte (ANSI) o de dos bytes (Unicode). Bajo Windows 95/98, las conversiones y comparaciones se realizan utilizando la localidad predeterminada establecida en el Panel de Control. Bajo Windows NT, las conversiones y comparaciones se realizan en base al controlador de idioma seleccionado en el Panel de Control o durante el arranque de Windows. Si no hay un idioma seleccionado, Windows NT realiza las conversiones basndose en el mapeo por defecto de la pgina de cdigo para la localidad del proceso.

Las funciones GetDateFormat, GetTimeFormat, FormatMessage y wvsprintf son funciones que ofrecen posibilidades muy amplias para el formato de cadenas de caracteres. Ofrecen acceso a datos del sistema y recursos de mensajes, y sus resultados se interpretan en el contexto de una localidad especfica. Estas funciones ofrecen una rica variedad de opciones y posibilidades que se solapan en buena medida con las que ofrecen las funciones incorporadas en las libreras de Object Pascal. Sin embargo, el conocimiento de estas funciones es til a la hora de disear aplicaciones internacionales.

Este captulo describe las siguientes funciones de cadenas y tomos:

AddAtom( lpString: PChar ): ATOM;

{cadena a aadir a la tabla de tomos} {devuelve el tomo aadido}

Esta funcin aade la cadena especificada a la tabla de tomos local y devuelve el nmero de tomo. La longitud de la cadena no debe ser superior a 255 caracteres. Si la cadena ya existe en la tabla, su contador de referencias es incrementado. Esta tabla de tomos local es local al proceso y no es visible a otros procesos. Las tablas de tomos locales tienen un tamao predeterminado de 37 entradas. Este tamao mximo puede aumentarse cuando la tabla de tomos local es creada. Si la cadena tiene 255 caracteres o menos, y la llamada a AddAtom falla, la causa ms probable es que la tabla est llena.

13

lpString: Puntero a una cadena de caracteres terminada en nulo a aadir a la tabla de tomos local.

Si la funcin tiene xito, devuelve el nmero de tomo para la cadena que ha sido aadida a la tabla de tomos local. El nmero de atomo es un nmero de 16 bits en el rango entre 49152 y 65535 ($C000 a $FFFF) para cadenas de caracteres, o en el rango entre 1 y 49151 ($0001 a $BFFF) para enteros. Si la funcin falla, devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

DeleteAtom, FindAtom, GetAtomName, GlobalAddAtom, GlobalDeleteAtom, GlobalFindAtom, GlobalGetAtomName, MakeIntAtom

procedure begin end procedure var

begin

string

end

CharLower( lpsz: PChar ): PChar;

{puntero a la cadena o carcter a convertir} {devuelve un puntero a la cadena o carcter convertidos}

Esta funcin convierte un carcter o cada carcter en una cadena de caracteres terminada en nulo a minsculas. Bajo Windows NT, la funcin utiliza el controlador de idioma actualmente seleccionado para la conversin; bajo Windows 95/98, la conversin se basa en la localidad predeterminada.

lpsz: Puntero a la cadena de caracteres terminada en nulo a convertir. Para convertir un nico carcter, cargue el carcter en la palabra menos significativa de lpsz y asigne cero a los 16 bits ms significativos. CharLower verifica inicialmente el contenido de la palabra alta para ver si el parmetro debe interpretarse como un carcter o como un puntero.

Esta funcin devuelve un carcter en la palabra baja si la palabra alta es cero, o un puntero a la cadena de caracteres terminada en nulo que contiene la cadena convertida a minsculas. Esta funcin no indica errores en caso de fallo.

CharLowerBuff, CharUpper, CharUpperBuff

13

procedure type array var of

begin string

string

string

string

string string

string

string end

CharLowerBuff( lpsz: PChar; cchLength: DWORD ): DWORD;

{puntero a la cadena a convertir} {cantidad de caracteres a convertir} {devuelve la cantidad de caracteres procesados}

CharLowerBuff convierte la cantidad especificada de caracteres en la cadena apuntada por el parmetro lpsz a minsculas. Bajo Windows NT, la funcin utiliza el controlador de idioma actualmente seleccionado para la conversin; bajo Windows 95/98, la conversin se basa en la localidad predeterminada. Mediante esta funcin es posible convertir slo una parte de una cadena apuntando con lpsz a la primera posicin a convertir, y especificando la cantidad de caracteres a convertir en el parmetro cchLength. O sea, el parmetro lpsz no tiene que apuntar al inicio de una cadena, y el parmetro cchLength no tiene que reflejar la longitud total de esa cadena.

lpsz: Puntero a la cadena de caracteres terminada en nulo que se va a convertir a minsculas. cchLength: Indica la cantidad de caracteres a convertir. Si se trata de una cadena Unicode, entonces este valor se corresponde con la cantidad de posiciones de carcter ancho (de dos bytes). Esta funcin pasar por encima de un carcter nulo si el valor de cchLength es mayor que la longitud de la cadena.

Si esta funcin tiene xito, devuelve la cantidad de caracteres procesados; en caso contrario devuelve cero.

13

CharLower, CharUpper, CharUpperBuff

Consulte el Listado 13-2, correspondiente a la funcin CharLower.

CharNext( lpsz: PChar ): PChar;

{puntero a carcter actual} {devuelve un puntero al siguiente carcter}

Esta funcin avanza el puntero especificado al siguiente carcter en la cadena.

lpsz: Puntero a un carcter de una cadena de caracteres terminada en nulo.

Si la funcin tiene xito, devuelve un puntero al carcter siguiente al apuntado por el parmetro lpsz. El puntero devuelto apuntar al terminador nulo si lpsz ya apunta al final de la cadena. Si la funcin falla, devuelve el valor del parmetro lpsz.

CharPrev

Consulte el Listado 13-2, correspondiente a la funcin CharLower.

CharPrev( lpszStart: PChar; lpszCurrent: PChar ): PChar;

{puntero al inicio de la cadena} {puntero al carcter actual} {devuelve un puntero al carcter anterior}

Esta funcin devuelve un puntero al carcter anterior al apuntado por lpszCurrent dentro de la cadena apuntada por el parmetro lpszStart.

lpszStart: Puntero al inicio de la cadena. Se suministra para que CharPrev pueda reconocer si el puntero lpszCurrent ya est apuntando al inicio de la cadena. lpszCurrent: Puntero al carcter actual.

Si esta funcin tiene xito, devuelve un puntero al carcter anterior al apuntado por el parmetro lpszCurrent. El valor devuelto apuntar al inicio de la cadena si el parmetro lpszStart es igual a lpszCurrent. Si la funcin falla, devuelve el valor de lpszCurrent.

CharNext

Consulte el Listado 13-2, correspondiente a la funcin CharLower.

CharToOem( lpszSrc: PChar; lpszDst: PChar ): BOOL;

{puntero a la cadena a traducir} {puntero a la cadena traducida} {siempre devuelve TRUE}

CharToOem traduce cada carcter en la cadena especificada a su equivalente en el conjunto de caracteres del fabricante (OEM).

lpszSrc: Puntero a la cadena a traducir al conjunto de caracteres del fabricante (OEM). lpszDst: Puntero al buffer de destino para la cadena traducida. Si el conjunto de caracteres de la cadena original es ANSI (caracteres de un byte), entonces las cadenas de origen y destino pueden coincidir, en cuyo caso la conversin se llevar a cabo in situ. Si el conjunto de caracteres original es Unicode (caracteres de dos bytes), deber especificarse un buffer separado para lpszDst.

Esta funcin siempre devuelve TRUE.

CharToOemBuff, OemToChar, OemToCharBuff

13

procedure var

array array begin

of of

string

string

string

string

string end

CharToOemBuff( lpszSrc: PChar; lpszDst: PChar; cchDstLength: DWORD ): BOOL;

{puntero a la cadena a traducir} {puntero a la cadena traducida} {cantidad de caracteres a traducir} {devuelve TRUE}

CharToOemBuff traduce cierta cantidad de caracteres en la cadena especificada al conjunto de caracteres del fabricante (OEM).

lpszSrc: Puntero a la cadena originar a traducir. lpszDst: Puntero a la cadena de destino traducida. Si el conjunto de caracteres de la cadena original es ANSI (caracteres de un byte), entonces las cadenas de origen y destino pueden coincidir, en cuyo caso la conversin se llevar a cabo in situ. Si el conjunto de caracteres original es Unicode (caracteres de dos bytes), deber especificarse un buffer separado para lpszDst. cchDstLength: La cantidad de caracteres a traducir. Si el conjunto de caracteres es Unicode (caracteres de dos bytes), entonces es la cantidad de pares de bytes (correspondientes a un carcter) que sern traducidos.

Esta funcin siempre devuelve TRUE.

CharToOem, OemToChar, OemToCharBuff

Consulte el Listado 13-3, correspondiente a la funcin CharToOem.

CharUpper( lpsz: PChar ): PChar;

{puntero a la cadena o carcter a convertir} {devuelve un puntero a la cadena o carcter convertidos}

Esta funcin convierte un carcter o todos los caracteres de una cadena de caracteres terminada en nulo a maysculas. Bajo Windows NT, la funcin utiliza el controlador de idioma actualmente seleccionado para la conversin; bajo Win dows 95/98, la conversin se basa en la localidad predeterminada.

13

lpsz: Puntero a la cadena de caracteres terminada en nulo a convertir. Para convertir un slo carcter, cargue el carcter en la palabra menos significativa de lpsz y asigne cero en los 16 bits ms significativos. CharUpper determina a partir de la palabra ms significativa de lpsz si el parmetro representa un carcter o un puntero.

Esta funcin devuelve un carcter en la palabra baja si la palabra alta es cero, o un puntero a la cadena de caracteres terminada en nulo que contiene la cadena convertida a maysculas. Esta funcin no indica errores en caso de fallo.

CharLower, CharLowerBuff, CharUpperBuff

Consulte el Listado 13-2, correspondiente a la funcin CharLower.

CharUpperBuff( lpsz: PChar; cchLength: DWORD ): DWORD;

{puntero a la cadena a convertir} {cantidad de caracteres a convertir} {devuelve la cantidad de caracteres procesados}

CharUpperBuff convierte la cantidad especificada de caracteres de la cadena apuntada por el parmetro lpsz a maysculas. Bajo Windows NT, la funcin utiliza el controlador de idioma actualmente seleccionado para la conversin; bajo Windows 95/98, la conversin se basa en la localidad predeterminada. Mediante esta funcin es posible convertir slo una parte de una cadena apuntando con lpsz a la primera posicin a convertir, y especificando la cantidad de caracteres a convertir en el parmetro cchLength. O sea, el parmetro lpsz no tiene que apuntar al inicio de una cadena, y el parmetro cchLength no tiene que reflejar la longitud total de esa cadena.

lpsz: Puntero a la cadena de caracteres terminada en nulo que se desea convertir a maysculas. cchLength: Indica la cantidad de caracteres a convertir. Si se trata de una cadena Unicode, entonces este valor se corresponde con la cantidad de posiciones de carcter ancho (de dos bytes). Esta funcin pasar por encima de un carcter nulo si el valor de cchLength es mayor que la longitud de la cadena.

Si esta funcin tiene xito, devuelve la cantidad de caracteres que han sido procesados; en caso contrario devuelve cero.

CharLower, CharLowerBuff, CharUpper

Consulte el Listado 13-2, correspondiente a la funcin CharLower.

CompareString( Locale: LCID; dwCmpFlags: DWORD; lpString1: Pchar; cchCount1: Integer; lpString2: PChar; cchCount2: Integer ): Integer;

{identificador de localidad} {opciones de comparacin} {puntero a la primera cadena} {tamao de la primera cadena} {puntero a la segunda cadena} {tamao de la segunda cadena} {devuelve un cdigo de resultado}

CompareString realiza la comparacin de dos cadenas en base a la localidad especificada. El valor de retorno 2 especifica que las dos cadenas son iguales en sentido lexical, aunque puede que sean diferentes. Si las cadenas son de diferentes longitudes pero son lxicamente iguales hasta el final de la ms corta de ellas, la cadena ms larga ser considerada la mayor en la comparacin. Si la opcin SORT_STRINGSORT no es especificada en el parmetro dwCmpFlags, la ordenacin ignorar los guiones y apstrofes. Ello significa que la cadena ITS ser igual a ITS y que DONT ser igual a DONT. Este comportamiento implcito asegura que la presencia de guiones y apstrofes no afectar la ordenacin de cadenas en una lista. Para una comparacin ms estricta, que tenga en cuenta todos los

caracteres, utilice la opcin SORT_STRINGSORT, que considera los guiones y apstrofes segn sus posiciones en las secuencias de ordenacin. Al determinar qu funcin de comparacin utilizar, tenga en cuenta que CompareString ofrece la opcin SORT_STRINGSORT, mientras que lstrcmp y lstrcmpi siempre ignoran los guiones y apstrofes al comparar cadenas. Para obtener mayor velocidad de ejecucin, asigne 1 a los parmetros cchCount1 y cchCount2, y asigne al parmetro dwCmpFlags el valor cero o NORM_IGNORECASE.

13

Locale: El identificador de localidad que se utiliza como base de la comparacin. Este parmetro puede tomar uno de los valores de la Tabla 13-2. dwCmpFlags: Opciones que determinan cmo se llevar a cabo la comparacin. A este parmetro puede asignrsele cero para indicar una comparacin con las opciones por defecto, o cualquier combinacin de valores de la Tabla 13-3. lpString1: Puntero a la primera cadena a comparar. cchCount1: Especifica la longitud de la primera cadena en caracteres (bytes individuales para ANSI, dobles bytes para Unicode). Si este valor es 1, entonces CompareString utilizar el terminador nulo como indicador del fin de la cadena. lpString2: Puntero a la segunda cadena a comparar. cchCount2: Especifica la longitud de la segunda cadena en caracteres (bytes individuales para ANSI, dobles bytes para Unicode). Si este valor es 1, entonces CompareString utilizar el terminador nulo como indicador del fin de la cadena.

Si esta funcin tiene xito, el valor devuelto ser uno de los cdigos de resultado que se describen en la Tabla 13-4. Si la funcin falla, devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetSystemDefaultLCID, GetUserDefaultLCID, lstrcmp, lstrcmpi

procedure var array

of

begin

for

to

do string

and

and

for for

to to

do do begin

if end if

then begin

then begin

end end

for

to

do string

end

13

procedure begin case

of begin

end begin

end begin

end else end end

DeleteAtom( nAtom: ATOM ): ATOM;

{nmero del tomo a eliminar} {devuelve cero o el valor de nAtom}

DeleteAtom disminuye en uno el contador de referencias del tomo especificado de la tabla de tomos local. Si el contador de referencias del tomo llega a cero, la entrada correspondiente es eliminada de la tabla de tomos. Para eliminar tomos de la tabla de tomos global, utilice GlobalDeleteAtom.

nAtom: El nmero de tomo del tomo a eliminar de la tabla de tomos local.

13

Si esta funcin tiene xito, devuelve cero; en caso contrario devuelve el nmero de tomo recibido en el parmetro nAtom. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

AddAtom, FindAtom, GlobalAddAtom, GlobalDeleteAtom

Consulte el Listado 13-1, correspondiente a la funcin AddAtom.

EnumSystemCodePages( lpCodePageEnumProc: TFNCodepageEnumProc; {puntero a funcin de respuesta} dwFlags: DWORD {opciones de seleccin de pginas} ): BOOL; {devuelve TRUE o FALSE}

Esta funcin enumera las pginas de cdigos instaladas o soportadas por el sistema. La funcin de respuesta apuntada por lpCodePageEnumProc ser llamada para cada pgina de cdigos que satisfaga los criterios de seleccin. La funcin de respuesta recibir cada identificador de pgina de cdigos y podr almacenarla segn sus necesidades. El proceso continuar hasta que todas las pginas de cdigos hayan sido recorridas o la funcin de respuesta devuelva cero.

lpCodePageEnumProc: La direccin de la funcin de respuesta suministrada por quien hace la llamada a EnumSystemCodePages. La funcin de respuesta recibir un identificador de pgina de cdigos por cada pgina de cdigos instalada o soportada por el sistema. dwFlags: Determina qu pginas de cdigos se deben comunicar a la funcin de respuesta. Este parmetro puede tomar uno de los valores de la Tabla 13-5.

Si esta funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

EnumSystemCodePagesProc( AnotherCodePage: PChar {puntero a cadena que contiene identificador de pgina} ): Integer; {indica si la enumeracin debe continuar}

Esta funcin de respuesta ser llamada una vez para cada identificador de pgina de cdigos instalada o soportada por el sistema, y puede realizar cualquier tarea necesaria.

AnotherCodePage: Puntero a cadena de caracteres terminada en nulo que contiene el identificador de la pgina de cdigos.

Para continuar la enumeracin, la funcin de respuesta debe devolver uno; en caso contrario debe devolver cero.

EnumSystemLocales

function implementation function begin string end procedure var begin

stdcall

if if not

then then

13
end

EnumSystemLocales( lpLocaleEnumProc: TFNLocaleEnumProc; {puntero a la funcin de respuesta} dwFlags: DWORD {opciones de seleccin de localidad} ): BOOL; {devuelve TRUE o FALSE}

Esta funcin enumera las localidades instaladas o soportadas por el sistema. La funcin de respuesta ser llamada una vez para cada localidad que satisfaga los criterios de seleccin. La funcin de respuesta recibir cada identificador de localidad y podr almacenarlo segn sus necesidades. El proceso continuar hasta que todas las localidades hayan sido procesadas o la funcin de respuesta devuelva cero.

lpLocaleEnumProc: La direccin de la funcin de respuesta suministrada por el que hace la llamada a EnumSystemLocales. La funcin de respuesta recibir un cdigo de localidad por cada una de las localidades instaladas o soportadas. dwFlags: Determina qu localidades se desean enumerar. Este parmetro puede tomar uno de los valores de la Tabla 13-6.

Si esta funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

EnumSystemLocalesProc( AnotherLocale: PChar ): Integer;

{puntero a cadena que contiene cdigo de localidad} {indica si la enumeracin debe continuar}

Esta funcin de respuesta ser llamada una vez para cada localidad instalada o soportada por el sistema.

AnotherLocale: Puntero a una cadena de caracteres terminada en nulo que contiene un cdigo de localidad.

Para continuar la enumeracin, la funcin de respuesta debe devolver uno; en caso contrario debe devolver cero.

EnumSystemCodePages

function implementation function begin

stdcall

end procedure var begin

13

if if not

then then

end

FindAtom( lpString: PChar

{puntero a la cadena a buscar en la tabla de tomos local}

): ATOM;

{devuelve el nmero de tomo de la cadena}

FindAtom busca en la tabla de tomos local la cadena apuntada por el parmetro lpString y devuelve su nmero de tomo si la encuentra. La comparacin de cadenas no distingue maysculas de minsculas. Para buscar un tomo en la tabla de tomos global, utilice la funcin GlobalFindAtom.

lpString: Puntero a la cadena de caracteres terminada en nulo a buscar en la tabla de tomos local.

Si la funcin tiene xito, devuelve el nmero de tomo asociado a la cadena especificada; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

AddAtom, DeleteAtom, GlobalAddAtom, GlobalDeleteAtom, GlobalFindAtom

Consulte el Listado 13-1, correspondiente a la funcin AddAtom.

FormatMessage( dwFlags: DWORD; {opciones de formato} lpSource: Pointer; {puntero al origen del mensaje} dwMessageId: DWORD; {identificador del mensaje} dwLanguageId: DWORD; {identificador de idioma} lpBuffer: Pchar; {puntero a buffer de salida} nSize: DWORD; {tamao del buffer de mensaje en bytes} Arguments: Pointer {puntero a array de argumentos del mensaje} ): DWORD; {devuelve la cantidad de bytes depositados en el buffer}

FormatMessage prepara un mensaje a partir de un identificador de mensaje, una tabla de mensajes, un idioma seleccionado, y un conjunto de opciones de formato. Puede utilizarse tanto para mensajes de usuario como para mensajes de sistema. FormatMessage tomar el identificador de mensaje y buscar en una tabla el mensaje correspondiente en el idioma seleccionado. Si no se especifica un idioma, la funcin buscar el ms adecuado segn una lista con prioridades de alternativas razonables. Al

encontrar la cadena de mensaje adecuada, FormatMessage la procesar utilizando los argumentos suministrados y copiar el resultado al buffer de salida. Si el parmetro dwFlags contiene la opcin FORMAT_MESSAGE_FROM_STRING, la cadena apuntada por lpSource puede contener cdigos especiales que indican dnde deben colocarse los argumentos dentro del buffer de salida y cmo deben formatearse.

13

dwFlags: Un conjunto de opciones que determina cmo trabajar FormatMessage y el significado del parmetro lpSource. Este parmetro puede contener uno o ms valores de la Tabla 13-7, combinado con uno de los valores de la Tabla 13-8 mediante el operador booleano or. El byte menos significativo del valor de este parmetro especifica cmo la funcin FormatMessage produce los cambios de lnea, as como la longitud mxima de una lnea de salida. lpSource: Puntero al origen del mensaje. Puede tratarse de un manejador de mdulo o de un puntero a una cadena de caracteres terminada en nulo, en dependencia de las opciones presentes en el parmetro dwFlags. Si no se especifican la opcin FORMAT_MESSAGE_FROM_HMODULE ni FORMAT_MESSAGE_FROM_STRING, el parmetro lpSource es ignorado. Si se incluye la opcin FORMAT_MESSAGE_FROM_STRING en el parmetro dwFlags, el parmetro lpSource representa un puntero a una cadena de caracteres que contiene texto mezclado con los especificadores de formato que se listan en la Tabla 13-9. dwMessageId: El identificador de mensaje utilizado para buscar en una tabla de mensajes. Este parmetro es ignorado si el parmetro dwFlags contiene la opcin FORMAT_MESSAGE_FROM_STRING. dwLanguageId: El identificador de idioma (32 bits) que especifica qu idioma debe utilizarse a la hora de recuperar el mensaje adecuado de un recurso de tabla de mensajes. Este parmetro es ignorado si el parmetro dwFlags contiene la opcin FORMAT_MESSAGE_FROM_ STRING. Si no se encuentra el mensaje en el idioma solicitado, la funcin devuelve el valor ERROR_RESOURCE_LANG_NOT_FOUND. Si este parmetro contiene cero y la opcin FORMAT_MESSAGE_FROM_STRING no ha sido especificada en el parmetro dwFlags, entonces la funcin buscar la definicin del mensaje en un idioma segn el siguiente orden de prioridad 1. Definicin del mensaje en idioma neutral, si est presente. 2. Identificador de idioma del hilo (thread LANGID). 3. Identificador de idioma predeterminado del usuario. Es el idioma de la localidad predeterminada del usuario. 4. Identificador de idioma predeterminado del sistema. Es el idioma de la localidad predeterminada del sistema. 5. Ingls de EE.UU. 6. Cualquier idioma.

lpBuffer: Puntero a un buffer para el mensaje de salida. Este buffer debe ser preparado por quien hace la llamada, a menos que el parmetro dwFlags contenga la opcin FORMAT_MESSAGE_ALLOCATE_BUFFER. Si esta opcin es especificada, FormatMessage utiliza LocalAlloc para reservar la cantidad de espacio necesaria, almacenando la direccin de ese buffer en el parmetro lpBuffer. Note que la opcin FORMAT_MESSAGE_ALLOCATE_ BUFFER determinar que lpBuffer es un puntero a un puntero al buffer. nSize: Si la opcin FORMAT_MESSAGE_ALLOCATE_BUFFER est presente en el parmetro dwFlags, nSize especifica la cantidad mnima de bytes a reservar para el buffer de salida. La memoria es reservada por FormatMessage mediante una llamada a LocalAlloc, y debe ser devuelta por el programador mediante una llamada a LocalFree. Si la opcin FORMAT_MESSAGE_ALLOCATE_BUFFER no se especifica, nSize indica el tamao mximo del buffer de salida. Arguments: Puntero a un array de argumentos de 32 bits que se utilizan para rellenar los puntos de insercin de la cadena apuntada por el parmetro lpSource. Si esta cadena contiene un cdigo de punto de insercin de argumento (en el estilo %n tpico de la funcin printf de la librera de C, consulte la Tabla 13-9), el nmero indicado por el cdigo de punto de insercin determina qu elemento del array ser utilizado para sustituir ese cdigo. Por ejemplo, si el cdigo de punto de insercin de argumento es %1, se utilizar el primer elemento del array; un cdigo de punto de insercin de %2 utilizar el segundo elemento del array, y as sucesivamente. El formato de los argumentos depender de cdigos adicionales que se asocien a los puntos de insercin. Si no se especifican cdigos adicionales de formato para un argumento, el argumento ser tratado como un PChar.

Si la funcin tiene xito, devuelve la cantidad de bytes copiados al buffer de salida, sin contar el terminador nulo. Si la funcin falla, devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

LoadString, LocalFree

function implementation function external

stdcall

name

procedure

13

const var array of

begin

or

string

or string

or string

or nil nil string

if end

then

13

GetACP: UINT;

{devuelve un identificador de pgina de cdigos ANSI}

GetACP obtiene el identificador de la pgina de cdigos ANSI actual del sistema. Si no hay una pgina de cdigos definida, la funcin devolver el identificador de la pgina de cdigos predefinida.

Si la funcin tiene xito, devuelve un identificador de pgina de cdigos ANSI de la Tabla 13-10; en caso contrario devuelve cero.

GetCPInfo, GetOEMCP

13

procedure var

begin case of

else end

if not then else

for if end

downto

do then

GetAtomName( nAtom: ATOM; lpBuffer: PChar; nSize: Integer ): UINT;

{nmero de tomo} {puntero a buffer que recibe el nombre} {longitud del buffer} {devuelve la cantidad de caracteres copiados al buffer}

Esta funcin busca la cadena asociada con el nmero de tomo especificado en la tabla de tomos local. Si el tomo almacenado es un entero, el nmero ser devuelto en formato de cadena de caracteres. Para recuperar un tomo de la tabla de tomos global, utilice la funcin GlobalGetAtomName.

nAtom: El nmero de tomo del tomo cuya cadena asociada se desea recuperar. lpBuffer: Puntero a un buffer donde la funcin colocar los resultados de la bsqueda. El buffer deber tener el tamao suficiente para almacenar la cadena y el terminador nulo. nSize: Especifica el tamao del buffer apuntado por el parmetro lpBuffer.

Si esta funcin tiene xito, el buffer apuntado por el parmetro lpBuffer contendr la cadena asociada con el nmero de tomo especificado, y la funcin devuelve la cantidad de caracteres copiados al buffer. Si la funcin falla, devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

13

AddAtom, DeleteAtom, FindAtom, GlobalAddAtom, GlobalDeleteAtom, GlobalFindAtom, GlobalGetAtomName

Consulte el Listado 13-1, correspondiente a la funcin AddAtom.

GetCPInfo( CodePage: UINT; var lpCPInfo: TCPInfo ): BOOL;

{identificador de pgina de cdigos} {puntero a registro TCPInfo} {devuelve TRUE o FALSE}

Esta funcin recupera informacin acerca de la pgina de cdigos especificada y coloca el resultado en un registro TCPInfo.

CodePage: El identificador de pgina de cdigos cuya informacin se solicita. Este parmetro puede tomar adems uno de los valores de la Tabla 13-11. lpCPInfo: Puntero a un registro TCPInfo que recibir la informacin sobre la pgina de cdigos. El registro TCPInfo se define de la siguiente forma: TCPInfo = record MaxCharSize: UINT; {longitud mxima de un carcter en bytes} DefaultChar: array[0..MAX_DEFAULTCHAR - 1] of Byte; {carcter predeterminado} LeadByte: array[0..MAX_LEADBYTES - 1] of Byte; {rangos de bytes} end; MaxCharSize: Especifica la longitud predeterminada, en bytes, de un carcter en esta pgina de cdigos (1 para ANSI, 2 para Unicode). DefaultChar: Especifica el carcter predeterminado a utilizar en las conversiones a esta pgina de cdigos.

LeadByte: Especifica un array de rangos de bytes de prefijo. Los rangos de bytes de prefijo se utilizan solamente en pginas de cdigos de conjunto de caracteres de dobles bytes.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetACP, GetOemCP

Consulte el Listado 13-9, correspondiente a la funcin GetACP.

GetDateFormat( Locale: LCID; dwFlags: DWORD; lpDate: PSystemTime; lpFormat: PChar; lpDateStr: PChar; cchDate: Integer ): Integer;

{localidad para especificar el formato de fecha} {opciones de formato} {puntero a la fecha a formatear} {puntero a cadena de formato} {puntero a buffer para fecha formateada} {tamao de buffer de salida} {devuelve la cantidad de caracteres copiados al buffer}

Esta funcin formatea una fecha a partir de la cadena y opciones de formato especificadas. Puede utilizarse una fecha especfica o la fecha del sistema.

Locale: El identificador de localidad para el que se formatea la fecha. Si lpFormat es nil, la fecha es formateada de acuerdo al formato de fecha predeterminado para esta localidad. Si el parmetro lpFormat contiene una cadena de formato, la localidad ser utilizada nicamente para completar la informacin no especificada en el parmetro lpFormat. A este parmetro puede asignrsele uno de los valores de la Tabla 13-12.

dwFlags: Indica las opciones de formato si el parmetro lpFormat es nil. Si el parmetro lpFormat es diferente de nil, entonces dwFlags deber ser cero. Si el parmetro lpFormat es nil, entonces dwFlags puede ser cualquier combinacin de valores de la Tabla 13-13. lpDate: Puntero a un registro TSystemTime que contiene la fecha a formatear. Si el valor de este parmetro es nil, se utilizar la hora actual del sistema. El registro TSystemTime se define de la siguiente forma: TSystemTime = record wYear: Word; wMonth: Word; wDayOfWeek: Word; wDay: Word; wHour: Word; wMinute: Word; wSecond: Word; wMilliseconds: Word; end; {ao} {mes} {da de la semana} {da del mes} {hora} {minuto} {segundos} {milisegundos}

13

Consulte la funcin GetSystemTime para ver una descripcin de esta estructura de datos. lpFormat: Puntero a una cadena que contiene el patrn de formato. Si este parmetro es nil, se utilizar el formato de fecha predeterminada para la localidad especificada. Esta cadena puede contener los cdigos de formato especificados en la Tabla 13-14. Los espacios que se incluyan en esta cadena sern mostrados en la salida tal como aparecen en el formato. Adems de espacios, pueden utilizarse otros caracteres encerrados entre apstrofes. lpDateStr: Puntero al buffer de la cadena que recibir la cadena con la fecha formateada. cchDate: Indica el tamao de buffer de salida apuntado por el parmetro lpDateStr, en caracteres. Si este parmetro es cero, la funcin devuelve la cantidad de caracteres que seran necesarios para almacenar la salida formateada, y el parmetro lpDateStr es ignorado.

Si la funcin tiene xito, devuelve la cantidad de caracteres copiados a lpDateStr; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetTimeFormat, SystemTime

procedure var

array begin

of

nil nil

end

13

GetOEMCP: UINT;

{devuelve el identificador de la pgina de cdigos OEM}

GetOEMCP obtiene el identificador de pgina de cdigos del fabricante (OEM) del sistema. Si no hay una pgina de cdigos definida, la funcin devuelve el identificador de pgina de cdigos por defecto.

Si la funcin tiene xito, devuelve el identificador de pgina de cdigos OEM de la Tabla 13-15; en caso contrario devuelve cero.

GetCPInfo, GetACP

procedure var

begin case of

else

end if not then else

13

for if end

downto

do then

GetTimeFormat( Locale: LCID; dwFlags: DWORD; lpTime: PSystemTime; lpFormat: PChar; lpTimeStr: PChar; cchTime: Integer ): Integer;

{identificador de localidad} {opciones de formato} {puntero a la hora a formatear} {puntero a cadena de formato} {puntero a buffer para salida formateada} {tamao del buffer de salida} {devuelve la cantidad de caracteres copiados al buffer}

Esta funcin formatea una fecha en base a la cadena de formato y a las opciones especificadas. Puede especificarse una hora o utilizar la hora del sistema.

Locale: El identificador de localidad para el que se formatea la fecha. Si lpFormat es nil, la hora es formateada de acuerdo al formato de hora predeterminado para esta localidad. Si el parmetro lpFormat contiene una cadena de formato, la localidad ser utilizada nicamente para completar la informacin no especificada en el parmetro lpFormat. A este parmetro puede asignrsele uno de los valores de la Tabla 13-16. dwFlags: Especifica las opciones de formato de fecha. Este parmetro puede tomar cualquier combinacin de valores de la Tabla 13-17. lpTime: Puntero a un registro TSystemTime que contiene la hora a formatear. Si el valor de este parmetro es nil, se utilizar la hora actual del sistema. El registro TSystemTime se define de la siguiente forma: TSystemTime = record wYear: Word; wMonth: Word; wDayOfWeek: Word; wDay: Word; wHour: Word; wMinute: Word; wSecond: Word; {ao} {mes} {da de la semana} {da del mes} {hora} {minuto} {segundos}

wMilliseconds: Word; end;

{milisegundos}

13

Consulte la funcin GetSystemTime para ver una descripcin de esta estructura de datos. lpFormat: Puntero a una cadena que contiene el patrn de formato. Si este parmetro es nil, se utilizar el formato de hora predefinido de la localidad. Esta cadena contiene cdigos de formato que se listan en la Tabla 13-18. Los cdigos de formato distinguen entre maysculas y minsculas. Los caracteres colocados entre apstrofes en la cadena de formato aparecern tal cual en el buffer de salida, sin ser utilizados como especificadores de formato. Una formato de hora tpico como 12:45 AM podra obtenerse especificando en el parmetro lpFormat la cadena hh":"mm tt. Si alguno de los marcadores de horas (t o tt) es usado y la opcin TIME_NOTIMEMARKER no ha sido establecida en el parmetro dwFlags, la informacin sobre marcadores de hora se formatear segn los convenios de la localidad. lpTimeStr: Puntero al buffer para la cadena que recibir la hora formateada. cchTime: Indica el tamao del buffer de salida apuntado por el parmetro lpTimeStr, en caracteres. Si este parmetro es cero, la funcin devuelve la cantidad de caracteres que se requeriran para almacenar la cadena resultante, y el parmetro lpTimeStr es ignorado.

Si la funcin tiene xito, devuelve la cantidad de caracteres copiados a lpDateStr; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError. No se comunican errores en caso de cadenas de formato mal construidas. GetTimeFormat simplemente intentar hacer todo lo posible para producir la cadena utilizando el formato suministrado. Si se especifica hhh o ttt en la cadena de formato, se utilizarn hh y tt en su lugar.

GetDateFormat

procedure var array of

begin

if if begin

then then

nil

end

if

and

then

end

13

GlobalAddAtom( lpString: PChar ): ATOM;

{cadena a aadir a la tabla de tomos} {devuelve el tomo recin aadido}

Esta funcin aade la cadena especificada a la tabla de tomos global y devuelve el nmero de tomo asignado a la cadena. La cadena no puede tener ms de 255 caracteres. Si la cadena ya existe en la tabla, su contador de referencias se incrementa en uno. La tabla de tomos global es compartida por todos los procesos activos en el sistema, y tiene un tamao fijo de 37 entradas.

lpString: Puntero a una cadena de caracteres terminada en nulo a aadir a la tabla de tomos global.

Si la funcin tiene xito, devuelve el nmero de tomo asociado a la cadena que ha sido aadida a la tabla de tomos global. El valor del tomo es un nmero de 16 bits en el rango entre 49152 y 65535 ($C000 a $FFFF) para cadenas, o en el rango de 1 a 49151 ($0001 to $BFFF) para enteros. Si la funcin falla, devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

AddAtom, DeleteAtom, FindAtom, GetAtomName, GlobalDeleteAtom, GlobalFindAtom, GlobalGetAtomName, MakeIntAtom

procedure var

begin string

13
string

end

GlobalDeleteAtom( nAtom: ATOM ): ATOM;

{nmero del tomo a eliminar} {devuelve cero o el valor de nAtom}

GlobalDeleteAtom disminuye en uno el contador de referencias del tomo especificado en la tabla de tomos global. Si el contador de referencias del tomo especificado es cero, la entrada es eliminada de la tabla de tomos. Para eliminar un tomo de la tabla de tomos local, utilice DeleteAtom.

nAtom: El nmero de tomo del tomo a eliminar de la tabla de tomos global.

Si esta funcin tiene xito, devuelve cero; en caso contrario devuelve el nmero del tomo en el parmetro nAtom. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

AddAtom, FindAtom, DeleteAtom, GlobalAddAtom

Consulte el Listado 13-13, correspondiente a la funcin GlobalAddAtom.

GlobalFindAtom( lpString: PChar ): ATOM;

{puntero a la cadena a buscar en la tabla de tomos global} {devuelve el nmero de tomo de la cadena}

GlobalFindAtom busca en la tabla de tomos global la cadena apuntada por el parmetro lpString, y devuelve su nmero de tomo si la encuentra. La comparacin de cadenas no distingue entre maysculas y minsculas. Para buscar un tomo en la tabla de tomos local, utilice la funcin FindAtom.

lpString: Puntero a la cadena de caracteres terminada en nulo que se desea buscar en la tabla de tomos global.

Si la funcin tiene xito, devuelve el nmero de tomo para la cadena especificada; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

AddAtom, FindAtom, DeleteAtom, GlobalAddAtom, GlobalDeleteAtom

Consulte el Listado 13-13, correspondiente a la funcin GlobalAddAtom.

GlobalGetAtomName( nAtom: ATOM; lpBuffer: PChar; nSize: Integer ): UINT;

{nmero de tomo} {puntero a buffer que recibe el nombre} {longitud del buffer} {devuelve la cantidad de caracteres copiados al buffer}

Esta funcin busca la cadena asociada al nmero de tomo especificado en la tabla de tomos global. Si se trataba de un valor entero, el valor ser devuelto en formato de cadena. Para recuperar una cadena de la tabla de tomos local, utilice la funcin GetAtomName.

nAtom: El nmero de tomo cuya cadena se desea recuperar. lpBuffer: Puntero a un buffer donde la funcin colocar la cadena obtenida. El buffer debe tener el espacio suficiente para almacenar la cadena, as como el terminador nulo. nSize: Especifica el tamao del buffer apuntado por el parmetro lpBuffer.

Si esta funcin tiene xito, el buffer apuntado por el parmetro lpBuffer contendr la cadena asociada con el nmero de tomo especificado, y la funcin devolver la cantidad de caracteres copiados al buffer. Si la funcin falla, devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

13

AddAtom, DeleteAtom, FindAtom, GetAtomName, GlobalAddAtom, GlobalDeleteAtom, GlobalFindAtom

Consulte el Listado 13-13, correspondiente a la funcin GlobalAddAtom.

InitAtomTable( nSize: DWORD ): BOOL;

{cantidad de entradas para la tabla de tomos local} {devuelve TRUE o FALSE}

Esta funcin inicializar la tabla de tomos local para que pueda contener la cantidad especificada de entradas. Si InitAtomTable no es llamada, la tabla de tomos local tendr un tamao predefinido de 37 entradas. Si se desea aumentar el tamao de la tabla de tomos local, InitAtomTable debe ser llamada antes de ninguna otra funcin de acceso a la tabla de tomos local.

nSize: La cantidad de entradas deseada para la tabla de tomos locales. Para un rendimiento ptimo, este valor debe ser un nmero primo.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE.

AddAtom, DeleteAtom, FindAtom, GetAtomName, GlobalAddAtom, GlobalDeleteAtom, GlobalFindAtom, GlobalGetAtomName

Consulte el Listado 13-1, correspondiente a la funcin AddAtom.

IsCharAlpha( ch: Char ): BOOL;

{carcter a comprobar} {devuelve TRUE o FALSE}

IsCharAlpha verifica si el carcter ch es un carcter alfabtico. El idioma seleccionado durante el arranque o en el Panel de Control determina cmo se realizar la comprobacin.

ch: El carcter a comprobar.

Si esta funcin tiene xito y el carcter es un carcter alfabtico, devuelve TRUE. Si la funcin falla, o el carcter no es un carcter alfabtico, devuelve FALSE.

IsCharAlphaNumeric

procedure var begin

if if if if end

then then then then

IsCharAlphaNumeric( ch: Char ): BOOL;

{carcter a comprobar} {devuelve TRUE o FALSE}

IsCharAlphaNumeric verifica si el carcter ch es un carcter alfabtico o numrico. El idioma seleccionado durante el arranque o en el Panel de Control determina cmo se realizar la comprobacin.

13

ch: El carcter a comprobar.

Si esta funcin tiene xito y el carcter es un carcter alfabtico o numrico, devuelve TRUE. Si la funcin falla, o el carcter no es un carcter alfabtico, devuelve FALSE.

IsCharAlpha

Consulte el Listado 13-14, correspondiente a la funcin IsCharAlpha.

IsCharLower( ch: Char ): BOOL;

{carcter a comprobar} {devuelve TRUE o FALSE}

IsCharLower determina si el carcter especificado es o no una letra minscula.

ch: El carcter a comprobar.

Si esta funcin tiene xito y el carcter es una letra minscula, devuelve TRUE. Si la funcin falla, o el carcter no es una letra minscula, devuelve FALSE.

IsCharUpper

Consulte el Listado 13-14, correspondiente a la funcin IsCharAlpha.

IsCharUpper( ch: Char ): BOOL;

{carcter a comprobar} {devuelve TRUE o FALSE}

IsCharUpper determina si el carcter especificado es o no una letra mayscula.

ch: El carcter a comprobar.

Si esta funcin tiene xito y el carcter es una letra mayscula, devuelve TRUE. Si la funcin falla, o el carcter no es una letra mayscula, devuelve FALSE.

IsCharLower

Consulte el Listado 13-14, correspondiente a la funcin IsCharAlpha.

lstrcat( lpString1: PChar; lpString2: PChar ): PChar;

{cadena base y direccin de destino} {cadena a concatenar} {devuelve un puntero a la cadena resultante}

lstrcat concatena dos cadenas de caracteres terminadas en nulo, dejando la cadena resultante en el buffer al que apunta el parmetro lpString1. La cadena de caracteres resultante consiste en la cadena apuntada por el parmetro lpString1 seguida por la cadena apuntada por el parmetro lpString2.

lpString1: Puntero a una cadena de caracteres terminada en nulo. Esta cadena debe terner el espacio suficiente para contener ambas cadenas. lpString2: Puntero a una cadena de caracteres terminada en nulo. Esta cadena se concatenar al final de la cadena apuntada por el parmetro lpString1.

Si la funcin tiene xito, devuelve un puntero al resultado de la concatenacin (lpString1); en caso contrario devuelve nil. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

13

lstrcmp, lstrcmpi, lstrcpy, lstrlen

procedure var begin

end

lstrcmp( lpString1: PChar; lpString2: PChar ): Integer;

{puntero a la primera cadena a comparar} {puntero a la segunda cadena a comparar} {devuelve resultado de comparacin}

lstrcmp es una funcin sencilla de comparacin de funciones. CompareString debe utilizarse ms frecuentemente en lugar de lstrcmp debido a su mayor flexibilidad. lstrcmp no ofrece opciones y solamente se interpreta en el contexto de la localidad actual. Si no hubiese una localidad instalada o seleccionada en el Panel de Control, entonces Windows utilizar una localidad predeterminada. Las dos cadenas se comparan utilizando un algoritmo que funciona carcter a carcter, de forma similar a como opera la funcin CompareString cuando no se utiliza la opcin SORT_STRINGSORT. Si las dos cadenas son idnticas hasta el final de una de las dos, entonces la cadena ms corta es considerada la menor. Esta funcin tiene menos opciones que CompareString, pero consecuentemente es un poco ms eficiente.

lpString1: Puntero a la primera cadena de caracteres terminada en nulo a comparar. lpString2: Puntero a la segunda cadena de caracteres terminada en nulo a comparar.

La funcin devuelve un entero que indica el resultado de la comparacin. Este ser uno de los valores de la Tabla 13-19. Esta funcin no indica un error si falla.

CompareString, lstrcmpi, lstrcat, lstrcpy, lstrlen

procedure var begin if then begin

end else if

then begin

end else begin

13

end end

lstrcmpi( lpString1: PChar; lpString2: PChar ): Integer;

{puntero a la primera cadena a comparar} {puntero a la segunda cadena a comparar} {devuelve resultado de comparacin}

Esta funcin se comporta exactamente igual que lstrcmp, con la excepcin de que la comparacin se hace sin distinguir maysculas de minsculas.

lpString1: Puntero a la primera cadena de caracteres terminada en nulo a comparar. lpString2: Puntero a la segunda cadena de caracteres terminada en nulo a comparar.

La funcin devuelve un entero que indica el resultado de la comparacin. Este ser uno de los valores de la Tabla 13-20. Esta funcin no indica errores en caso de fallo.

CompareString, lstrcmp, lstrcat, lstrcpy, lstrlen

procedure var begin if then begin

end else if

then begin

end else begin

end end

lstrcpy( lpString1: PChar; lpString2: PChar ): PChar;

{puntero a buffer de destino} {puntero a la cadena a copiar} {devuelve un puntero al buffer de destino}

lstrcpy copia la cadena apuntada por el parmetro lpString2 al buffer apuntado por el parmetro lpString1. Es una rutina de copia de propsito general que puede utilizarse para copiar cualquier registro terminado en nulo independientemente de su longitud. El buffer de destino debe reservarse antes de llamar a lstrcpy.

13

lpString1: Puntero al buffer de destino. Este buffer debe tener el tamao suficiente para almacenar la cadena apuntada por el parmetro lpString2, incluyendo el carcter nulo. lpString2: Puntero a la cadena a copiar.

Si la funcin tiene xito, devuelve un puntero al buffer de destino; en caso contrario devuelve nil. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

lstrcat, lstrcmp, lstrcmpi, lstrlen

Consulte el Listado 13-15, correspondiente a la funcin lstrcat.

lstrlen( lpString: PChar ): Integer;

{puntero a cadena} {devuelve la cantidad de caracteres en la cadena}

lstrlen calcula la longitud en caracteres de la cadena apuntada por el parmetro. El terminador nulo no se incluye en esta cuenta.

lpString: Puntero a la cadena cuya longitud se desea calcular.

Esta funcin devuelve la cantidad de caracteres en la cadena apuntada por el parmetro lpString. Esta funcin no indica errores en caso de fallo.

lstrcmp, lstrcmpi, lstrcat, lstrcpy

procedure var begin end

MakeIntAtom( wInteger: WORD ): PChar;

{valor entero} {devuelve un tomo entero}

Esta funcin convierte el valor entero especificado por el parmetro wInteger en un tomo que pueda ser entregado a las funciones AddAtom o GlobalAddAtom. Las funciones DeleteAtom y GlobalDeleteAtom siempre funcionan para tomos enteros, que no tienen asociados contadores de referencia, como los asociados a cadenas de caracteres. Si se aplican a un tomo entero, GetAtomName y GlobalGetAtomName devolvern una cadena de caracteres terminada en nulo cuyo primer carcter es una almohadilla (#); los caracteres restantes sern los dgitos que conforman la representacin decimal del nmero entero.

wInteger: Un valor de 16 bits que ser convertido en tomo entero.

Si la funcin tiene xito, devuelve un puntero a una cadena de caracteres terminada en nulo que representa al entero y puede ser utilizada en las funciones AddAtom y GlobalAddAtom. Si la funcin falla, devuelve nil.

AddAtom, DeleteAtom, GlobalAddAtom, GlobalDeleteAtom

procedure var

13
begin

end

OemToChar( lpszSrc: PChar; lpszDst: PChar ): BOOL;

{puntero a la cadena a traducir} {puntero a la cadena traducida} {siempre devuelve TRUE}

OemToChar traduce la cadena especificada del conjunto de caracteres del fabricante (OEM) a una cadena ANSI o Unicode.

lpszSrc: Puntero a la cadena que contiene caracteres OEM. lpszDst: Puntero a la cadena traducida. Si el conjunto de caracteres de destino es el ANSI (caracteres de un byte), entonces las cadenas de origen y destino pueden

coincidir. Si el conjunto de caracteres de destino es Unicode (caracteres de dos bytes), entonces deber especificarse un buffer separado para lpszDst.

Esta funcin siempre devuelve TRUE.

CharToOem, CharToOemBuff, OemToCharBuff

Consulte el Listado 13-3, correspondiente a la funcin CharToOem.

OemToCharBuff( lpszSrc: PChar; lpszDst: PChar; cchDstLength: DWORD ): BOOL;

{puntero a la cadena a traducir} {puntero a la cadena traducida} {cantidad de caracteres a traducir} {siempre devuelve TRUE}

OemToCharBuff traduce la cantidad especificada de caracteres de la cadena original (con caracteres OEM) a la cadena de destino, que puede utilizar el conjunto de caracteres ANSI (caracteres de un solo byte) o Unicode (caracteres de dos bytes).

lpszSrc: Puntero a la cadena OEM que se desea traducir. lpszDst: Puntero a la cadena de destino. Si el conjunto de caracteres de destino es el ANSI (caracteres de un byte), entonces las cadenas de origen y destino pueden coincidir (en ese caso se realizar la conversin in situ). Si el conjunto de caracteres de destino es Unicode (caracteres de dos bytes), deber especificarse un buffer independiente para lpszDst. cchDstLength: Especifica la cantidad de caracteres en la cadena OEM a traducir.

Esta funcin siempre devuelve TRUE.

CharToOem, CharToOemBuff, OemToChar

Consulte el Listado 13-3, correspondiente a la funcin CharToOem.

13

ToAscii( uVirtKey: UINT; uScanCode: UINT; const KeyState: TKeyboardState; lpChar: Pchar; uFlags: UINT ): Integer;

{cdigo de tecla virtual a traducir} {cdigo de barrido del teclado} {estado del teclado} {puntero a buffer que recibir la tecla traducida} {opcin de men activo} {devuelve cdigo traducido}

ToAscii traduce un cdigo de tecla virtual y estado del teclado en un carcter de Windows, utilizando el idioma de entrada y la configuracin de teclado del sistema.

uVirtKey: El cdigo de tecla virtual a traducir a un carcter Windows. uScanCode: El cdigo de barrido de la tecla a traducir. El bit ms significativo est activo si la tecla no est pulsada. El parmetro uVirtKey es el cdigo primario utilizado para la traduccin. El valor de uScanCode es utilizado solamente para distinguir entre una pulsacin y una liberacin de tecla, y para traducir las combinaciones Alt+nmero. KeyState: Puntero a un array de 256 bytes que indica el estado actual del teclado. Cada byte indica el estado de una tecla. El bit ms significativo est activo si la tecla est pulsada. Si el bit menos significativo est activo, la tecla Bloq. Mays. est activa. Esta funcin no hace uso del estado de las teclas Bloq. Num. y Bloq. Despl. lpChar: Puntero a un buffer de cadena que recibir el carcter Windows traducido. uFlags: Especifica si hay un men activo. Un valor 1 indica que hay un men activo; cero indica que no hay men activo.

La funcin devuelve uno de los valores de la Tabla 13-21. ToAscii no indica error en caso de fallos.

ToAsciiEx, OemKeyScan, VkKeyScan

procedure var array of

begin

end

wvsprintf( Output: PChar; Format: PChar; arglist: va_list ): Integer;

{puntero a buffer de salida} {puntero a cadena de formato} {puntero a lista de argumentos} {devuelve la cantidad de caracteres copiados al buffer}

Esta funcin deposita una cadena de texto formateado en el buffer apuntado por el parmetro Output, segn el formato especificado en el parmetro Format y los valores de variables pasados como parmetros. El programador coloca los valores en la lista de argumentos especificada por el parmetro arglist, para que sean procesados por wvsprintf e insertados en el buffer de salida de acuerdo con el formato especificado en el parmetro Format.

Output: Puntero a un buffer de cadena que recibir el texto formateado. Este buffer debe ser reservado por el proceso que hace la llamada. Format: Puntero a la cadena de formato que contiene la informacin acerca de cmo presentar la salida. Esta cadena generalmente contendr uno o ms especificadores de formato, cada uno de los cuales har uso de un elemento de datos del parmetro arglist. Cada especificador de formato comienza con un signo de porcentaje (%) seguido de cdigos adicionales que se listan en la Tabla 13-22. El formato general de un especificador es: %[-][#][0] [ancho] [.precisin] tipo Los corchetes indican campos opcionales. El especificador ms simple es %s, que tomar la cadena asociada al siguiente argumento del parmetro arglist (que debe ser un PChar), y la colocar en lugar del especificador en la cadena de salida. Si el smbolo % no viene seguido de alguno de los cdigos que se describen ms adelante, ser considerado parte de la salida. Por ejemplo, %% producir un solo signo de porcentaje en la cadena de salida. En algunos especificadores es significativa la diferencia entre maysculas y minsculas. En el caso de aquellos que no hacen distincin entre maysculas y minsculas, la Tabla 13-23 lista ambas posibilidades. La Tabla 13-22 describe el propsito de cada uno de los campos que pueden existir en una cadena de formato. La Tabla 13-23 muestra todos los posibles valores en el campo tipo, que es el ltimo campo en un especificador. arglist: Puntero al array de parmetros para los especificadores de formato. Cada especificador de formato en el parmetro Format que requiera una variable la tomar de arglist. El tamao del array debe ser la cantidad de elementos de 32 bits necesaria para satisfacer los especificadores de formato. Cada elemento del array debe ser un PChar o un valor entero de hasta 4 bytes de longitud. Consulte la funcin FormatMessage para ms informacin y ejemplos de utilizacin de estos arrays de argumentos.

13

Si esta funcin tiene xito, el valor devuelto es la cantidad de caracteres copiados al buffer de salida, sin contar el terminador nulo final. Si la funcin falla, devuelve un nmero menor que el tamao mnimo esperado del buffer de salida. En general, no es adecuado determinar si la funcin ha tenido xito comparando este valor con la longitud de la cadena de formato, porque es posible que la salida final sea ms corta o ms larga que la cadena de formato original. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

FormatMessage, GetDateFormat, GetTimeFormat

function implementation function procedure var begin external

stdcall

name

or nil

nil if end procedure var array array string begin of of then

if end

then

procedure var array array array string begin of of of string

13

if end

then

14

Muchas aplicaciones necesitan consultar al sistema ciertos aspectos acerca del sistema operativo sobre el que se est ejecutando, el hardware del ordenador, etc. Este captulo cubre un amplio rango de funciones de consulta y modificacin de parmetros del sistema, tales como el nombre del ordenador, la versin de Windows, y las variables de entorno.

Prcticamente todos los parmetros del sistema que pueden ser modificados a travs de alguno de los iconos del Panel de Control pueden ser configurados desde una aplicacin Windows. Desde el ancho de borde de las ventanas hasta el papel tapiz seleccionado para el escritorio, prcticamente todo puede ser consultado y modificado mediante la funcin SystemParametersInfo. Esta funcin tambin pone a disposicin de las aplicaciones diferentes caractersticas de accesibilidad. Estas caractersticas de accesibilidad ofrecen mecanismos alternativos de comunicacin a usuarios fsicamente disminuidos de una u otra manera. Por ejemplo, Windows ofrece una caracterstica de accesibilidad llamada SoundSentry. Esta tecnologa permite al sistema mostrar una indicacin visual cada vez que un sonido es generado, alertando a un usuario con defectos de audicin de que la aplicacin ha emitido un sonido audible. El siguiente ejemplo demuestra cmo activar esta caracterstica de accesibilidad.

procedure var begin with begin do

nil end

end procedure begin end

SystemParametersInfo puede utilizarse para crear algunas utilidades interesantes desde fuera del Panel de Control. Por ejemplo, la siguiente aplicacin muestra cmo cambiar el papel tapiz del escritorio.

procedure begin end procedure begin if end then

En este captulo se describen las siguientes funciones de informacin del sistema:

14

ExpandEnvironmentStrings( lpSrc: PChar; lpDst: PChar; nSize: DWORD ): DWORD;

{cadena que contiene la variable a expandir} {buffer que recibir la cadena} {tamao mximo del buffer} {devuelve la cantidad de bytes copiados al buffer}

Esta funcin se utiliza para expandir una variable de entorno. Esta funcin tambin devolver el tamao de la nueva cadena expandida.

lpSrc: Puntero a una cadena de caracteres terminada en nulo que contiene la variable de entorno sin expandir. Esta cadena puede contener una o ms referencias a variables de entorno, cada una de las cuales ser expandida. Las referencias a variable de entorno siguen el formato %variable%, donde la variable es una variable de entorno. lpDst: Puntero a un buffer que recibir la nueva cadena expandida. Si el valor de este parmetro es nil, la funcin devuelve el tamao de buffer necesario para almacenar la cadena de entorno expandida. nSize: El tamao mximo del buffer. Si el parmetro lpDst es nil, nSize debe ser cero.

Si la funcin tiene xito, devuelve la cantidad de caracteres copiados al buffer; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetEnvironmentStrings, GetEnvironmentVariable

procedure var array begin of

end

14
FreeEnvironmentStrings( p1: PChar ): BOOL; {puntero a bloque a liberar} {devuelve TRUE o FALSE}

Esta funcin libera un bloque de variables de entorno, producido por la funcin GetEnvironmentStrings.

p1: Puntero a un bloque de variables de entorno, obtenido como resultado de una llamada a GetEnvironmentStrings.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetEnvironmentStrings

Consulte el Listado 14-7, correspondiente a GetEnvironmentStrings.

GetCommandLine: PChar;

{devuelve la cadena de lnea de comandos}

La funcin GetCommandLine se utiliza para recuperar la lnea de comandos que ha sido utilizada para arrancar el programa. Esta lnea incluye los parmetros

suministrados al programa. La lnea de comandos es devuelta en forma de cadena de caracteres terminada en nulo.

Si la funcin tiene xito, devuelve un puntero a la cadena de caracteres terminada en nulo que contiene la lnea de comandos; en caso contrario devuelve nil.

CreateProcess

procedure begin end

GetComputerName( lpBuffer: PChar; var nSize: DWORD ): BOOL;

{puntero a buffer que recibir el nombre del equipo} {tamao del buffer} {devuelve TRUE o FALSE}

Esta funcin recupera el nombre de red del ordenador para el sistema. La funcin adems permite recuperar el tamao de buffer necesario para almacenar el nombre del ordenador, si se asigna cero a nSize y nil a lpBuffer.

lpBuffer: Puntero a buffer para la cadena de caracteres terminada en nulo que contendr el nombre del ordenador. nSize: Variable que especifica el tamao mximo del buffer apuntado por el parmetro lpBuffer, en caracteres. No deber ser menor que MAX_COMPUTERNAME_LENGTH.

Si la funcin tiene xito, devuelve TRUE y la variable apuntada por el parmetro nSize recibe la cantidad de caracteres copiados al buffer. Si la funcin falla, devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

SetComputerName, GetUserName

Consulte el Listado 14-20, correspondiente a la funcin SetComputerName.

14
GetDiskFreeSpace( lpRootPathName: Pchar; var lpSectorsPerCluster: DWORD; var lpBytesPerSector: DWORD; var lpNumberOfFreeClusters: DWORD; var lpTotalNumberOfClusters: DWORD ): BOOL; {puntero a ruta de directorio raz} {cantidad de sectores por cluster} {cantidad de bytes por sector} {cantidad de clusters libres} {total de clusters en la unidad} {devuelve TRUE o FALSE}

La funcin GetDiskFreeSpace recupera informacin acerca de una particin de disco. Devuelve toda la informacin necesaria para calcular el espacio libre en un disco. Tenga en cuenta que en versiones de Windows 95 anteriores al OSR 2, esta funcin devolver valores incorrectos para volmenes de ms de 2 gigabytes.

lpRootPathName: Una cadena de caracteres terminada en nulo que contiene el directorio raz de la unidad a consultar. lpSectorsPerCluster: Variable que recibir la cantidad de sectores por cluster para la unidad especificada. Un sector es una coleccin de bytes, y un cluster es una coleccin de sectores. lpBytesPerSector: Variable que recibir la cantidad de bytes en cada sector de la unidad. lpNumberOfFreeClusters: Variable que recibir la cantidad de clusters libres en la unidad. Normalmente el cluster es la unidad mnima de asignacin del sistema. Almacenar un fichero cuyo tamao es inferior a un cluster har que el sistema ocupe el cluster entero. Para obtener la cantidad de espacio libre en el disco, multiplique la cantidad de clusters libres por la cantidad de sectores por cluster y luego por la cantidad de bytes por sector, como en la siguiente frmula: EspacioLibre = ClustersLibres * SectoresPorCluster * BytesPorSector (bytes)

lpTotalNumberOfClusters: Variable que recibir la cantidad total de clusters en la unidad. Para calcular la capacidad total de almacenamiento de la unidad utilice la siguiente frmula: EspacioTotal = TotalClusters * SectoresPorCluster * BytesPorSector (bytes)

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetDriveType

procedure var

begin if then begin

end end

14
GetDriveType( lpRootPathName: PChar ): UINT; {puntero a ruta de directorio raz} {devuelve un valor que identifica al tipo de unidad}

GetDriveType permite determinar el tipo de unidad de disco cuyo directorio raz se especifica, y permite distinguir si una unidad es fija, removible o unidad de red.

lpRootPathName: Una cadena de caracteres terminada en nulo que contiene el directorio raz de la unidad a consultar. Si este parmetro es nil, la funcin utiliza la raz del directorio actual.

Si la funcin tiene xito, devuelve uno de los valores de la Tabla 14-2; en caso contrario devuelve DRIVE_UNKNOWN.

GetDiskFreeSpace

procedure var array begin of

case

of

end end

GetEnvironmentStrings: PChar;

{devuelve un puntero al entorno}

La funcin GetEnvironmentStrings devuelve un puntero a las cadenas asociadas a las variables de entorno del sistema, que incluye a las definiciones de variables de entorno como PATH, PROMPT o LASTDRIVE. El puntero devuelto por esta funcin puede ser utilizado para especificar un contexto de variables de entorno para un proceso lanzado mediante una llamada a CreateProcess. Cuando el bloque de variables de entorno deje de ser necesario, deber liberarse mediante una llamada a FreeEnvironmentStrings.

Si la funcin tiene xito, devuelve un puntero a un buffer que contiene una cadena de caracteres terminada en nulo. Este buffer se compone de cadenas terminadas en nulo correspondientes a cada variable de entorno. El buffer termina con un doble terminador nulo. Si la funcin falla, devuelve nil.

CreateProcess, GetEnvironmentVariable, SetEnvironmentVariable, FreeEnvironmentStrings

procedure var begin

14

if while

nil then nil do begin

if end end

then

nil

GetEnvironmentVariable( lpName: PChar; lpBuffer: PChar; nSize: DWORD ): DWORD;

{puntero a nombre de variable} {puntero a cadena que recibir el valor} {tamao del buffer} {devuelve la cantidad de bytes copiados al buffer}

La funcin GetEnvironmentVariable recupera el valor de la variable de entorno especificada. La funcin puede adems devolver el tamao de buffer necesario para almacenar el valor de la variable de entorno.

lpName: Una cadena de caracteres terminada en nulo que contiene el nombre de la variable de entorno a recuperar. lpBuffer: Puntero a buffer para una cadena de caracteres terminada en nulo que recibir el valor de la variable de entorno. Si el valor de este parmetro es nil, la funcin devuelve el tamao de buffer necesario para almacenar el valor de la variable de entorno. nSize: Especifica el tamao mximo del buffer en caracteres.

Si la funcin tiene xito, devuelve la cantidad de caracteres copiados al buffer apuntado por el parmetro lpBuffer; en caso contrario devuelve cero.

GetEnvironmentStrings, SetEnvironmentVariable

Consulte el Listado 14-21, correspondiente a SetEnvironmentVariable.

GetLocaleInfo( Locale: LCID; LCType: LCTYPE; lpLCData: PChar; cchData: Integer ): Integer;

{identificador de localidad} {opcin de tipo de informacin} {puntero a buffer de salida} {tamao del buffer de salida} {devuelve la cantidad de caracteres copiados al buffer}

GetLocaleInfo ofrece informacin especfica acerca de una localidad determinada. Es posible acceder a informacin muy diversa dependiendo del valor del parmetro LCType. La funcin devuelve la informacin de localidad en forma de cadena, que se almacena en el buffer apuntado por el parmetro lpLCData.

Locale: Identificador de localidad sobre la que se solicita informacin. Puede ser un identificador de localidad especfico o uno de los valores de la Tabla 14-3. LCType: Opcin que indica el tipo de informacin solicitada. La constante LOCALE_NOUSEROVERRIDE puede combinarse con cualquiera de los valores de la Tabla 14-4, para indicar que se desea obtener las propiedades predeterminadas para la localidad, sin tener en cuenta los cambios que puedan haber sido introducidos por el usuario. lpLCData: Puntero a buffer para cadena de caracteres que recibir la informacin de localidad solicitada. cchData: Especifica el tamao en bytes del buffer apuntado por el parmetro lpLCData. Si este parmetro es cero, la funcin devuelve la cantidad de bytes necesaria para almacenar la informacin solicitada, y el parmetro lpLCData es ignorado.

14

Si la funcin tiene xito, devuelve la cantidad de bytes copiados al buffer lpLCData, y lpLCData apuntar a la cadena que contiene la informacin solicitada. Si la funcin falla, devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetSystemDefaultLCID, GetUserDefaultLCID, SetLocaleInfo

procedure var begin

if else

then

if if

then then

end

14

14

14

GetLocalTime( var lpSystemTime: TSystemTime );

{puntero a registro TSystemTime} {no devuelve nada}

La funcin GetLocalTime recupera la fecha y hora local.

lpSystemTime: Puntero a un registro TSystemTime que recibir la fecha y hora actual. El registro TSystemTime se define de la siguiente forma: TSystemTime = record wYear: Word; wMonth: Word; wDayOfWeek: Word; wDay: Word; {ao} {mes} {da de la semana} {da del mes}

wHour: Word; wMinute: Word; wSecond: Word; wMilliseconds: Word; end;

{hora} {minuto} {segundos} {milisegundos}

Consulte la funcin FileTimeToSystemTime para ver una descripcin de esta estructura de datos.

14

GetSystemTime, SetLocalTime

Consulte el Listado 14-23, correspondiente a la funcin SetLocalTime.

GetLogicalDrives: DWORD;

{devuelve una mscara de bits que indica las unidades disponibles}

La funcin GetLogicalDrives recupera una mscara donde cada bit indica la disponibilidad de una unidad de disco (bit 0 = unidad A, bit 1 = unidad B, etc.).

Si la funcin tiene xito, devuelve la mscara de bits que indica qu unidades estn disponibles; en caso contrario devuelve cero.

GetLogicalDriveStrings

procedure var array array begin of of

for begin

to

do

if begin

and

shl

then

case

of

end end else end

while begin

nil do

14
if end end then nil

GetLogicalDriveStrings( nBufferLength: DWORD; {tamao del buffer} lpBuffer: PAnsiChar {puntero al buffer} ): DWORD; {devuelve la cantidad de caracteres copiados al buffer}

Esta funcin recupera los nombres de todas las unidades lgicas, incluyendo unidades de red mapeadas, y las deposita en el buffer apuntado por el parmetro lpBuffer.

nBufferLength: Especifica el tamao del buffer apuntado por el parmetro lpBuffer, sin incluir el terminador nulo. lpBuffer: Puntero a un buffer que recibir los nombres de las unidades lgicas. Los nombres lgicos de unidad tienen la forma letraUnidad:\ (por ejemplo, C:\). Cada nombre de unidad se separa de la siguiente mediante un terminador nulo, y la lista de cadenas termina con dos caracteres nulos seguidos. Si el valor de este parmetro es nil, la funcin devuelve el tamao de buffer necesario para almacenar la lista de nombres de unidades.

Si la funcin tiene xito, devuelve la cantidad de caracteres copiados al buffer, sin contar el timo terminador nulo. Si la funcin falla, devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetDriveType, GetDiskFreeSpace, GetLogicalDrives

Consulte el Listado 14-9, correspondiente a la funcin GetLogicalDrives.

GetStartupInfo( var lpStartupInfo: TStartupInfo );

{registro que recibir info de arranque} {no devuelve nada}

La funcin GetStartupInfo recupera informacin de arranque asociada a la ventana principal del proceso que hace la llamada.

lpStartupInfo: Puntero a un registro TStartupInfo que recibir la informacin relativa a la ventana principal del proceso que hace la llamada. El registro TStartupInfo se define de la siguiente forma: TStartupInfo = record cb: DWORD; lpReserved: Pointer; lpDesktop: Pointer; lpTitle: Pointer; dwX: DWORD; dwY: DWORD; dwXSize: DWORD; dwYSize: DWORD; dwXCountChars: DWORD; dwYCountChars: DWORD; dwFillAttribute: DWORD; dwFlags: DWORD; wShowWindow: Word; cbReserved2: Word; lpReserved2: PByte; hStdInput: THandle; hStdOutput: THandle; hStdError: THandle; end; {tamao del registro TStartupInfo} {reservado} {puntero al escritorio} {ttulo para aplicaciones de consola} {posicin horizontal} {posicin vertical} {ancho de la ventana} {altura de la ventana} {ancho de la pantalla (apl. de consola)} {altura de la pantalla (apl. de consola)} {configuracin de colores (apl. de consola)} {banderas que determinan campos utilizados} {atributos de la ventana} {reservado} {reservado} {manejador de entrada estndar} {manejador de salida estndar} {manejador de errores estndar}

Consulte la funcin CreateProcess para ver una descripcin detallada de esta estructura de datos.

CreateProcess

const array of string

14

procedure var begin

end

GetSystemDefaultLangID: LANGID; {devuelve el ID de idioma predeterminado del sistema}

Esta funcin devuelve el identificador del idioma predeterminado del sistema. Utilice la funcin VerLanguageName para obtener el nombre asociado al identificador.

Si la funcin tiene xito, devuelve el identificador numrico del identificador del idioma del sistema; en caso contrario devuelve cero.

GetUserDefaultLangID, GetSystemDefaultLCID, VerLanguageName, GetLocaleInfo

procedure var array array begin of of

end

GetSystemDefaultLCID: LCID; {devuelve el identificador de localidad predefinida del sistema}

Esta funcin se utiliza para recuperar el identificador de localidad predefinido del sistema.

14

Si la funcin tiene xito, devuelve el identificador de localidad predefinido del sistema. Si la funcin falla, devuelve cero.

GetLocaleInfo, GetUserDefaultLCID

Consulte el Listado 14-8, correspondiente a la funcin GetLocaleInfo.

GetSystemDirectory( lpBuffer: PChar; uSize: UINT ): UINT;

{puntero a buffer que recibe el directorio de sistema} {tamao mximo del buffer} {devuelve la cantidad de bytes copiados al buffer}

Esta funcin recupera una cadena que contiene la ruta del directorio del sistema de Windows. Las aplicaciones no deben crear ficheros en este directorio.

lpBuffer: Puntero a buffer para una cadena de caracteres terminada en nulo que recibir la ruta del directorio de sistema de Windows. Si el valor de este parmetro es nil, la funcin devuelve el tamao de buffer necesario para almacenar la ruta del directorio de sistema de Windows. uSize: Especifica el tamao mximo del buffer apuntado por el parmetro lpBuffer , en caracteres.

Si la funcin tiene xito, devuelve la cantidad de bytes copiados al buffer apuntado por el parmetro lpBuffer; en caso contrario devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetCurrentDirectory, GetWindowsDirectory, SetCurrentDirectory

procedure var array begin of

end

GetSystemInfo( var lpSystemInfo: TSystemInfo );

{puntero a registro informacin del sistema} {no devuelve nada}

Esta funcin recupera informacin acerca del hardware sobre el que est ejecutndose Windows.

lpSystemInfo: Puntero a un registro TSystemInfo que recibir informacin acerca del sistema en el que el sistema est ejecutndose. El registro TSystemInfo se define de la siguiente forma: TSystemInfo = record case Integer of 0: ( dwOemId: DWORD) {ID del fabricante (OEM)} 1:( wProcessorArchitecture: Word; {arquitectura del procesador} wReserved: Word; {reservado} dwPageSize: DWORD; {tamao de pgina mem. virtual} lpMinimumApplicationAddress: Pointer; {direccin de acceso mnima} lpMaximumApplicationAddress: Pointer; {direccin de acceso mxima} dwActiveProcessorMask: DWORD; {array de procesadores activos} dwNumberOfProcessors: DWORD; {cantidad de procesadores} dwProcessorType: DWORD; {tipo de procesador presente} dwAllocationGranularity: DWORD; {granularidad de mem. virtual} wProcessorLevel: Word; {nivel del procesador requerido} wProcessorRevision: Word) {revisin del procesador requerida} end; dwOemId: Este campo no es utilizado. Ntese que bajo Windows 95/98 este campo siempre valdr PROCESSOR_ARCHITECTURE_INTEL. wProcessorArchitecture: Indica el tipo de arquitectura de procesador del sistema, y puede tomar uno de los valores de la Tabla 14-9. wReserved: Este campo est reservado para uso futuro y actualmente es ignorado. dwPageSize: Indica el tamao de pgina de la memoria virtual. Este valor es utilizado por la funcin LocalAlloc para reservar bloques adicionales de memoria. lpMinimumApplicationAd dress: Puntero a la direccin de memoria ms baja accesible a las aplicaciones y DLLs. lpMaximumApplicationAddress: Puntero a la direccin de memoria ms alta accesible a las aplicaciones y DLLs. dwActiveProcessorMask: Un array de bits que indican qu procesadores estn presentes y activos. El bit 0 indica el procesador 0, el bit 1 indica el procesador 1, etc. dwNumberOfProcessors: Indica la cantidad total de procesadores en el sistema. dwProcessorType: Bajo Windows 95/98 y Windows NT anterior a la versin 4, este campo indica el tipo de procesador del sistema. Bajo Windows NT version 4 y posteriores, este campo es ignorado. Este campo puede tomar uno de los valores de la Tabla 14-10.

14

dwAllocationGranularity: Especifica la mnima cantidad de memoria que se reserva cada vez que la memoria virtual es utilizada. En el pasado esta cantidad siempre se ha prefijado en 64 KB, pero puede variar para diferentes arquitecturas de procesador. wProcessorLevel: Este campo es ignorado bajo Windows 95/98. Bajo Windows NT 4.0 y posterior, este campo indica el nivel del procesador presente, y puede tomar uno de los valores de la Tabla 14-11. wProcessorRevision: Este campo es ignorado bajo Windows 95/98. Bajo Windows NT 4.0 y posterior, este campo indica la revisin del procesador presente, y puede tomar uno de los valores de la Tabla 14-12.

GetVersionEx

const

implementation procedure var begin

case begin

of

case

of

end end

end end

14

GetSystemTime( var SystemTime: TSystemTime );

{puntero a registro TSystemTime} {no devuelve nada}

Esta funcin recupera la hora y fecha actuales en formato UTC.

14

SystemTime: Puntero a un registro TSystemTime que recibir la fecha y hora actuales. El registro TSystemTime se define de la siguiente forma: TSystemTime = record wYear: Word; wMonth: Word; wDayOfWeek: Word; wDay: Word; wHour: Word; wMinute: Word; wSecond: Word; wMilliseconds: Word; end;

{ao} {mes} {da de la semana} {da del mes} {hora} {minuto} {segundos} {milisegundos}

Consulte la funcin FileTimeToSystemTime para ver una descripcin de esta estructura de datos.

GetLocalTime, SetSystemTime

Consulte el Listado 14-24, correspondiente a la funcin SetSystemTime.

GetSystemTimeAsFileTime( var lpSystemTimeAsFileTime: TFileTime );

{hora del sistema como hora de fichero} {no devuelve nada}

Esta funcin devuelve la hora actual del sistema en forma de hora de fichero.

lpSystemTimeAsFileTime: Puntero a registro de tipo TFileTime que recibir la hora actual del sistema en formato UTC. Consulte el captulo Funciones de entrada y salida a disco para obtener ms informacin sobre el formato UTC (Coordenadas Universales de Tiempo) y el registro TFileTime.

GetSystemTime, SystemTimeToFileTime

procedure var begin

end

GetTimeZoneInformation( var lpTimeZoneInformation: TTimeZoneInformation {puntero a registro TTimeZoneInformation} ): DWORD; {devuelve cdigo de zona horaria}

Esta funcin se utiliza para recuperar la informacin de zona horaria para el sistema local. La informacin de zona horaria determina la traduccin entre las coordenadas universales (UTC) y la hora local.

lpTimeZoneInformation: Puntero a un registro TTimeZoneInformation que recibir la informacin de zona horaria del sistema. El registro TTimeZoneInformation se define de la siguiente forma: TTimeZoneInformation = record Bias: LongInt; {Diferencia entre horas} StandardName: array[0..31] of WCHAR;{Nombre de zona horaria estndar} StandardDate: TSystemTime; {Fecha de cambio a horario estndar} StandardBias: LongInt; {Hora estndar que se aade a Bias} DaylightName: array[0..31] of WCHAR; {Nombre de zona horaria en verano} DaylightDate: TSystemTime; {Fecha de cambio a horario de verano} DaylightBias: LongInt {Hora de verano que se aade a Bias} end; Bias: Especifica la diferencia entre la hora local y la hora del meridiano de Greenwich (UTC), en minutos. Para traducir entre hora local y hora UTC, se utiliza la siguiente frmula: HoraUTC = HoraLocal + Bias StandardName: Contiene una cadena de caracteres terminada en nulo que describe el nombre de la zona horaria durante el horario normal. StandardDate: Un registro TSystemTime que especifica la fecha en que se produce el cambio de horario de verano a horario normal. StandardBias: Diferencia adicional entre la hora UTC y la hora local durante el horario normal. Este valor se aade a Bias a la hora de determinar las diferencias en horas durante el horario normal; para la mayora de las zonas horarias este valor es cero. DaylightName: Contiene una cadena de caracteres terminada en nulo que describe el nombre de la zona horaria durante el horario de verano. DaylightDate: Un registro TSystemTime que especifica la fecha en que se produce el cambio de horario normal a horario de verano. DaylightBias: Diferencia adicional entre la hora UTC y la hora local durante el horario de verano. Este valor se aade a Bias a la hora de determinar las diferencias en horas durante el horario normal; para la mayora de las zonas horarias este valor es 60.

14

Si la funcin tiene xito, devuelve un cdigo de zona horaria code de la Tabla 14-13; en caso contrario devuelve $FFFFFFFF. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetLocalTime, GetSystemTime

procedure var begin

if else

then

if else end

then

14
GetUserDefaultLangID: LANGID; {devuelve el identificador de idioma predeterminado del usuario}

Esta funcin devuelve el identificador de idioma predeterminado del usuario. Utilice la funcin VerLanguageName para obtener el nombre del idioma a partir del identificador.

Si la funcin tiene xito, devuelve el identificador numrico del idioma predeterminado del usuario; en caso contrario devuelve cero.

GetSystemDefaultLangID, GetUserDefaultLCID, VerLanguageName, GetLocaleInfo

Consulte el Listado 14-11, correspondiente a GetSystemDefaultLangID

GetUserDefaultLCID: LCID; {devuelve identificador de localidad predeterminado del usuario}

Esta funcin se utiliza para recuperar el identificador de localidad predeterminado del usuario.

Si la funcin tiene xito, devuelve el identificador de localidad predeterminado del usuario. Si la funcin falla, devuelve cero.

GetLocaleInfo, GetSystemDefaultLCID

Consulte el Listado 14-8, correspondiente a la funcin GetLocaleInfo.

GetUserName( lpBuffer: PChar; var nSize: DWORD ): BOOL;

{puntero a buffer que recibir el nombre de usuario} {tamao de buffer} {devuelve TRUE o FALSE}

Esta funcin se utiliza para obtener el nombre de red del usuario actualmente conectado al sistema.

lpBuffer: Puntero a una cadena de caracteres terminada en nulo que recibir el nombre de usuario. Si el valor de este parmetro es nil, la variable identificada por el parmetro nSize recibir el tamao de buffer necesario para almacenar el nombre del usuario. nSize: Variable que contiene el tamao del buffer apuntado por el parmetro lpBuffer, en caracteres. Cuando la funcin retorne, esta variable contendr la cantidad de caracteres copiados al buffer.

Si la funcin tiene xito, devuelve TRUE y la variable identificada por el parmetro nSize contiene la cantidad de caracteres copiados a lpBuffer. Si la funcin falla, devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetComputerName

procedure var begin

nil

if else

then

14

end

GetVersionEx( var lpVersionInformation: TOSVersionInfo {puntero a registro TOSVersionInfo} ): BOOL; {devuelve TRUE o FALSE}

Esta funcin recupera informacin acerca de la versin de Windows que est ejecutndose.

lpVersionInformation: Puntero a un registro TOSVersionInfo que recibir informacin acerca de la versin actual de Windows. El registro TOSVersionInfo se define de la siguiente forma: TOSVersionInfo = record dwOSVersionInfoSize: DWORD; {tamao de TOSVersionInfo}

dwMajorVersion: DWORD; dwMinorVersion: DWORD; dwBuildNumber: DWORD; dwPlatformId: DWORD; szCSDVersion:array[0..127]of AnsiChar end;

{nmero mayor de versin} {nmero menor de versin} {nmero de construccin} {opciones de sistema operativo} {informacin adicional}

dwOSVersionInfoSize: Especifica el tamao del registro TOSVersionInfo, en bytes. A este campo se le debe asignar SizeOf(TOSVersionInfo). dwMajorVersion: Especifica el nmero de versin mayor del sistema operativo. dwMinorVersion: Especifica el nmero de versin menor del sistema operativo. dwBuildNumber: Especifica el nmero de construccin del sistema operativo. Bajo Windows 95/98, la palabra alta de este valor contiene los nmeros de versin mayor y menor. dwPlatformId: Una opcin que especifica el tipo de plataforma del sistema operativo. Este campo puede contener uno de los valores de la Tabla 14-14. szCSDVersion: Contiene una cadena de caracteres terminada en nulo con informacin adicional acerca del sistema operativo.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetSystemInfo

procedure var

begin

case

of

14

end end

GetVolumeInformation( lpRootPathName: PChar; {ruta del directorio raz} lpVolumeNameBuffer: PChar; {buffer que recibe nombre de volumen} nVolumeNameSize: DWORD; {tamao mximo del buffer} lpVolumeSerialNumber: PDWORD; {puntero a nmero de serie de volumen} var lpMaximumComponentLength: DWORD; {tamao mximo de nombre} var lpFileSystemFlags: DWORD; {opciones de sistema de ficheros} lpFileSystemNameBuffer: PChar; {buffer para nombre de sistema de ficheros} nFileSystemNameSize: DWORD {tamao mximo de buffer para sist. ficheros} ): BOOL; {devuelve TRUE o FALSE}

Esta funcin devuelve informacin acerca del sistema de ficheros y el volumen especificado por la ruta del directorio raz en el parmetro lpRootPathName.

lpRootPathName: Puntero a una cadena de caracteres terminada en nulo que contiene la ruta del directorio raz de la unidad a consultar. Si el valor de este parmetro es nil,

se utilizar el directorio raz del directorio actual. Para especificar una ruta UNC del directorio raz, aada una barra invertida adicional al final de la cadena (por ejemplo, \\NombreServidor\NombreRecurso\). lpVolumeNameBuffer: Puntero a buffer para una cadena de caracteres terminada en nulo que recibir el nombre del volumen. lpVolumeNameSize: Especifica el tamao mximo del buffer lpVolumeNameBuffer. lpVolumeSerialNumber: Variable que recibir el nmero de serie del volumen. lpMaximumComponentLength: Variable que recibir el tamao mximo para los nombres de ficheros y directorios, en caracteres. Los sistemas que soportan nombres de fichero largos, como FAT, devolvern el valor 255. lpFileSystemFlags: Variable que recibir un valor que indica el tipo de sistema de ficheros en uso. A esta variable se le puede asignar cualquier combinacin de valores de la Tabla 14-15. lpFileSystemNameBuffer: Puntero a un buffer para una cadena de caracteres terminada en nulo que recibir el nombre del sistema de ficheros, como FAT o NTFS. nFileSystemNameSize: Especifica el tamao mximo de lpFileSystemNameBuffer.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetFileAttributes, SetVolumeLabel

procedure var array array of of

array begin

of

end

14

GetWindowsDirectory( lpBuffer: PChar; uSize: UINT ): UINT;

{buffer que recibe la ruta del directorio de Windows} {tamao mximo del buffer} {devuelve la cantidad de bytes copiados al buffer}

Esta funcin recupera la ruta del directorio de Windows. Tradicionalmente las aplicaciones almacenan aqu los ficheros de inicializacin y de ayuda.

lpBuffer: Puntero a un buffer para una cadena de caracteres terminada en nulo que recibir la ruta del directorio de Windows. Si el valor de este parmetro es nil, la funcin devuelve el tamao del buffer necesario para almacenar la ruta del directorio de Windows. uSize: Especifica el tamao mximo del buffer apuntado por el parmetro lpBuffer, y debe indicar un tamao mnimo de MAX_PATH caracteres.

Si la funcin tiene xito, devuelve la cantidad de caracteres copiados al buffer apuntado por el parmetro lpBuffer, sin contar el terminador nulo. Si la funcin falla, devuelve cero. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetCurrentDirectory, GetSystemDirectory

procedure var array begin of

end

SetComputerName( lpComputerName: PChar ): BOOL;

{puntero al nuevo nombre de equipo} {devuelve TRUE o FALSE}

Esta funcin asigna el nombre especificado por el parmetro lpComputerName al ordenador. Este nuevo nombre se har vigente cuando la mquina sea reiniciada.

lpComputerName: Puntero a una cadena de caracteres terminada en nulo que contiene el nuevo nombre del ordenador. Esta cadena no puede tener una longitud superior a MAX_COMPUTERNAME_LENGTH caracteres.

14

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetComputerName

procedure var array begin of

if else end procedure var array begin

then

of

if else end

then

SetEnvironmentVariable( lpName: PChar; lpValue: PChar ): BOOL;

{nombre de la variable de entorno a cambiar} {nuevo valor de la variable de entorno} {devuelve TRUE o FALSE}

Esta funcin establece el valor de una variable de entorno para el proceso actual. Esta funcin puede tambin aadir o eliminar una variable de entorno para el proceso actual.

lpName: Puntero a una cadena de caracteres terminada en nulo que contiene el nombre de la variable de entorno a modificar. Si la variable de entorno no existe, el sistema la crear si el valor lpValue es distinto de nil. Si la variable de entorno existe y el parmetro lpValue contiene nil, el sistema elimina la variable de entorno especificada. lpValue: Puntero a una cadena de caracteres terminada en nulo que contiene el nuevo valor de la variable de entorno.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetEnvironmentVariable

procedure var array begin of

if else if else end procedure var

then then

array begin

of

14
then

if else End

SetLocaleInfo( Locale: LCID; LCType: LCTYPE; lpLCData: PChar ): BOOL;

{identificador de localidad} {opciones de localidad} {puntero a nuevos datos} {devuelve TRUE o FALSE}

Esta funcin establece informacin especfica para la localidad identificada por el parmetro Locale. Sin embargo, slo cierta informacin de localidad puede ser modificada mediante esta funcin.

Locale: El identificador de la localidad cuya configuracin se desea modificar. LCType: Un indicador que identifica el tipo de informacin de localidad a modificar. A este parmetro puede asignrsele uno de los valores de la Tabla 14-16. Ntese que esta tabla de valores es un subconjunto de las opciones de informacin de localidad descritas en la funcin GetLocaleInfo. lpLCData: Puntero a una cadena de caracteres terminada en nulo que contiene la informacin de localidad a asignar.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetLocaleInfo

var array implementation begin of

end procedure var array begin if then else of

if if end procedure begin end

then then

14

14

SetLocalTime( const lpSystemTime: TSystemTime ): BOOL;

{puntero a registro TSystemTime} {devuelve TRUE o FALSE}

Esta funcin establece la fecha y hora local. Bajo Windows NT, el proceso que hace la llamada necesitar tener el privilegio de seguridad SE_SYSTEMTIME_NAME o la funcin fallar.

lpSystemTime: Puntero a un registro TSystemTime que contiene la nueva fecha y hora local. El registro TSystemTime se define de la siguiente forma: TSystemTime = record wYear: Word; wMonth: Word; wDayOfWeek: Word; wDay: Word; wHour: Word; wMinute: Word; wSecond: Word; wMilliseconds: Word; end; {ao} {mes} {da de la semana} {da del mes} {hora} {minuto} {segundos} {milisegundos}

Note que el valor del campo wDayOfWeek es ignorado. Consulte la funcin FileTimeToSystemTime para ver una descripcin de esta estructura de datos.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetLocalTime, GetSystemTime, SetSystemTime

procedure var begin

end

procedure var begin try

except on end end do

14
SetSystemTime( const lpSystemTime: TSystemTime ): BOOL; {puntero a registro TSystemTime} {devuelve TRUE o FALSE}

Esta funcin establece la fecha y hora actual. La hora del sistema se almacena en formato de coordenadas universales (UTC). Bajo Windows NT, el proceso que hace la llamada debe tener el privilegio de seguridad SE_SYSTEMTIME_NAME o la funcin fallar.

lpSystemTime: Puntero a un registro TSystemTime que contiene la nueva fecha y hora actuales. El registro TSystemTime se define de la siguiente forma: TSystemTime = record wYear: Word; wMonth: Word; wDayOfWeek: Word; wDay: Word; wHour: Word; wMinute: Word; wSecond: Word; wMilliseconds: Word; end; {ao} {mes} {da de la semana} {da del mes} {hora} {minuto} {segundos} {milisegundos}

Ntese que el valor del campo wDayOfWeek es ignorado. Consulte la funcin FileTimeToSystemTime para ver una descripcin de esta estructura de datos.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetLocalTime, GetSystemTime, SetLocalTime

procedure var begin

end

procedure var begin try

except on end end do

SetVolumeLabel( lpRootPathName: PChar; lpVolumeName: PAnsiChar ): BOOL;

{nombre del directorio raz del volumen} {nuevo nombre de volumen} {devuelve TRUE o FALSE}

Esta funcin cambia el nombre de volumen de la unidad especificada por el directorio raz contenido en el parmetro lpRootPathName.

14

lpRootPathName: Puntero a una cadena de caracteres terminada en nulo que contiene la ruta del directorio raz de la unidad cuyo nombre de volumen se desea cambiar. Si el valor de este parmetro es nil, se cambiar el nombre al volumen que contiene el directorio actual. lpVolumeName: Puntero a una cadena de caracteres terminada en nulo que contiene el nuevo nombre de volumen. Si el valor de este parmetro es nil, el nombre de volumen es eliminado.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetVolumeInformation

procedure var array begin of

end

SystemParametersInfo( uiAction: UINT; uiParam: UINT; pvParam: Pointer; fWinIni: UINT ): BOOL;

{parmetros del sistema a consultar o establecer} {entero que depende de uiAction} {puntero a registro que depende de uiAction} {opciones de notificacin y grabacin} {devuelve TRUE o FALSE}

Esta funcin puede recuperar o modificar los valores de diferentes parmetros globales del sistema, tales como las huellas del ratn o el papel tapiz del escritorio. La mayora de estos parmetros est disponible para su consulta y modificacin a travs de diferentes applets del Panel de Con trol.

uiAction: Especifica qu parmetro del sistema se desea consultar o modificar, y puede tomar uno de los valores de la Tabla 14-19. uiParam: Un entero cuyo valor depende del valor del parmetro uiAction. Consulte la Tabla 14-19 para ver una descripcin de los posibles valores de uiParam. A menos que se especifique lo contrario, a este parmetro se le debe asignar cero. pvParam: Puntero a un registro. El tipo de registro y sus valores dependen del valor del parmetro uiAction. Consulte la Tabla 14-19 para ver una descripcin de las estructuras de datos asociadas a pvParam. A menos que se especifique lo contrario, a este parmetro se le debe asignar nil. fWinIni: Determina cmo se gestionan los cambios en los parmetros del sistema, y puede tomar uno de los valores de la Tabla 14-20.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

GetSystemMetrics

var

procedure begin

14
end procedure begin

div div

end procedure begin

end procedure begin

end

14

14

14

14

14

14

14

TAccessTimeout = packed record cbSize: UINT; {tamao del registro TAccessTimeout} dwFlags: DWORD; {comportamiento al alcanzarse el lmite} iTimeOutMSec: DWORD; {tiempo lmite en milisegundos} end; cbSize: Indica el tamao del registro TAccessTimeout. Asigne a este campo el valor SizeOf(TAccessTimeout). dwFlags: Opciones que indican el comportamiento del sistema si se alcanza el tiempo lmite. Este campo puede contener uno o ms de los valores de la Tabla 14-21. iTimeOutMSec: Indica el tiempo lmite en milisegundos que debe transcurrir sin una accin de teclado o de ratn para que el sistema desactive las caractersticas de accesibilidad.

TAnimationInfo = packed record cbSize: UINT; {tamao del registro TAnimationInfo} iMinAnimate: Integer; {activa o desactiva la animacin} end; cbSize: Especifica el tamao del registro TAnimationInfo. A este campo se le debe asignar el valor SizeOf(TAnimationInfo). iMinAnimate: Especifica si la animacin est activada o desactivada. El valor cero indica que la animacin est desactivada; un valor diferente de cero indica que la animacin est activada. TFilterKeys = packed record cbSize: UINT; dwFlags: DWORD; iWaitMSec: DWORD;

{tamao del registro TFilterKeys} {comportamiento de teclas de filtro} {demora de aceptacin}

iDelayMSec: DWORD; iRepeatMSec: DWORD; iBounceMSec: DWORD; end;

{demora de repeticin} {velocidad de repeticin} {tiempo de espera}

cbSize: Especifica el tamao del registro TFilterKeys. A este campo se le debe asignar el valor SizeOf(TFilterKeys). dwFlags: Indica el comportamiento de las opciones de las teclas de filtro. Este campo puede contener uno o ms de los valores de la Tabla 14-22. iWaitMSec: Especifica el tiempo en milisegundos que el usuario debe mantener pulsada una tecla antes de que el sistema la acepte. iDelayMSec: Especifica el intervalo de demora de repeticin. Es el tiempo en milisegundos que el usuario debe mantener pulsada la tecla antes de que el sistema comience a repetirla. iRepeatMSec: Especifica la velocidad de repeticin. Es el tiempo en milisegundos que el sistema esperar antes de repetir la tecla de nuevo. iBounceMSec: Especifica el tiempo de espera obligatorio para las teclas. Es el tiempo que debe transcurrir antes de que el sistema acepte una segunda pulsacin de la misma tecla.

14

THighContrast = packed record cbSize: UINT; dwFlags: DWORD; lpszDefaultScheme: PAnsiChar; end;

{tamao del registro THighContrast} {comportamiento de opciones de contraste} {nombre del esquema estndar}

cbSize: Especifica el tamao del registro THighContrast. Asigne a este campo el valor SizeOf(THighContrast).

dwFlags: Indica el comportamiento de las opciones de contrastre. Este campo puede contener uno o ms de los valores de la Tabla 14-23. lpszDefaultScheme: Puntero a una cadena de caracteres terminada en nulo que contiene el nombre del esquema de colores estndar del sistema.

TIconMetrics = packed record cbSize: UINT; iHorzSpacing: Integer; iVertSpacing: Integer; iTitleWrap: Integer; lfFont: TLogFont; end;

{tamao del registro TIconMetrics} {espacio horizontal para iconos} {espacio vertical para iconos} {cambiar de lnea en ttulos} {fuente para ttulos}

cbSize: Especifica el tamao del registro TIconMetrics. A este campo se le debe asignar el valor SizeOf(TIconMetrics). iHorzSpacing: Especifica el espacio horizontal entre iconos en el escritorio. iVertSpacing: Especifica el espacio vertical entre iconos en el escritorio. iTitleWrap: Indica si los ttulos de iconos deben cambiar de lnea en caso de que sean largos. El valor cero indica que no se darn cambios de lnea; un valor diferente de cero indica que s los podr haber. lfFont: Indica la fuente (tipo de letra) a utilizar en los ttulos de los iconos. TMinimizedMetrics = packed record cbSize: UINT; {tamao del registro TMinimizedMetrics} iWidth: Integer; {ancho de ventanas minimizadas}

iHorzGap: Integer; iVertGap: Integer; iArrange: Integer; end;

{espacio horizontal entre ventanas minimizadas} {espacio vertical entre ventanas minimizadas} {disposicin de ventanas minimizadas}

cbSize: Especifica el tamao del registro TMinimizedMetrics. A este campo se le debe asignar el valor SizeOf(TMinimizedMetrics). iWidth: Especifica el ancho de la ventana minimizada. iHorzGap: Especifica el espacio horizontal entre ventanas minimizadas. iVertGap: Especifica el espacio vertical entre ventanas minimizadas. iArrange: Especifica cmo las ventanas minimizadas deben colocarse. Este campo puede contener uno de los valores de la Tabla 14-24 y uno de los valores de la Tabla 14-25.

14

TMouseKeys = packed record cbSize: UINT;

{tamao del registro TMouseKeys}

dwFlags: DWORD; iMaxSpeed: DWORD; iTimeToMaxSpeed: DWORD; iCtrlSpeed: DWORD; dwReserved1: DWORD; dwReserved2: DWORD; end;

{comportamiento de teclas de ratn} {velocidad mxima del ratn} {demora sobre mxima velocidad} {multiplicador de velocidad} {reservado para uso futuro} {reservado para uso futuro}

cbSize: Especifica el tamao del registro TMouseKeys. A este campo se le debe asignar el valor SizeOf(TMouseKeys). dwFlags: Especifica las opciones de comportamiento de las teclas que simulan el uso del ratn. Este campo puede contener uno o ms de los valores de la Tabla 14-26. iMaxSpeed: Especifica la velocidad mxima del ratn en pxels. El valor de este campo puede estar en el rango entre 10 y 360. Bajo Windows 95/98, no se realiza chequeo de rango sobre este valor. iTimeToMaxSpeed: Especifica la demora en milisegundos antes de que se alcance la velocidad mxima. El valor de este campo puede estar en el rango entre 1000 y 5000. iCtrlSpeed: Este campo es utilizado en Windows 95/98. Indica el valor a aadir a la velocidad en caso de que se pulse la tecla Ctrl. Este valor slo se toma en consideracin si el campo dwFlags contiene la opcin MKF_MODIFIERS. dwReserved1: Reservado para uso futuro. dwReserved2: Reservado para uso futuro.

TNonClientMetrics = packed record cbSize: UINT; iBorderWidth: Integer; iScrollWidth: Integer; iScrollHeight: Integer; iCaptionWidth: Integer; iCaptionHeight: Integer; lfCaptionFont: TLogFont; iSmCaptionWidth: Integer; iSmCaptionHeight: Integer; lfSmCaptionFont: TLogFont; iMenuWidth: Integer; iMenuHeight: Integer; lfMenuFont: TLogFont; lfStatusFont: TLogFont; lfMessageFont: TLogFont; end;

{tamao de registro TNonClientMetrics} {ancho del borde redimensionable} {ancho estndar de barra de desplazamiento} {altura estndar de barra de desplazamiento} {ancho de botones de ttulo} {altura de botones de ttulo} {fuente para la barra de ttulo} {ancho de botones de barras de herramientas} {altura de botones de barras de herramientas} {fuente para barra de herramientas} {ancho de botones de barra de men} {altura de botones de barra de men} {fuente para barra de men} {fuente para barra de estado} {fuente para cuadro de mensajes}

14

cbSize: Especifica el tamao de registro TNonClientMetrics. A este campo se le debe asignar el valor SizeOf(TNonClientMetrics). iBorderWidth: Grosor del borde para las ventanas redimensionables. iScrollWidth: Ancho de las barras de desplazamiento vertical estndar. IScrollHeight: Altura de las barras de desplazamiento vertical estndar. iCap tionWidth: Ancho de los botones de las barras de ttulo. iCaptionHeight: Altura de los botones de las barras de ttulo. lfCaptionFont: Tipo de letra a utilizar en las barras de ttulo. iSmCaptionWidth: Ancho de los botones de las barras de ttulo de las ventanas de herramientas. iSmCaptionHeight: Altura de los botones de las barras de ttulo de las ventanas de herramientas. lfSmCaptionFont: Tipo de letra a utilizar en las barras de ttulo de las ventanas de herramientas. iMenuWidth: Ancho de los botones de las barras de men. iMenuHeight: Altura de los botones de las barras de men. lfMenuFont: Tipo de letra a utilizar en las barras de men.

lfStatusFont: Tipo de letra a utilizar en las barras de estado. lfMessageFont: Tipo de letra a utilizar en los cuadros de mensajes. TSoundSentry = packed record cbSize: UINT; dwFlags: DWORD; iFSTextEffect: DWORD; iFSTextEffectMSec: DWORD; iFSTextEffectColorBits: DWORD; iFSGrafEffect: DWORD; iFSGrafEffectMSec: DWORD; iFSGrafEffectColor: DWORD; iWindowsEffect: DWORD; iWindowsEffectMSec: DWORD; lpszWindowsEffectDLL: PAnsiChar; iWindowsEffectOrdinal: DWORD; end;

{tamao del registro TSoundSentry} {opciones de SoundSentry} {efecto para aplicaciones de consola} {duracin para aplicaciones de consola} {color para aplicaciones de consola} {efecto para aplicaciones grficas} {duracin para aplicaciones grficas} {color para aplicaciones grficas} {efecto para aplicaciones Windows} {duracin para aplicaciones Windows} {DLL que contiene efecto especial} {reservado para uso futuro}

cbSize: Especifica el tamao del registro TSoundSentry. Asigne a este campo el valor SizeOf(TSoundSentry). dwFlags: Indica el comportamiento de las opciones de SoundSentry. Este campo puede contener uno de los valores de la Tabla 14-27. iFSTextEffect: Indica el comportamiento de las opciones de SoundSentry cuando una aplicacin de consola est ejecutndose a pantalla completa. Este campo puede contener uno de los valores de la Tabla 14-28. Este campo no est disponible bajo Windows NT, y se le debe asignar cero. iFSTextEffectMSec: Especifica cunto tiempo durar el efecto visual para aplicaciones de consola, en milisegundos. Este campo no est disponible bajo Windows NT, y se le debe asignar cero. iFSTextEffectColorBits: Especifica el color que ser utilizado para el efecto visual en las aplicaciones de consola. Este campo no est disponible bajo Windows NT, y se le debe asignar cero. iFSGrafEffect: Indica el comportamiento de las opciones de SoundSentry cuando una aplicacin grfica est ejecutndose a pantalla completa. Este campo puede contener uno de los valores de la Tabla 14-29. Este campo no est disponible bajo Windows NT, y se le debe asignar cero. iFSGrafEffectMSec: Especifica cunto tiempo durar el efecto visual para aplicaciones grficas, en milisegundos. Este campo no est disponible bajo Windows NT, y se le debe asignar cero. iFSGrafEffectColor: Especifica el color que ser utilizado para el efecto visual en las aplicaciones grficas. Este campo no est disponible bajo Windows NT, y se le debe asignar cero.

iWindowsEffect: Indica el comportamiento de las opciones de SoundSentry cuando est ejecutndose una aplicacin basada en ventanas. Este campo puede contener uno de los valores de la Tabla 14-30. iWin dowsEffectMSec: Especifica cunto durar el efecto visual para las aplicaciones Windows, en milisegundos. lpszWindowsEffectDLL: Especifica el nombre de una DLL especial que contiene una funcin de respuesta SoundSentryProc exportada. Esta funcin ser llamada cuando se genere un sonido. A este campo puede asignrsele nil si no se utiliza. iWindowsEffectOrdinal: Reservado para uso futuro. A este campo se le debe asignar cero.

14

TStickyKeys = packed record cbSize: UINT; dwFlags: DWORD; end;

{tamao del registro TStickyKeys} {opciones de StickyKeys}

cbSize: Especifica el tamao del registro TStickyKeys. Asigne a este campo el valor SizeOf(TStickyKeys). dwFlags: Indica el comportamiento de las opciones de StickyKeys. Este campo puede contener uno o ms de los valores de la Tabla 14-31.

TToggleKeys = packed record cbSize: UINT; {tamao del registro TToggleKeys} dwFlags: DWORD; {opciones de ToggleKeys} end; cbSize: Especifica el tamao del registro TToggleKeys. Asigne a este campo el valor SizeOf(TToggleKeys). dwFlags: Indica el comportamiento de las opciones de ToggleKeys. Este campo puede contener uno o ms de los valores de la Tabla 14-32.

14
TSerialKeys = packed record cbSize: UINT; dwFlags: DWORD; lpszActivePort: PAnsiChar; lpszPort: PAnsiChar; iBaudRate: UINT; iPortState: UINT; iActive: UINT; end;

{tamao del registro TSerialKeys} {opciones de SerialKeys} {nombre del puerto activo} {reservado} {velocidad del puerto en baudios} {estado de reaccin del puerto} {reservado}

cbSize: Especifica el tamao del registro TSerialKeys. A este campo se le debe asignar el valor SizeOf(TSerialKeys). dwFlags: Indica el comportamiento de las opciones de puerto serie. Este campo puede contener uno o ms de los valores de la Tabla 14-33. lpszActivePort: Indica el nombre del puerto serie que recibir la entrada del usuario. A este campo puede asignrsele Auto para indicar al sistema que monitorice todos los puertos serie no utilizados. lpszPort: Este campo est reservado y debe asignrsele nil. iBaudRate: Especifica la velocidad de transmisin actual del puerto serie identificado por el campo lpszActivePort. Este campo puede contener uno de los valores de la Tabla 14-34. iPortState: Especifica el estado del puerto serie identificado por el campo lpszActivePort. Este campo puede contener uno de los valores de la Tabla 14-35. iActive: Reservado para uso futuro.

VerLanguageName( wLang: DWORD;

{identificador de idioma}

szLang: PChar; nSize: DWORD ): DWORD;

{buffer que recibe el nombre del idioma} {tamao mximo del buffer} {devuelve la cantidad de bytes copiados al buffer}

Esta funcin recupera una cadena que describe el nombre del idioma identificado por el parmetro wLang.

wLang: Especifica el identificador del idioma cuyo nombre se desea recuperar. A este parmetro puede asignrsele el valor devuelto por GetSystemDefaultLangID, GetUserDefaultLangID, o uno de los valores de la Tabla 14-36. szLang: Puntero a buffer para una cadena de caracteres terminada en nulo que recibir el nombre del idioma. Si el valor de este parmetro es nil, la funcin devuelve el tamao de buffer necesario para almacenar el nombre del idioma. nSize: Especifica el tamao mximo del buffer szLang.

14

Si la funcin tiene xito, devuelve la cantidad de caracteres copiados a szLang, sin contar el terminador nulo; en caso contrario la funcin devuelve cero.

GetSystemDefaultLangID, GetUserDefaultLangID, VerQueryValue

Consulte el Listado 14-11, correspondiente a GetSystemDefaultLangID.

14

La clase TTimer de Delphi ofrece una encapsulacin fcil de usar de un temporizador de Windows. Sin embargo, el intervalo parece tener una resolucin limitada. Ese intervalo es slo una aproximacin que depende de la resolucin del ordenador y de la frecuencia con que la aplicacin recupera los mensajes de la cola de mensajes. Ms an, la forma en que Delphi encapsula un temporizador de Windows en un objeto tiende a hacer disminuir an ms la precisin del intervalo de espera. Cada objeto de la clase TTimer crea una ventana invisible. El procedimiento de ventana de esa ventana contiene un bucle de mensajes que lanza el evento OnTimer cada vez que se recibe un mensaje WM_TIMER. Esta forma de encapsulacin hace un uso relativamente ineficiente de los recursos del sistema (temporizadores y manejadores de ventana). Las funciones del API para crear y destruir un temporizador de Windows no son complejas. Al utilizar las funciones SetTimer y KillTimer para manipular un temporizador estndar de Windows, el desarrollador ahorrar recursos valiosos. El resto de las funciones de temporizacin permiten al desarrollador emular un temporizador o hacer mediciones exactas de tiempo. Una sola aplicacin contiene el cdigo de ejemplo para todas las funciones descritas en este captulo. .

15

La cantidad mxima de temporizadores que una aplicacin puede utilizar est limitada nicamente por la configuracin del sistema. Sin embargo, es una cantidad finita, y cada temporizador consume una cierta cantidad de recursos que Windows debe reservar y mantener. Para evitar este consumo de recursos, el desarrollador puede emular un temporizador utilizando la funcin GetTickCount dentro de un bucle. La tcnica pasa por inicializar una variable asignndole la hora de inicio, obtenida de una llamada a GetTickCount. En cada repeticin del bucle, esta hora de inicio es restada de la hora actual, que se obtiene llamando nuevamente a GetTickCount. Si la diferencia es mayor que el intervalo entre eventos deseado, entonces la aplicacin debe ejecutar las acciones necesarias. En cualquier caso, el proceso vuelve a repetirse. El siguiente ejemplo demuestra la tcnica.

var

implementation

procedure var begin

while begin if begin

do then not

end

end end procedure begin

end procedure begin end var

Un enfoque similar puede ser utilizado para hacer una pausa dentro de un bucle o funcin. Esta tcnica puede ser apropiada cuando un temporizador sea ineficiente o difcil de implementar. El siguiente ejemplo demuestra la tcnica.

var

implementation

procedure var begin while begin do not

15

repeat until end end procedure begin

end procedure begin end var

Los ordenadores actuales vienen equipados con un temporizador de alta resolucin. Este temporizador se dispara miles de veces por segundo, lo que los hace muy tiles cuando se necesita informacin de temporizacin muy precisa. El acceso a este temporizador de alta resolucin se logra gracias a las funciones

QueryPerformanceCounter y QueryPerformanceFrequency. La funcin QueryPerformanceCounter devuelve el valor actual del temporizador de alta resolucin, mientras que la funcin QueryPerformanceFrequency devuelve la cantidad de veces que el temporizador de alta resolucin se dispara cada segundo. Esta frecuencia vara en dependencia de la configuracin del hardware. Una aplicacin til de estas dos funciones es medir la cantidad de tiempo que consume la ejecucin de una llamada a funcin. Esta informacin es muy importante de cara a la optimizacin de las aplicaciones, y aplicando esta tcnica a todas las funciones de un programa se hace posible detectar cules de ellas consumen la mayor parte del tiempo de procesador. Utilice QueryPerformanceCounter al inicio y al final de cada funcin para recuperar su hora de inicio y de finalizacin. La diferencia entre esos dos valores debe entonces dividirse entre la frecuencia del temporizador de alta resolucin para obtener el tiempo total consumido. Utilice la siguiente frmula para medir el tiempo total de ejecucin en segundos: (HoraFinal HoraInicio) / frecuenciaTemp El siguiente ejemplo demuestra esta tcnica.

procedure var

begin

for for

to to

do do

end

15

En este captulo se describen las siguientes funciones de temporizacin:

GetTickCount: DWORD;

{devuelve un nmero de 32 bits}

Esta funcin devuelve la cantidad de milisegundos transcurridos desde que Windows fue iniciado. Por cuanto este valor se devuelve en un entero de 32 bits (DWORD), rotar alrededor de cero si Windows sigue funcionando sin interrupcin durante ms de 49,7 das. Bajo Windows NT, la aplicacin puede obtener el tiempo transcurrido desde que Windows fue iniciado recuperando el valor del contador de sistema bajo la clave del registro HKEY_PERFORMANCE_DATA. Este valor es un nmero de 8 bytes.

Si esta funcin tiene xito, el valor devuelto es la cantidad de milisegundos que han transcurrido desde que Windows fue iniciado; en caso contrario devuelve cero.

GetMessageTime, GetSystemTime, SetSystemTime, QueryPerformanceCounter

procedure var begin

end

KillTimer( hWnd: HWND; uIDEvent: UINT ): BOOL;

{manejador de la ventana que instal el temporizador} {identificador del temporizador} {devuelve TRUE o FALSE}

La funcin KillTimer destruye el temporizador especificado.

hWnd: El manejador de la ventana asociada al temporizador. Debe ser el mismo manejador que fue pasado a la funcin SetTimer al crear el temporizador. Si el manejador pasado a SetTimer en su momento fue cero, este parmetro debe ser cero.

uIDEvent: El identificador del temporizador a destruir. Este parmetro debe coincidir con el valor del parmetro uIDEvent pasado a la funcin SetTimer, si el manejador de ventana pasado a SetTimer es vlido. En caso contrario, si la aplicacin llama a SetTimer con el valor cero en hWnd, este parmetro debe coincidir con el identificador de temporizador devuelto por SetTimer.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

SetTimer, WM_TIMER

procedure var

stdcall

15

const implementation procedure begin

end procedure begin

end

procedure begin

end

QueryPerformanceCounter( var lpPerformanceCount: TLargeInteger ): BOOL;

{apunta al valor actual del contador} {devuelve TRUE o FALSE}

Si el hardware soporta un contador de alta resolucin, esta funcin recupera el valor actual de ese contador.

lpPerformanceCount: La direccin de un registro de tipo TLargeInteger al que se asignar el valor actual del contador de alta resolucin.

Si esta funcin tiene xito y el hardware soporta un contador de alta resolucin, devuelve TRUE. Si la funcin falla, o el hardware no soporta un contador de alta resolucin, devuelve FALSE.

GetTickCount, QueryPerformanceFrequency

procedure var begin if begin then

end else end

15

QueryPerformanceFrequency( var lpFrequency: TLargeInteger ): BOOL;

{apunta a frecuencia actual} {devuelve TRUE o FALSE}

Si el hardware soporta un contador de alta resolucin, esta funcin recupera la frecuencia de ese contador en cantidad de tics por segundo.

lpFrequency: La direccin de un registro TLargeInteger al que se asignar la frecuencia actual del contador de alta resolucin.

Si esta funcin tiene xito y el hardware soporta un contador de alta resolucin, esta funcin deposita su frecuencia en la variable apuntada por lpFrequency y devuelve TRUE. Si la funcin falla, o el hardware no soporta un contador de alta resolucin, devuelve FALSE.

QueryPerformanceCounter

procedure var begin if begin then

end else end

SetTimer( hWnd: HWND; nIDEvent: UINT; uElapse: UINT; lpTimerFunc: TFNTimerProc ): UINT;

{manejador de la ventana asociada al temporizador} {identificador de temporizador} {intervalo de activacin, en milisegundos} {puntero a funcin de respuesta} {devuelve identificador del nuevo temporizador}

Esta funcin crea un temporizador que se disparar cada vez que transcurra el intervalo especificado. Cuando se cumple el intervalo, o el procedimiento de ventana de la ventana especificada recibe un mensaje WM_TIMER, o la funcin apuntada por el parmetro lpTimerFunc es llamada. Si se produce un mensaje WM_TIMER, el parmetro wParam del mensaje contiene el valor del parmetro nIDEvent.

hWnd: Manejador de la ventana asociada con el temporizador, que debe ser propiedad del hilo que hace la llamada. Si este parmetro es cero, el parmetro nIDEvent y ninguna ventana es asociada al temporizador. nIDEvent: Entero que identifica nicamente al temporizador. Si el parmetro hWnd vale cero, este parmetro es ignorado.

uElapse: Especifica el intervalo de activacin, en milisegundos. lpTimerFunc: La direccin de una funcin de respuesta definida por la aplicacin. Esta funcin ser llamada cada vez que transcurra el intervalo especificado en uElapse. Si el valor de este parmetro es nil, el sistema colocar el mensaje WM_TIMER en la cola de mensajes de la aplicacin, y el campo hWnd del registro MSG que describe el mensaje contendr el valor del parmetro hWnd pasado a esta funcin.

Si la funcin tiene xito, devuelve un entero que identifica al nuevo temporizador; en caso contrario devuelve cero. La funcin KillTimer puede utilizar este valor para eliminar el temporizador.

TimerProc( hWnd: HWND; uMsg: UINT; idEvent: UINT; dwTime: DWORD );

{manejador de ventana asociada al temporizador} {mensaje WM_TIMER} {identificador de temporizador} {hora actual} {no devuelve nada}

15

Esta funcin es llamada cada vez que transcurre el intervalo de activacin del temporizador, si el parmetro lpTimerFunc es especificado. Esta funcin de respuesta puede realizar cualquier tarea que se estime necesaria.

hWnd: Manejador de la ventana asociada al temporizador. uMsg: Identifica al mensaje WM_TIMER. idEvent: El identificador del temporizador. dwTime: La cantidad de milisegundos desde que Windows fue iniciado; es el mismo valor que devuelve la funcin GetTickCount.

KillTimer, WM_TIMER

Consulte el Listado 15-5, correspondiente a la funcin KillTimer.

Cada funcin del API de Windows devuelve un valor a partir del cual el desarrollador puede determinar si la llamada ha tenido xito o ha fallado. Cuando algunas funciones fallan, asignan un valor en la memoria local del hilo que ofrece ms informacin sobre la causa del fallo. El desarrollador puede recuperar esa informacin para ayudarse en la depuracin u ofrecer al usuario una explicacin ms detallada del fallo de la aplicacin. Es muy poco comn en estos das adquirir una mquina que no ofrezca algn tipo de dispositivo de salida de audio. Los usuarios ahora estn acostumbrados a asociar ciertos sonidos con los mensajes de error, y el Panel de Control permite a los usuarios asociar sus propios sonidos a ciertos eventos. Windows ofrece funciones que permiten al desarrollador hacer uso de esos sonidos familiares para alertar al usuario de que un error se ha producido.

16

Cuando una funcin del API falla, en la mayora de los casos devuelve el valor FALSE, lo cual no es muy adecuado con vistas a determinar la causa del error. Muchas funciones indican que el desarrollador puede llamar a la funcin GetLastError para obtener ms informacin en relacin con el fallo. Esta funcin, en combinacin con la funcin FormatMessage, puede ser muy til a la hora de depurar una aplicacin o dar al usuario una explicacin ms detallada acerca de un mensaje de error del sistema operativo. El siguiente ejemplo intenta lanzar una aplicacin inexistente. El sistema operativo mostrar un mensaje, y entonces utilizaremos las funciones GetLastError y FormatMessage para recuperar una descripcin de por qu la funcin fall. Existen literalmente cientos de mensajes de error que pueden ser recuperados mediante GetLastError, y todos ellos se listan en el fichero Windows.Pas.

procedure var

begin

or nil nil

String

end

El icono Sonidos del Panel de Con trol permite a los usuarios asociar sonidos a ciertos eventos, incluyendo errores de programas o del sistema operativo. La funcin MessageBeep permite al desarrollador alertar al usuario de un error reproduciendo los sonidos que ste haya asociado a esos eventos, como demuestra el ejemplo a continuacin.

procedure begin if begin then

end else begin end end

En este captulo se describen en detalle las siguientes funciones:

16

Beep( dwFreq: DWORD; dwDuration: DWORD ): BOOL;

{frecuencia del sonido} {duracin del sonido} {devuelve TRUE o FALSE}

Esta funcin produce sonidos sencillos a travs del altavoz (speaker) del ordenador. Es una funcin sncrona, o sea que no devolver el control a la aplicacin hasta que el

sonido haya finalizado. Bajo Windows 95/98, esta funcin simplemente reproduce el sonido por defecto en las mquinas con tarjeta de sonido, o el pitido estndar del sistema en las mquinas que no la posean.

dwFreq: La frecuencia del sonido, en Hertzios. Este valor debe estar entre 37 y 32.767. Bajo Windows 95/98, este parmetro es ignorado. dwDuration: La duracin del sonido, en milisegundos. Bajo Windows 95/98, este parmetro es ignorado.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

MessageBeep

procedure begin end

ExitWindows( dwReserved: DWORD; Code: WORD ): BOOL;

{reservado} {reservado} {devuelve TRUE o FALSE}

Esta funcin hace que Windows cierre todas las aplicaciones, desconecte al usuario actual, y presente el cuadro de dilogo de conexin. Bajo Windows NT, esta funcin enva un mensaje WM_QUERYENDSESSION a todas las aplicaciones activas. Bajo Windows 95/98, esta funcin enva un mensaje WM_QUERYENDSESSION a todas las aplicaciones activas, exceptuando a aquella que llam a ExitWindows. Las aplicaciones indicarn que estn finalizando devolviendo TRUE al recibir este mensaje. Si alguna de las aplicaciones devuelve FALSE, el proceso de desconexin es abortado. Despus que los resultados de WM_QUERYENDSESSION han sido procesados, Windows enva un mensaje WM_ENDSESSION a todas las aplicaciones activas. El parmetro wParam del

mensaje WM_ENDSESSION es un valor diferente de cero si el sistema se est cerrando; en caso contrario es cero. No se debe lanzar nuevas aplicaciones durante este proceso.

dwReserved: Este parmetro es reservado y debe asignrsele cero. Code: Este parmetro es reservado y debe asignrsele cero.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

ExitWindowsEx, WM_ENDSESSION, WM_QUERYENDSESSION

procedure begin end

16
{indica el tipo de cierre} {reservado} {devuelve TRUE o FALSE}

ExitWindowsEx( uFlags: UINT; dwReserved: DWORD ): BOOL;

Esta funcin puede desconectar a un usuario, apagar el sistema o reinciarlo. De forma similar a ExitWindows, esta funcin provoca que los mensajes WM_QUERYENDSESSION y WM_ENDSESSION sean enviados a todos los procesos, en dependencia del valor del parmetro uFlags. Sin embargo, ExitWindowsEx retorna inmediatamente despus que la funcin es llamada y el proceso de cierre transcurre asncronamente, por lo que la aplicacin no puede asumir que todos los procesos han sido cerrados cuando ExitWindowsEx retorna. Durante este proceso, se deja a las aplicaciones una cantidad de tiempo especfica para responder a la peticin de cierre. Si las aplicaciones no responden despus de transcurrir ese intervalo, aparecer un cuadro de dilogo dndole al usuario las opciones de forzar a la aplicacin a cerrarse, reintentar la peticin de cierre o cancelar la peticin. En el caso de que la opcin

EWX_FORCE haya sido incluida en el parmetro uFlags, este cuadro de dilogo no aparecer, y todos los procesos sern obligados a cerrarse. Bajo Windows NT, para poder cerrar o reiniciar el sistema la aplicacin deber antes llamar a la funcin AdjustTokenPrivileges para habilitar el privilegio SE_SHUTDOWN_NAME.

uFlags: Valor que indica el tipo de operacin a realizar. Puede tomar uno de los valores de la Tabla 16-2. dwReserved: Este parmetro es reservado, y su valor es ignorado.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

ExitWindows, WM_ENDSESSION, WM_QUERYENDSESSION

procedure begin end

FatalAppExit( uAction: UINT; lpMessageText: PChar );

{reservado} {puntero a cadena} {no devuelve nada}

Esta funcin muestra un cuadro de mensaje con el texto especificado, y finaliza la aplicacin cuando el cuadro es cerrado por el usuario. Si hay un depurador de nivel de sistema ejecutndose, el usuario puede adems elegir retornar a la aplicacin que ha llamado a FatalAppExit. Use esta funcin para finalizar una aplicacin solamente cuando no haya otra manera de hacerla terminar. FatalAppExit puede no liberar memoria o no cerrar ficheros, y puede provocar un fallo general de Windows.

uAction: Este parmetro es reservado y debe ser puesto a cero. lpMessageText: Puntero a una cadena de caracteres terminada en nulo que se visualiza en el cuadro de mensaje. El mensaje se muestra en una nica lnea, y para pantallas de baja resolucin no debe superar los 35 caracteres.

ExitProcess, ExitThread, TerminateProcess, TerminateThread

16

procedure begin end

GetLastError: DWORD;

{devuelve el cdigo del ltimo error}

Esta funcin recupera el ltimo cdigo de error del hilo que hace la llamada. El cdigo de error puede establecerse llamando a la funcin SetLastError. El cdigo de error es un valor de 32 bits. El bit 29 est reservado para cdigos de error definidos por la aplicacin, y nunca es puesto a uno por las funciones del API de Windows. Si el bit 29 est activo, esto indica que se trata de un cdigo de error definido por la aplicacin, lo que garantiza que el cdigo de error no produce conflictos con ningn error definido por el sistema. El desarrollador debe llamar a la funcin GetLastError inmediatamente despus que un cdigo de error sea indicado por una llamada a funcin. La mayora de las funciones del API llaman a SetLastError cuando fallan, pero algunas tambin lo hacen en caso de xito, para poner el cdigo de ltimo error a cero y as limpiar cualquier posible indicacin de fallo anterior. El cdigo de error se almacena siempre en memoria local de hilos para que diferentes hilos de un proceso no sobreescriban sus respectivos cdigos de error. La funcin FormatMessage puede utilizarse para recuperar el mensaje de error asociado a un cdigo de error del sistema operativo.

Si la funcin tiene xito, devuelve el cdigo del ltimo error establecido por SetLastError. Las descripciones individuales de cada funcin listan las condiciones bajo las cuales stas utilizan SetLastError para asignar el cdigo del ltimo error. Si la funcin falla, devuelve cero.

FormatMessage, SetLastError

procedure var begin

end

MessageBeep( uType: UINT ): BOOL;

{tipo de sonido} {devuelve TRUE o FALSE}

Esta funcin reproduce un sonido en forma de onda a travs de la tarjeta de sonido instalada en el ordenador. El sonido es reproducido asncronamente, y el control es inmediatamente devuelto a la aplicacin. Estos sonidos se asignan mediante el Panel de Control, y se almacenan en el registro bajo la clave HKEY_CURRENT_USER\AppEvents\Schemes\Apps\.Default. Los sonidos individuales tienen sus propias claves, y el sonido actualmente asociado al evento se almacena bajo su clave .Current. Si el sonido especificado no puede ser reproducido, Windows intenta reproducir el sonido por defecto (predeterminado) del sistema. Si el sonido por defecto no puede ser reproducido, Windows produce un pitido estndar a travs del altavoz del ordenador.

uType: Un entero que identifica el sonido a reproducir. Este parmetro puede tomar uno de los valores de la Tabla 16-3.

Si la funcin tiene xito, devuelve TRUE; en caso contrario devuelve FALSE. Para obtener informacin adicional sobre un error, utilice la funcin GetLastError.

16

Beep

const array implementation procedure begin end of

SetLastError( dwErrCode: DWORD );

{cdigo de error} {no devuelve nada}

Esta funcin establece el cdigo del ltimo error para el hilo que hace la llamada. El cdigo de error es un valor de 32 bits. El bit 29 est reservado para cdigos de error definidos por la aplicacin, y nunca es puesto a uno por las funciones del API de Windows. Si el bit 29 est activo, esto indica que se trata de un cdigo de error definido por la aplicacin, lo que garantiza que el cdigo de error no produce conflictos con ningn error definido por el sistema. El desarrollador debe llamar a la funcin GetLastError inmediatamente despus que un cdigo de error sea indicado por una llamada a cualquier funcin. La mayora de las funciones del API llaman a SetLastError cuando fallan, pero algunas tambin lo hacen en caso de xito, para poner el cdigo de ltimo error a cero y as limpiar cualquier posible indicacin de fallo anterior. El cdigo de error se almacena siempre en memoria local de hilos para que diferentes hilos de un proceso no sobreescriban sus respectivos cdigos de error.

dwErrCode: Valor que indica el cdigo del ltimo error para el hilo que hace la llamada.

GetLastError

Consulte el Listado 16-7, correspondiente a la funcin GetLastError.

Se dispone de una base de conocimientos bastante amplia acerca de la programacin para Windows en general y la programacin en Delphi en particular. La informacin contenida en este libro se apoya parcialmente en nuestra investigacin y en conocimientos extrados de los siguientes libros: Calvert, Charles, Delphi 4 Unleashed [Sams Publishing, 1998] Pacheco y Teixeira, Delphi 4 Developers Guide [Sams Publishing, 1998] Thorpe, Danny, Delphi Component Design [Addison-Wesley Developers Press, 1997] Konopka, Ray, Developing Custom Delphi 3 Components [Coriolis Group Books, 1997] Petzold y Yao, Programming Windows 95 [Microsoft Press, 1996] Rector y Newcomer, Win32 Programming [Addison-Wesley Developers Press, 1997] Richter, Jeffrey, Advanced Windows, [Microsoft Press, 1997] Beveridge and Wiener, Multithreading Applications in Win32, [Addison-Wesley Developers Press, 1997]

En la tienda de libros y software de Danysoft podr encontrar una seleccin de ttulos orientados a Delphi (en el momento de publicar este libro existen ms de 50 ttulos), tanto en ingls como en castellano, con una informacin muy detallada sobre cada uno. Ms informacin en: http://shop.danysoft.com. Asimismo, el equipo de Danysoft est fuertemente comprometido con Delphi; puede ver las novedades editoriales que publiquemos en http://editorial.danysoft.com.

Nuestro equipo ha revisado el texto y cdigo fuente para evitar cualquier tipo de error, pero no podemos prometerle que ste est o estar siempre libre de errores. Por ello y para que esto no sea una molestia para usted, hemos habilitado en http://edito rial.danysoft.com un apartado especial para cada libro que publiquemos, con el objetivo de que el libro permanezca vivo. En este apartado encontrar por cada ttulo : Informacin detallada del libro. Una lista de las erratas. Comentarios de los lectores. Una lista de libros relacionados. Asimismo, podr enviarnos por email a editorial@danysoft.com, (le rogamos no se olvide de indicarnos el ttulo del libro y sus datos): Sus comentarios sobre el libro. Aadir una errata a lista existente (le rogamos no se olvide de indicarnos la pgina). Decirnos exactamente lo que piensa, para que conozcamos sus inquietudes. Todo comentario ser muy bien recibido y tenido en cuenta en futuras acciones de nuestro equipo para intentar satisfacer sus necesidades.

A
ActivateKeyboardLayout - 473 AddAtom - 622 ANSI, funciones - 8 Arquitectura de la memoria en Win32 382

CountClipboardFormats - 450 CreateDirectory - 539 CreateDirectoryEx - 542 CreateFile - 543 CreateFileMapping - 549 CreateMDIWindow - 53 CreateWindow - 57 CreateWindowEx - 76 - 97

FillMemory - 390 FindAtom - 641 FindClose - 563 FindCloseChangeNotification - 564 FindFirstChangeNotification - 564 FindFirstFile - 568 FindNextChangeNotification - 572 FindNextFile - 572 FlushFileBuffers - 573 FlushViewOfFile - 574 FormatMessage - 642 Formatos del PortaPapeles - 444 FreeEnvironmentStrings - 687 FreeLibrary - 316 FreeLibraryAndExitThread - 316 Funciones De respuesta - 6 Importacin - 5 Importadas incorrectamente - 5 Parmetros - 7

B
Beep - 783 BroadcastSystemMessage

D
DefFrameProc - 102 DefMDIChildProc - 107 DefWindowProc - 108 DeleteAtom - 636 DeleteFile - 555 DestroyWindow - 83 Directiva exports - 311 external - 312 DisableThreadLibraryCalls - 315 DispatchMessage - 109 DLLEntrypoint - 314 DosDateTimeToFileTime - 556 DragDetect - 475

C
Cadenas de caracteres - 4 CallNextHookEx - 99 CallWindowProc - 100 Caractersticas de accesibilidad - 683 ChangeClipboardChain - 448 CharLower - 624 CharLowerBuff - 626 CharNext - 627 CharPrev - 627 CharToOem - 628 CharToOemBuff - 630 CharUpper - 630 CharUpperBuff - 631 ClipCursor - 474 CloseClipboard - 449 CloseHandle - 534 Cdigo fuente - 793 CompareFileTime - 535 CompareString - 632 Constantes - 4 Convenio de traspaso cdecl - 312 pascal - 312 register - 312 stdcall - 312 Convenios de traspaso de parmetros 312 CopyFile - 538 CopyMemory - 389

G
Ganchos WH_CALLWNDPROC - 141 WH_CALLWNDPROCRET - 143 WH_CBT - 144 WH_DEBUG - 147 WH_GETMESSAGE - 148 WH_JOURNALPLAYBACK - 149 WH_JOURNALRECORD - 151 WH_KEYBOARD - 153 WH_MOUSE - 154 WH_MSGFILTER - 155 WH_SHELL - 157 WH_SYSMSGFILTER - 158 Gestin del ratn - 471 Gestin del teclado - 471 GetACP - 648 GetAsyncKeyState - 477 GetAtomName - 650

E
EmptyClipboard - 450 EnumClipboardFormats - 451 EnumSystemCodePages - 637 EnumSystemLocales - 639 ExitWindows - 784 ExitWindowsEx - 785 ExpandEnvironmentStrings - 686 Exportacin de Funciones - 311

F
FatalAppExit - 787 Ficheros de inicializacin - 329 FileTimeToDosDateTime - 557 FileTimeToLocalFileTime - 558 FileTimeToSystemTime - 559

GetCapture - 478 GetCaretBlinkTime - 478 GetCaretPos - 479 GetClipboardData - 453 GetClipboardFormatName - 456 GetClipboardOwner - 457 GetClipboardViewer - 457 GetClipCursor - 479 GetCommandLine - 687 GetComputerName - 688 GetCPInfo - 651 GetCurrentDirectory - 575 GetCursorPos - 480 GetDateFormat - 652 GetDiskFreeSpace - 689 GetDoubleClickTime - 481 GetDriveType - 691 GetEnvironmentStrings - 692 GetEnvironmentVariable - 694 GetFileAttributes - 576 GetFileInformationByHandle - 577 GetFileSize - 580 GetFileTime - 581 GetFileType - 582 GetFileVersionInfo - 583 GetFileVersionInfoSize - 584 GetFullPathName - 584 GetInputState - 481 GetKeyboardLayout - 482 GetKeyboardLayoutList - 482 GetKeyboardLayoutName - 483 GetKeyboardState - 484 GetKeyboardType - 485 GetKeyNameText - 487 GetKeyState - 489 GetLastError - 788 GetLocaleInfo - 694 GetLocalTime - 702 GetLogicalDrives - 703 GetLogicalDriveStrings - 705 GetMessage - 110 GetMessageExtraInfo - 114 GetMessagePos - 115 GetMessageTime - 116

GetModuleFileName - 320 GetModuleHandle - 320 GetOEMCP - 655 GetPriorityClipboardFormat - 459 GetPrivateProfileInt - 332 GetPrivateProfileSection - 333 GetPrivateProfileSectionNames - 334 GetPrivateProfileString - 336 GetPrivateProfileStruct - 338 GetProcAddress - 321 GetProcessHeap - 391 GetProfileInt - 339 GetProfileSection - 340 GetProfileString - 341 GetQueueStatus - 116 GetShortPathName - 585 GetStartupInfo - 706 GetSystemDefaultLangID - 708 GetSystemDefaultLCID - 709 GetSystemDirectory - 709 GetSystemInfo - 710 GetSystemTime - 715 GetTempFileName - 586 GetTempPath - 588 GetTickCount - 773 GetTimeFormat - 658 GetTimeZoneInformation - 716 GetUserDefaultLangID - 719 GetUserDefaultLCID - 719 GetUserName - 720 GetVersionEx - 721 GetVolumeInformation - 723 GetWindowsDirectory - 725 GlobalAddAtom - 661 GlobalAlloc - 392 GlobalDeleteAtom - 663 GlobalDiscard - 395 GlobalFindAtom - 663 GlobalFlags - 395 GlobalFree - 396 GlobalGetAtomName - 664 GlobalHandle - 397 GlobalLock - 398 GlobalMemoryStatus - 399

GlobalReAlloc - 401 GlobalSize - 404 GlobalUnlock - 405

H
HeapAlloc - 406 HeapCreate - 409 HeapDestroy - 410 HeapFree - 411 HeapReAlloc - 411 Heaps - 382 HeapSize - 413 Horas de ficheros - 532

I
InitAtomTable - 665 InSendMessage - 119 IsBadCodePtr - 414 IsBadReadPtr - 415 IsBadStringPtr - 416 IsBadWritePtr - 417 IsCharAlpha - 666 IsCharAlphaNumeric - 666 IsCharLower - 667 IsCharUpper - 668 IsClipboardFormatAvailable - 460

J
joyGetDevCaps - 492 joyGetNumDevs - 495 joyGetPos - 496 joyGetPosEx - 497 joyGetThreshold - 500 joyReleaseCapture - 501 joySetCapture - 502 joySetThreshold - 506

K
keybd_event - 491 KillTimer - 774

L
Librera de enlace dinmico - 311 LoadKeyboardLayout - 507

LoadLibrary - 322 LoadLibraryEx - 325 LocalAlloc - 419 LocalFileTimeToFileTime - 589 LocalFlags - 422 LocalFree - 422 LocalHandle - 423 LocalLock - 424 LocalReAlloc - 425 LocalSize - 428 LocalUnlock - 429 LockFile - 590 lstrcat - 668 lstrcmp - 670 lstrcmpi - 671 lstrcpy - 672 lstrlen - 673

Punto de entrada de una DLL - 313

SetDoubleClickTime - 521 SetEndOfFile - 599 SetEnvironmentVariable - 728 SetFileAttributes - 599 SetFilePointer - 603 SetFileTime - 605 SetKeyState - 522 SetLastError - 790 SetLocaleInfo - 729 SetLocalTime - 733 SetMessageExtraInfo - 139 SetSystemTime - 735 SetTimer - 778 SetVolumeLabel - 737 SetWindowsHookEx - 139 SwapMouseButton - 523 SystemParametersInfo - 738 SystemTimeToFileTime - 606

Q
QueryPerformanceCounter - 776 QueryPerformanceFrequency - 777

R
ReadFile - 594 RegCloseKey - 342 RegCreateKeyEx - 342 RegDeleteKey - 346 RegDeleteValue - 347 RegEnumKeyEx - 349 RegEnumValue - 351 RegFlushKey - 354 RegisterClass - 83 RegisterClassEx - 89 RegisterClipboardFormat - 462 RegisterWindowMessage - 127 Registro de Windows - 330 RegLoadKey - 355 RegOpenKeyEx - 357 RegQueryValueEx - 361 RegReplaceKey - 364 RegSaveKey - 365 RegSetValueEx - 367 RegUnLoadKey - 368 ReleaseCapture - 517 RemoveDirectory - 596 ReplyMessage - 129

M
Manejadores - 4 MapViewOfFile - 591 MapVirtualKey - 510 MapVirtualKeyEx - 512 Memoria virtual - 382 MessageBeep - 789 Microsoft Programa de Logotipos - 10 mouse_event - 514 MoveFile - 592 MoveMemory - 430

T
Tabla de tomos global - 619 local - 619 Temporizadores - 769 Tipos de datos de Windows - 2 ToAscii - 677 TranslateMessage - 161

U
UnhookWindowsHookEx - 162 Unicode - 7 Unicode, funciones - 8 UnloadKeyboardLayout - 526 UnlockFile - 607 UnmapViewOfFile - 608 UnregisterClass - 90

O
OemKeyScan - 516 OemToChar - 675 OemToCharBuff - 676 OpenClipboard - 461 OpenFileMapping - 593

S
SearchPath - 597 SendMessage - 130 SendMessageCallback - 131 SendMessageTimeout - 133 SendNotifyMessage - 137 SetCapture - 518 SetCaretPos - 520 SetClipboardData - 463 SetClipboardViewer - 468 SetComputerName - 726 SetCurrentDirectory - 598 SetCursorPos - 521

P
PeekMessage - 119 Portapapeles - 443 PostMessage - 122 PostQuitMessage - 124 PostThreadMessage - 125

V
VeriTest - 11 VerLanguageName - 764 VerQueryValue - 608 VirtualAlloc - 431 VirtualFree - 436 VirtualProtect - 437

VirtualQuery - 440 VkKeyScan - 527 VkKeyScanEx - 528

W
WaitMessage - 162 Windows Cadenas de caracteres - 4 Constantes - 4 Importacin de funciones - 5 WriteFile - 616 WritePrivateProfileSection - 369 WritePrivateProfileString - 372 WritePrivateProfileStruct - 373 WriteProfileSection - 375 WriteProfileString - 377 wvsprintf - 678

Z
ZeroMemory - 442

Você também pode gostar