econoclmlen· · tit'·0 e ec ronlco de caras, .~~~~~~~~ imagenes,...

6
ARGENTINA $ 5.- URUGUAY $17.-, MARZO 1995 Consultas SQL con lenguaje natural Video digital ARGENTINA Programacion en Windows .usando VBXs ~~ ~ ,&'f. - e, ~rb R ·· tit'· d ~~~ econoclmlen 0 e ec ronlco e caras, .~~~~~ imagenes, voz y caracteres . ~4>}~~

Transcript of econoclmlen· · tit'·0 e ec ronlco de caras, .~~~~~~~~ imagenes,...

ARGENTINA $ 5.- URUGUAY $17.-,

MARZO 1995

Consultas SQL conlenguaje naturalVideo digital

ARGENTINA

Programacion en Windows .usando VBXs~~

~,&'f. -e, ~rb

R · · tit'· d ~~~econoclmlen 0 e ec ronlco e caras, .~~~~~imagenes, vozy caracteres . ~4>}~~

Como Dominar las-APls:Programacion de Funciones enWindows y Windows NTEste articulo tiene por objetivo

clarificar de una vez por to-das el uso de funciones ya

programadas en el sistema operativo ysus componentes, a fin de que los pro-gramadores en cualquier lenguaje (in-cluyendo lenguajes de macros) pue-dan instrumentar sus prestaciones sinnecesidad de asimilar concepcionesesotericas expresadas en una termino-logia oscura. Si bien la ejemplifica-ci6n gira en tomo de Visual Basic, lal6gica de la exposici6n pretende serutil para desarrolladores de todas lasconfesiones. Las funciones estan alIipara todos, y en eso radica precisa-mente su raz6n de ser.

La interfase de programaci6n deWindows (la API de Windows, enotras palabras), con su repertorio demiles de funciones, constituye uno delos recursos de desarrollo mas podero-sos al alcance de los programadoresen ese complejo sistema operativo.Hace pocos afios, la unica altemativapara la programaci6n en Windows erael SDK, uno de los kits mas complica-dos y heterogeneos de la informaticasobre PCs, s6lo inteligible para quie-nes dominaban 10s resortes intimosdel lenguaje C y estaban dispuestos aemplear cientos de lineas de programapara hacer aparecer una ventana quedijera "Hola Mundo".

En los afios 90, y no antes, la apa-rici6n de lenguajes de interfase gra-fica y de alto nivel en el universoWindows puso la extraordinaria po-tencia de ese entorno al alcance delos mortales comunes. En Realizer 0en Visual Basic la ventana con elmensaje podia programarse en con-tados segundos, a menu do sin escri-bir siquiera una sola linea de c6digoy sin perder el control absoluto de 10que estaba sucediendo en el procesa-dOL Fue posible entonces, y 10 sigue

siendo ahora, lograr efectos de pro-gramaci6n formidables, sin prodigarinstrucciones relacionadas con cosastales como reservas memoria, anali-zar punteros, destruir objetos en de-suso e infinidad de instancias abso-lutamente rutinarias. Algunos de loscomponentes de los nuevos lengua-jes, generalmente una DLL, se hacfacargo de todas esas transaccionesinevitables, y realizaba 10 suyo demanera 6ptima.

No obstante ello, todos los lengua-jes son fatalmente finitos: algunos notraen casi instrucciones de bajo nivel,otros carecen de instrucciones orienta-das a multimedia, operaci6n de dispo-sitivos especfficos como scanners 0impresoras, y la mayoria no puede ha-cer nada en forma directa para cum-plimentar los pasos mas fundamenta-les de la gesti6n de redes. Parad6jica-mente, esa impresi6n es falsa: todo

lenguaje de alto nivel, salvo algunaque otra implementaci6n catastr6fica,esta magnificamente dotado para de-clarar y utilizar las funciones que yahan sido programadas en el sistemaoperativo y en gran parte de sus com-ponentes, como ser drivers y fonts.

