Documentos de Académico
Documentos de Profesional
Documentos de Cultura
I
¡
I
q.
API de Windows 1
lxdiqe
¿Que es el API de Win32?
Llamadas a las Funciones API
Librerias Dinamicas
Declarando una Funcion DLL
Algunas Funciones API
Ejémplo : GetDeviceCaps
Ejempl o : Getüli ndowsDi rectory
Ejemplo: Rotar un Texto
Algunas APls lnteresantes...
-t
Win32 es un coniunto de funciones, tipos y mensaies pre{efinidos para poder prooramar
i
t sobre los sistemás operativos de 32 tiits de Microéoft.'El API Win32, sur§e par'a cübrir la
necesidad de crear un sistema operativo
de32 bits como es Windorms 95, frente al API de 16 bits existente de Windows 3.1. Surge
el problema de que Win32, ¡o.qs compqtiblg con el API de 16 bits, lo que implica que-si
queremos portar un código de Windows 3.1
a Windovvs_ 95, deberemos reescribir el codigo. Aunque hemos dicho que elAPl Win32 no
es compatible con el
API de 16.bits, hay una versión que es Win32s que sirve para la versión 3.1 de Windows.
Algunas de las lim-ita- cíones entre ambos API soh:
\
enlace-con la aplicacióñ es dinámico en tiempo de ejecución.
Una DDL no se incluye dentro de nuestro código, sino que en el momento que
realizamos la llamada a
la función, la DLL se carga en memoria, se utiliza la APl, y a continuación se descarga.
También tenemos que pensar que si utilizamos las DLLS que nos proporciona
Windows, en cualquier
máquina con este sistema operativo vamos a en@ntrar esas mismas DLLs, con lo cual no
es ne@sano que
nos las llevemos.
La utilización de librerías dinámicas tiene ventajas. Una ventaja es que como están
separadas del
programa se pueden ac{ualizar sin tener que modificar los programas que las utilizan.
Otra ventaja es el
ahono de memo6?fJr*'Oal y de disco ya que como es Windorne quien administra la
utilización de las I
no existe duplicidad de codigo cuando varias aplicaciones las utilizan.
.También, como todo fieje) tíene inconvenientes. Uno de ellos es el tiempo que
Windows tiene oue emoleaÍ
en leer las funciónes qüe el programa necesita utilizar de una DLL.
Otra desventaja es que cada programa ejecutable necesita que estén presentes las
DLLs oue utiliza.
Cuando se utilizan librerías estáticas, las funciones que el programa necesita se
incluyen en el mismo,
por lo que ni se pierde tiempo en leerlas ni la librería tiene que estar presente,
Para acceder a las funciones de las librerías dinámicas, lo primero que debemos
hacer es declararlas.
Declare Function lopen Lib "kernel" Alias "_lopen" (Byval lpPathname as string, Byval
\
!
Los argumentos que se pasan a una función pueden ser pasados por valor o por
referencia. UN parámetro
por valor quiere decir que lo que estamos rnetiendo dentro de la función es el contenido
de la variable, mientras
que por referencia se introduce la dirección de memoria donde reside la variable que
contiene el valor que queremos
pasar.
Por defecto, los lenguajes actuales de entorno visual pasa los argumentos por
referencia ( utilizando direcciones de
32 bits ).
Para pasar un argurnento por valor, se debe de escribir la palabra clave ByVal
delante de [a decfaración del argumento.
Esta función puede ser llamada con un argumento tipo cadena, de tipo largo, etc.
- Funciones TrueType
Funciones que controlan los fuentes o tipos de letra a utilizar.
GetRasterizarCaps: recupera el estacio del típo de letra en un sistema.
Cuando se hace un cambio dei
tipo de letra , reestableee el que hay por defecto.
- Funciones de versión.
L¡
Función que controla la versión de los ficheros.
GetfileVersionlnfo: devuelve información sobre un fichero especificado.
- Funciones GDl.
Controla todo lo que se refiere a los gráficos, ya sea tipos de letra, manejo de
trabajo a la hora de una
impre_sión, prepara la impresora para aceptar datos, etc.
StartPage: Prepara un controlador de im¡iresora para aceptar datos.
StarDoc: lnicializará un trabajo de impresión.
GetRasterizerCaps: recuperá el estado del tipo de letra de un sistema.
- Funciones KERNEL.
Lleva a cabo una EIS a ficheros, control de errores,etc.
hread: Lee datos de un fichero.
hwrite: escribe datos en un fichero.
Debugoutput: envía mensajes a un terminal erróneo.
- Funciones de usuario,
Son funciones en las que el usuario realiza alguna acción, como activar o
desactivar flechas de scroll-
bar (texto horizontal-vetical), recupera información de mensajes de hardware,
etc.
GetDriverlnfo: recupera datos de un dispositivo instalable.
Copylcon: copia un icono.
Pr¡vate-Srb Command2 Click l)
Dim Camino As Strino-
Camino = Strino( 25d 0 )
w = GetWindoriGD_irectory ( Camino, Len(camino))
Label3.Caption = Camincí
w = GetSybtemDirectory ( Camino, Len(Camino))
Label4.Cáotion = Camiíxi
End Sub
Por último queria comentar una utilidad realizada con llamadas a APls. Consiste en el
efecto de poder rotar
.u¡ teryto, algo que dentro de algunos lenguajes no se puede hacer, como es en el entorno
Visual Basic, a no ser
que sea por medio de una imagen. Esto no se realiza con una simple llamada, sino que
es necesaria una estructura de programación más compleja.
Type RECT
LEFT As lnteoer
TOP As lnteoér
RIGHT As lnieger
_ BO_TTOM As ln"teger
End Type
Type FUENTE
FANCHO As lnteger
FLARGO As lnte§er
FESCAPE As lntéoer
FORIENTACION As lnteoerv
FWEIGHT As lnteger
FITALICA As Strinó " 1
FUNDERLINE As §tring * 1
FSTRIKEOUT As Strinó * 1
FCHARSET As Strino *-1
FOUTPRECTSION A5 Strino " 1
FCLIPRECISION As Strinor 1
FQUALITY As Strino * 1
FPITCHANDFAMILY As StTino * 1
FNOMBRE As String * F_TAMNOMBRE
End Type
Como se ha comentado antes, se utilizan varias APls para realizar este efecto. Todo
ellas son de la
librería GDl, excepto una de USER.
evuelve información sobre el disco duro)
(Devuelve
)evuelve la capacidad de un disco maVor
may de 2Mb.)
(Nombre del Disco, tipo de formato y riumero de disco)
;'(De-vuelve las uni<iaüe9 disponibleé en un ordenadori
Devuelve la
End lf
'Pegar:
End lf
'Seleccionar Todo:
lf
SendMessage(Screen.ActiveForm.ActiveControl.hWnd, EM- SETSEL, 0, ByVal
&HFFFF0000) Then
End lf
Ejemplo para leer el volumen de un disco, esta función se puede usar para ¡catalogar los
CD's musicalesl
s1 =String$(255, Chr$(0))
s2=String$1255, Chr$(0) )
'IVSN tendrá el valor del Volume Serial Number (número de serie del volumen)
'De esta forma no es necesario usar una variable para asignar el valor devuelto:
End if
Es aconseiable siemore usar DoEvents ( o Sleep 0&) en los bucles laroos. Yo también lo
uso cuandb quiero que se "refresque" ld információrí de un control. ¿Cuantas veces has
asignado a un Label un nuevo Caption y no lo ha mostrado?, pruebá a poner DoEvents
después de la asignación y verás como se muestra enseguida. (¡oye, esto debería
aparecer en los trucosl)
Este truco está sacado de Tips & Tricks, from Visual Basic Web Magazine. Según el autor
la función DoEvents hace lo siguiente:
TranslateMessage(&msg );
'l
lf lsMissing(vKey) Then
hKeY = HKEY-CLASSES-ROOT
Else
hKeY = CLng(vKeY)
End lf
buf = Space$(300)
buflen = Len(buf)
lfbuflen>1Then
'Elformato devuelto es A§CllZ, así que quitar el último caracter
Else
QueryRegBase = ""
End lf
Else
QueryRegBase = ""
End lf
End Function
Para usarla, por ejemplo para saber el programa asociado para abrir una determinada
lf i Then
slcon = Left$(sValue, i- 1)
slcon = sValue
llcon = 0
sValue = ""
End lf
End lf
'no quiere decir que este sea el que se ejecute cuando se haga doble-click
sValue = QueryRegBase(sKey)
lf Len(sValue) Then
i= lnStr(sValue, ".") :
lf iThen
Else
sExe = Trim$(sValue)
End lf
!-ong, ByVal iSubKey-As Long,- ByVal lpszñame As String, ByVal cchName As Lon§) As
Long
Declare Function RegSetValue Lib "advapi32 dll" Alias "RegSetValueA' (ByVal hKey As
Lolg, ByVal lpSubKey As String, ByVal dwType As Long, ByVal lpData As String, ByVal
cbData As Long) As Long
Declare Function RegQueryValue Lib "shell.dll" (ByVal hKey As Long, ByVal lpSubKey As
String, ByVal lpValue-As Stíing, lpcbValue ns LohSí) As Lon§
Declare Function RegEnumKey Lib "shell.dll" (ByVal hKey As Long, ByVal iSubKey As
Long, ByVal lpszNamé As Strin§, ByVal cchNaniehs Long)-As Long -'
Declare Function RegOpenKey Lib "shell.dll" (ByVal hKey As Long, ByVal lpszSubKey As
String, phkResult As Loñg) Aslong
Declare Function RegCreateKey Lib "shell.dll" (ByVal hKey As Long, ByVal lpSubKey As
String, phkResult As [ong) As Lbng
Declare Function RegSetValue Lib "shell.dll" (ByVal hKev As Lono. BvVal lpSubKev As
String, ByVal dwTypeas Long, ByVal lpData Ai String, ByVal cbDatá A§ Lond) As Loñg
Declare Function RegDeleteKey Lib "shell.dll" (ByVal hKey As Long, ByVal lpSubKey As
String) As Long
Si vas a trabaiar con el registro del sistema, te recomiendo que antes hagas copia del
mismo. En el CD Oe Winddws 95, hay una ütil¡dad: ERU.exe üue copia los-arcfriüos det
Sistema,. así-como Autoexec, etc. Si no tienes este progrbma,'copia los archivos
System.dat y User.dat que están el directorio de Windows.' -
'Para la impresora
'Las fuentes
No incluyo ejemplos ni las declaraciones de los tipos, por ser demasiado "grandes". Pero
las incluio eh uñ listado con eiemolos oara abrir.'etc.. aunque con las funéiones para 16
bits, ya (ue desde que uso el'VB'pqrá.l1bit§r.áuelo haceilo con el control que-'trae. Si
quierés üer ejemplo§ usando el cóntrol de diálogos comunes, pasate por la'página de
trucos.
Aquí pongo parte del código, para los que sólo quieren echar un vistazo:
cbSize As Long
hwnd As Long
uld As Long
uFlags As Long
lf App.Prevlnstance Then
mnuAcerca_Click
Unload Me
End
t.cbSize = Len(t)
t.hwnd = picGancho.hwnd
t.uld = 1&
t. ucallbackMessage = WM_MOUSEMOVE
t.hlcon = Me.lcon
al
Shell_Notifylcon NIM_ADD, t
Me.Hide
App.TaskVisible = False
End Sub
'Acción
unidad = Trim$(Text1)
s1 = Stringg(255, Cnr$(O))
s2 = String$(2s5, Cnr$(O))
'IVSN tendrá el valor delVolume Serial Number (número de serie del volumen)
sTmP = Hex$(IVSN)
Label3(O) = s1
Label3(2) = 52
End Sub
t-
a
a
L J