Cuando en DOS se deseaba apro-vechar las ruedas que ya estaban in-ventadas, todo el mundo sabia que 10que con venia hacer era conseguiruna biblioteca especializada en trata-miento grafico, gesti6n de bases dedatos, comunicaciones 0 10 que fue-reo Luego, las funciones 0 subrutinasde esa biblioteca se incorporaban ala aplicaci6n "linkeando" el progra-ma y las bibliotecas de funciones ausar, engrosando asi los programasejecutables resultantes. Los masafortunados disponian de la versi6nfuente de las bibliotecas, de modoque con un poco de trabajo (que en

realidad no era poco) podfan abstraersolamente el cuerpo de las funcionesefectivamente usadas y compilarloseparadamente en una LIB objeto,siempre y cuando se dominara laciencia de los switches de compila-cion y linkeado. Pero aun asf, cadaprograma realizado inclufa dentrosuyo la masa de la programacionprevia, se usaran 0 no luego esasfunciones en la vida real. En aque-Ilos tiempos y sistemas operativoslas bibliotecas eran modulos de eje-cucion de linkeado estatico.

Como to do el mundo sabe, enWindows y otros sistemas operativoselaborados, las reglas del juego sonotras. Las funciones estan program a-das en programas ejecutables espe-ciales que "exportan" sus funcionescuando uti lenguaje 0 aplicacion asfse 10 solicita, pasandole parametrosen el orden correcto y con el formateadecuado. EI linkeado es ahora dina-mico, y de allf el nombre y la exten-sion de esas bibliotecas: DLL, 0 Dy-namic Link Libraries. Aunque estaafirmacion pueda herir susceptibili-dades, es evidente que no se es ungenuine programador en Windows sino se conocen sus DLLs 0 no se lassabe utilizar. Por metonimia tambienpodrfamos afirmar que ninguna apli-cacion esta adaptada a la vida en eseentomo operativo si no permite de-clarar y utilizar las funciones que lasDLLs contienen.

i.Que es una DLL?En Windows la pregunta deberfa

formularse a la inversa: i,que no esuna DLL? Al fin y al cabo, Windowsmismo, y casi todos sus archi vos(con la excepcion de Helps, archivosde inicializacion, Readmes y muypoco mas) son en realidad DLLs. Lasbibliotecas que forman el nucleo du-ro de Windows (USER.EXE, KER-NEL.EXE, GDI.EXE) llevan la viejaextension que denotaba a los ejecuta-bles autonomos comunes, pero eso espor razones de compatibilidad conversiones muy arcaicas, antes quepor no ser DLLs.

Ahora bien, desde muy antiguo haydos clases dominantes de programas.ejecutables, que todavfa ahora se lla-man, respectivamente, COM y EXE.Las DLLs son en rigor una subclasede los EXEs. Los archivos EXE tie-nen una estructura estandar y una sec-cion en formato fijo (su encabeza-miento 0 header). De tal modo, si uno

Listado 1Exports:ord seg offset name

8 3 0232 WEP exported, shared data484 1 b664 __ GP exported, shared data525 22 085e WNETCONNECTDIALOG exported, shared data465 14 035e DRAGDETECT exported, shared data372 12 1789 GETINTERNALICONHEADER exported. shared data404 8 Oec2 GETCLASSINFO exported. shared data292 1 ae14 UNHOOKWINDOWSHDDKEX exported, shared data175 12 167e LoADBITMAP exported. shared data88 25 26e5 ENDDIALoG exported, shared data

272 1 1930 ISZooMED exported, shared data255 2 oe7o DEFDRIVERPRDC exported. shared data168 3 24fd SETCARETBLINKTIME exported. shared data147 39 0724 SETCLIPBoARDVIEWER exported. shared data43 14 1088 CLOSEWINDOW exported. shared data

518 22 0975 WNETCANCELCONNECTIoN exported. shared data423 37 106d DLGDIRSELECTCOMBoBOXEX exp.orted. shared data

58 8 Oeeb GETCLASSNAME exported. shared data247 1 14ca GETCURSoR exported. shared data524 22 0855 WNETWRITEJoB exported. shared data282 6 If95 SELECTPALETTE exported. shared data22 1 a875 SETFoCUS exported. shared data

421 16 0518 WVSPRINTF exported, shared data38 1 ab49 GETWINDoWTEXTLENGTH exported. shared data69 1 ab97 SETCURSoR exported. shared data

413 9 12b6 DELETEMENU exported. shared data264 9 1200 GETMENUITEMID exported. shared data198 15 0875 CASCADECHILDWINDoWS exported. shared data483 41 1895 SYSTEMPARAMETERSINFo exported. shared data

7 5 0303 EXITWINDOWS exported. shared data1 1 ab5d MESSAGEBOX exported. shared data

dispone de un programa analizador deEXEs (0 mas bien un decodificadorde headers) puede espiar hasta ciertopunto cual es su estructura intema.

En el mundo de 16 bits uno de losanalizadores mas populares es elEXEHDR, que habitualmente vienecon los diversos paquetes dellenguajeC de Microsoft. Borland, Symantec 0

Watcom tambien proporcionan utilita-rios semejantes. Si usted no tiene aunsu EXEHDR 10puede levantar del fo-ro de CompuServe 0 de los BBS deMicrosoft. Ellistado I muestra el con-tenido de la seccion de la DLL USE-R.EXE, tal como resulta de ejecutar elcomando:

EXEHDR /VERBoSE C:\WINDoWS\SYSTE-M\USER.EXE > USER.TXT

o sus equivalentes. He seleccionadosolo aquellas lfneas que se refieren alas funciones exportables, las cualesfiguran en un orden en principio cao-

tico bajo el tftulo de Exports. Los da-tos susceptibles de ser decodificadospar el EXEHDR son el orden de lafuncion, el segmento y offset queconstituyen las direcciones de una bi-blioteca de 16 bits, y el nombre y lascaracterfsticas de uso de la funcion,que casi siempre seran "exported,shared data", 10 cual significa que lafuncion es a la vez accesible y reen-trante. Esto es, cualquier aplicacionque la invoque puede usarla, aunquehaya otra que 10 esta haciendo en esemismo momento.

Prestemos atencion a tres rasgosfundamentales puesto de manifiestopor el programa espfa. En primer lu-gar, es posible conocer el numero deuna funcion. Cuando se declara unafuncion por su numero antes que porsu nombre, por ejemplo

Declare Function #7 Lib ·User" (By-Val dwReturnCode As Long. ByVal

Lis/ado 2Name hTaskPROGMAN 061 FWINFILE 152FWPS IF57

NameCOMMCOMMCTRLCOMMDLGCOUREDISPLAYFIXFONTSFONTSGDIKBDUSXKERNELKEYBOARDLZEXPANDMMSYSTEMMODERNMOUSEMSTOOLSNETAPIOEM FONTSROMANSCON FIGSCRI PTSERIFESHELLSMALLESOUNDSSERIFESYMBOLESYSTEMTIMERTOOLHELPUSERVER

hModule022F1207145F02C701BF04370417044F031F010F01471427165702BF015FIFA710EF043F0347141F029F02B7179F02AF010702A7033F013F164FIF17045F1467

hParent0137061F152F

UsageOOOE000100020001OOOF00010002OOOE000100170010000200030001OOOE000200010002000100010001000100040001OOOE00010001OOOF0001000100000002

nEvents000100010000

Version3.11.0443.11.0443.11 .0443.10.103

3.10.1033.10.1033.11. 044

3.11. 0443.10.1033.11.0443.10.1033.10.1033.10.1036.22.0003.11. 0443.10.1033.10.1033.11. 0443.10.1033.10.1033.11. 0443.10.1033.10.1033.10.1033.10.1033.10.1033.10.1033.11.0443.11. 0443.11.044

Declare Function ExitWindows ...etc

la localizaci6n de la funci6n seraligeramente mas rapida porque nodebera hacer parsing del string quecorresponde a su nombre, el cual es,en Windows de 16 bits, insensible almayusculado y por 10 tanto un apicemas lento todavfa. El riesgo que secorre es que la versi6n de la bibliote-ca puede cambiar y con ello el ordeninterno de sus funciones quedar alte-rado. Cuando se pretenda ejecutar

hInst17A6146E1FIE

Version3.10.1033.11. 0441.09.000

ExeC;\WINDOWS\PROGMAN.EXEC;\WINDOWS\WINFILE.EXEC;\VB\CDK\WPS.EXE

ExeC:\WINDOWS\SYSTEM\COMM.DRVC;\WINDOWS\SYSTEM\COMMCTRL.DLLC:\WINDOWS\SYSTEM\COMMDLG.DLLC:\WINDOWS\SYSTEM\COURE.FONC;\WINDOWS\SYSTEM\OAKB801.DRVC;\WINDOWS\SYSTEM\VGAFIX.FONC;\WINDOWS\SYSTEM\VGASYS.FONC:\WINDOWS\SYSTEM\GDI.EXEC;\WINDOWS\SYSTEM\KBDUSX.DLLC:\WINDOWS\SYSTEM\KRNL386.EXEC:\WINDOWS\SYSTEM\KEYBOARD.ORVC;\WINDOWS\SYSTEM\LZEXPAND.DLLC;\WINDOWS\SYSTEM\MMSYSTEM.DLLC;\WINDOWS\SYSTEM\MODERN.FONC;\WINDOWS\SYSTEM\MOUSE.DRVC;\DOS\MSTOOLS.DLLC;\WINDOWS\SYSTEM\NETAPI.DLLC;\WINDOWS\SYSTEM\VGAOEM.FONC;\WINDOWS\SYSTEM\ROMAN.FONC:\WINDOWS\SYSTEM\SCONFIG.DLLC:\WINDOWS\SYSTEM\SCRIPT.FONC;\WINDOWS\SYSTEM\SERIFE.FONC;\WINDOWS\SYSTEM\SHELL.DLLC;\WINDOWS\SYSTEM\SMALLE.FONC:\WINDOWS\SYSTEM\MMSOUND.DRVC;\WINDOWS\SYSTEM\SSERIFE.FONC;\WINDOWS\SYSTEM\SYMBOLE.FONC;\WINDOWS\SYSTEM\SYSTEM.DRVC;\WINDOWS\SYSTEM\TIMER.DRVC;\WINDOWS\SYSTEM\TOOLHELP.DLLC;\WINDOWS\SYSTEM\USER.EXEC;\WINDOWS\SYSTEM\VER.DLL

una funci6n con los argumentos in-debidos el fracaso es seguro. En se-gundo lugar, el listado consigna losnombres de las funciones. Si ustedes un programador escrupuloso, harabien en escribirlas exactamente conlas mayusculas y minusculas queconsign a la documentaci6n, ya queen Windows 95 y Windows NT(y engeneral, en todos los sistemas opera-tivos de 32 bits) ambos caracteres seconsideraran distintos en 10 que anombres de funci6n concierne. Porultimo, la lista incluye el uso de lafunci6n, como dijeramos, pero no eltipo 0 el numero de sus argumentos.Esto implica, en fin, que por mas

que usted disponga de una baterfa deutilitarios lectores de encabezamien-tos, hara mejor en adquirir la docu-mentaci6n original que en tratar deadivinar la forma en que se pasanparametros a una funci6n. Toda ladocumentaci6n tecnica de Windowsesta incluida en esos estupendos vo-lumenes de CD ROM que los pro-gramadores conocen como MSDN.Tambien se tratan las APIs en varioslibros excelentes que circulan en elmercado, entre los que hay que men-cionar la celebre Windows API Bibley la notable Visual Basic Program-mer's Guide to the Windows API deDaniel Appleman.

Ahara bien, 10 notable del caso esque no s610 las DLLs explfcitas sepueden espiar fructfferamente, sinoque cualquier otro ejecutable mas 0menos eITcubierto esta al alcance decualquiera. Con el EXEHDR y susanalogos usted puede intentar con ar-chivos de fonts (FaT 0 FaN), drivers(DRV), extensiones de Visual Basic(VB X) u Ole Custom Controls(OCX). Todas estas especies, sin ex-cepci6n, son en realidad subclases deDLLs, aunque en este terreno la ideade subclase se aplica tambien a otrasentidades con las que por ahora masvale no meterse.

Lo maravilloso de las funciones(cuando se las percibe desde un mar-co instrumental de alto nivel) es quegran parte de 10que atafie ala 10cali-zaci6n del archivo en que se encuen-tran, la busqueda de la funci6n en suinterior, la selecci6n de los m6dulosa cargar en memoria, la puesta en co-la de los m6dulos y su ulterior des-carga, la coordinaci6n entre las DLLsque se llaman recfprocamente -y mi-les de operaciones mas- corren porcuenta del sistema operativo. Que ha-ya que cargar en memoria una por-ci6n de DLL que pensandolo bien es-ta en un disco, no se hace necesaria-mente mas lento que incluir un frag-mento de c6digo con la misma fun-cionalidad en el cuerpo del program aejecutable que despues habra deswappear por no caber entero. Poruna parte, las DLLs estan por 10 co-mun mucho mas optimizadas que losprogramas salidos de la pluma de undesarrollador estandar. Por la otra,cargar y descargar DLLs es 10 queWindows mejor sabe hacer. EI Lista-do 2, para ilustrar el punto, muestrauna instantanea de las DLLs que po-seen funciones suyas cargadas en

memoria en un momento dado, y quehe tratado que sea uno de esos mo-mentos en los que nada sucede. Entreparentesis, el listado fue obtenidocon otro espfa casi desconocido, elprograma WPS que se incluye conVisual Basic, con divers os SDKs,con el MSDN y tal vez con algunascajas de cereal.

No quiera saber que pasa en la me-moria cuando en Windows intervie-nen piezas gordas tale~ como OLE,ODBC 0 gesti6n de redes. Lo rnismose aplica a OS/2 y sus componentescorrelativos. Multiplique la lista ante-rior por una cifra fuerte y tendni unaimagen adecuada de la vida intema deun sistema complejo. Si usted estabadudando respecto de la convenienciade empujar a la memoria y alas man-dlbulas del procesador otras bibliote-cas, punteros secretos y nombres defunci6n, mas bien deberfa preguntar-se: si obtiene la funcionalidad que de-sea, (,que va a hacerle una manchamas a un tigre?

Implementando una funcionSi en computaci6n las cosas fueran

sencillas los especialistas ganarfa-mos migajas y las ciudades posmo-dernas desbordarfan de nuevos taxis-tas y vendedores ambulantes. Eche-mos un vistazo a una clase de com-plicaciones muy comun. En 10 que alas funciones concierne, casi todasellas han sido programadas en C 0 enAssembler y esperan que se Lasinvo-que utilizando las convenciones depaso de parametros que se definieronpara Pascal (s610 porque este es me-jor lenguaje de especificaci6n queaquellos). Lo mas probable, por afia-didura, es que usted este programan-do en un lenguaje de macros 0 en al-gun dialecto de Basic, y que la docu-mentaci6n este escrita en un seudo-lenguaje que a su vez no coincidecon lenguaje real alguno. El proble-ma no es s610 sintactico, ya que enciertos lenguajes existen tipos y es-tructuras de datos que para otras gra-maticas no son expresables ni nece-sarios. En Visual.Basic, por ejemplo,no existe el tipo BYTE y nadie hamuerto por ello.

Como sea, 10 primero que hay quehacer para utilizar una funci6n deDLL es declararla, 10 cual se hace enla mayorfa de los lenguajes con algu-na variante de la clausula Declare.Pongamos como caso tfpico el pasajede esta funci6n de C,

int GetPrivateProfileString (lpsz-Section, lpszEntry, lpszOefault,lpszReturnBuffer, cbReturnBuffer,lpszFilename)

Esta funci6n satisface una presta-ci6n bellfsima, que ilustra magnffi-camente la potencia que aporta a unprograma el uso sagaz de funcionespreexistentes: en este caso, se tratade leer un archivo de inicializaci6nen formato texto, barrer todas sus 11-neas hasta que encuentra el grupoque se desea -expresado entre cor-chetes- y buscar dentro de ese grupoel valor que tiene deterrninado para-metro. Todo eso sin operaciones ex-p11citas para asignar un numero de

unsigned

char

unsigned

long

unidad 16gica, abrir archivos, leer If-neas, abstraer caracteres orientado-res, comparar strings, cerrar archi-vos 0 casas por el estilo. (,No es fan-tastico? Windows se encarga de to-do, incluso de administrar los buf-fers cuando se hace mas de una lec-tura sobre un mismo archivo INI,rein ten tar cuando la pagina de discoesta tomada por otra aplicaci6n, et-cetera. Con una funci6n como esa,agregar una especie de "inteligen-cia" a una aplicaci6n para que me-morice el estado de sus variables en-tre una sesi6n y otra llega a ser tri-vialmente facil. Esto no es 10 unicoque puede hacerse mediante unaAPI. (,Desea que el cursor del mouse

se restrinja a una porci6n de la pan-talla? Utilice la funci6n Clip Cur-sor. l.Desea establecer conexi onesde red sin escribir siquiera los cua-dros de diaIogo? Sfrvase de WNet·ConnectDialog. Y asf hasta el ext a-sis. Windows viene con miles defunciones, y hay centenares de milesmas empaquetadas en bibliotecas deterceras partes.

EI unico costa de estos superpode-res es un sencillo desciframiento y laescritura de una declaraci6n (una sola)un poquitfn kilometrica. En el ejemploque analizamos, la documentaci6n delSDK nos dice que todos los parame-tros son LPSTR, excepto cbReturn-Buffer, que es into De ello va a resul-tar, entonces, una declaraci6n de Vi-sual Basic como esta:Declare Function GetPrivateProfi'leString% Lib "Kernel" (ByVal lpAp-plicationNameS, ByVal IpKeyName AsAny, ByVal lpDefaulU, ByVal lpRe-turnedStringS, ByVal nSize%, ByValIp lFil enameS)

Llamara la atenci6n que no hayamosrespetado los nombres de la documen-taci6n. En realidad en un lenguaje to-lerante como Visual Basic 0 VBA sepueden lIamar los argumentos de cual-quier manera, pues todos ellos son po-sicionales. Es mas, se los puede decla-rar de una forma (por ejemplo nSi-ze%) y usar de otra (por ejemplo ul-traPiru %), en tanto su posici6n y eltipo de dato que se Ie asigna sean loscorrectos. Incluso dentro de una mis-ma subrutina, los nombres de los argu-mentos pueden cambiar de una ipvo-caci6n de la funci6n a la siguiente,aunque esta practica diste de ser reco-mendable. Tampoco importa demasia-do que la funci6n a declarar tenga elmismo nombre que una funci6n deotra biblioteca, 0 que un comando in-terno del lenguaje: entre tantas facili-dades que hay por ahf, tambien se pue-de poner "alias" alas funciones.

La definici6n original que estamosviendo no especificaba de ningunamanera que GetPrivateProfileStringfuese una funci6n; en su lugar decfaque la operaci6n de ese nombre re-tornaba un numero entero. Cada len-guaje conlleva una vocabulario pro-pio. En Visual Basic se acostumbrahablar de funciones cuando hay algunvalor de retorno en una unidad de c6-digo, y de, subrutinas cuando no 10hay. Este es el caso que en C 0 en lajerga de Windows se denota a travesdel tipo VOID 0 vacfo: una funci6n

que retorna VOID hace 10 que tieneque hacer pero en honor a la verdadno retorna nada.

l.C6mo se ha llevado a cabo, enfin, la traducci6n de seudolenguajesfmil-C a Visual Basic? Pues simple-mente trasponiendo los tipos sobre-variados del primer lenguaje a lospocos tipos que se usan en VB,WordBasic, AccessBasic 0 VBA.Para ello alcanza y sobra alguna re-gIa de conversi6n como la que arti-cula la Tabla 1. Una vez declarada,una funci6n extern a se usa exacta-mente igual que un statement nativo.En la ~ectura de un programa, s610 laexistencia de una Ifnea en la que sedeclara a la primera permite estable-cer alguna diferencia.

No me extendere mas sobre las pe-culiaridades de la implementaci6n defunciones en Visual Basic, porque es-te articulo pretende tener algun valorgenerico. Mas alIa de la especificidadinevitable de los ejemplos concretos,los detalles anteriores s610 pretendfandemostrar que las funciones de la APIde Windows son facilmente utiliza-bles desde cualquier lenguaje ... casisiempre.

EI mito de la ingobemabilidadde las funciones

Desde la perspectiva de un lengua-je, el uso de funciones entrafia dos se-ries distintas de dificultades y proble-mas. En primer lugar, el encadenado"en vivo" de una funci6n puede aca-rrear errores de corrida y hasta cafdasdel sistema; en segundo lugar, no to-das las funciones se pueden integraren forma directa en todos los lengua-jes y aplicaciones.

Al utilizar una funci6n externa nohay mas remedio que salirse de lacascara protectora del lenguaje queuno utiliza y entrar en un terreno que,aunque esta regido en realidad por elsistema operativo, parecerfa ser unpoco tierra de nadie. Salvo erroresgroseros en los componentes previos,los errores fatales (antes UABs, lue-go General Protection Faults, ahoraApplication Errors) ocurren mil ve-ces mas frecuentemente cuando seinvoca una funci6n de DLL que encualquier otra circunstancia. Aquf de-berfa decir mas bien "cuando se in-voca mal una funci6n", ya que en lainmensa mayorfa de los casos losGPFs se suscitan cuando el formatode algunos de sus argumentos es in-correcto, y cuando la funci6n no in-

cluye (0 no puede logicamente in-cluir) c6digo para atrapar los erroresposibles y salir con gracia.

Cuando se pasa mal un parametrode funcion de biblioteca pueden ocu-rrir varias cosas: se obtiene un erroren tiempo de ejecuci6n, la propia bi-blioteca informa del mensaje, la apli-caci6n cliente falla de alguna manera(dependiendo del contexto y del co-digo), aparece el cartel que informadel error fatal 0, en el mejor de loscasos, nada sucede. Las probabilida-des son muchas, porque depend endel grado de elaboracion de ambaspartes, program a usuario y bibliote-ca, asf como del grado en que el sis-tema operativo este protegido contracada una de las mil eventuales viola-ciones que pueden ocurrir.

No obstante todos los inconvenien-tes potenciales, los buenos lenguajesposeen siempre recurs os para garanti-zar la consistencia y la verificaci6n detipo en el pasaje de parametros. EnVisual Basic el mecanismo de protec-ci6n mas eficaz es el usa de nombresalternativos 0 aliasing. En otras im-plementaciones existen reasegurosanaIogos. Si aquf y alIa se los usa po-co 0 se los desconoce, ello es mas porla tradicional pereza de los programa-dores que por defectos insanables enlas herramientas que usan.

La segunda serie de problemas sesuscita en los lenguajes de alto nivelcuando las funciones devuelven pun-teros a otras funciones, en lugar de re-sultados directos. Mientras que en Cse puede hacer algo con estos call-backs, en los dialectos de Basic habi-tualmente no. Si usted posee algunlenguaje de grano grueso y ha experi-mentado este tipo de problemas, 10mas segura es que tenga que utilizarun wrapper, vale decir, una bibliotecaintermediaria que subsana facilmentela falta de granularidad de ciertas ope-raciones. Hay unas cuantas docenasde wrappers genericos en el mercado,el mejor de los cuales probablementesea SpyWorks de Desaware.

EI mundo de los wrappers y losmensajes, sin embargo, sera tema deun pr6ximo articulo. Por ahora es bas-tante haber insinuado, por 10 menos,que el secreta de las APIs no es tanoscuro despues de todo, y que sus di-fi~ultades son poca cosa allado de losbeneficios que ofrecen .•

Billy Reynoso, es Microsoft Certified Profes-sional