Documente Academic
Documente Profesional
Documente Cultură
Indice
Que es el API de Win32? Llamadas a las Funciones API Librerias Dinamicas Declarando una Funcion DLL Algunas Funciones API Ejemplo:GetDeviceCaps Ejemplo: GetWindowsDirectory Ejemplo: Rotar un Texto Algunas APIs Interesantes...
Qu es el API Win32 ?
Win32 es un conjunto de funciones, tipos y mensajes pre-definidos para poder programar sobre los sistemas operativos de 32 bits de Microsoft. El API Win32, surge para cubrir la necesidad de crear un sistema operativo de 32 bits como es Windows 95, frente al API de 16 bits existente de Windows 3.1. Surge el problema de que Win32, no es compatible con el API de 16 bits, lo que implica que si queremos portar un cdigo de Windows 3.1 a Windows 95, deberemos reescribir el cdigo. Aunque hemos dicho que el API Win32 no es compatible con el API de 16 bits, hay una versin que es Win32s que sirve para la versin 3.1 de Windows. Algunas de las limita- ciones entre ambos API son: No soportan nombres de ficheros largos, slo el conocido formato 8.3 de DOS. No tiene API de comunicaciones. No soportan las capacidades Plug & Play.
muy diferente si ste tiene incorporadas llamadas a APIs, ya que el resultado de las mismas en algunos casos puede llegar a ser incomprensible. Cuando se trabaja con stas funciones siempre es recomendable tener a mano una buena gua o bien tener a mano alguien que sepa, para no encontrarnos con posibles problemas. Las dos principales ventajas que obtenemos con la utilizacin de APIs es la gran funcionalidad que podemos darle a nuestra aplicacin, y en segundo lugar la gran velocidad de proceso, ya que a menudo es mucho ms rpido realizar una funcin a travs de la API adecuada que por medio del lenguaje en si mismo. Los mensajes son utilizados por Windows para permitir que dos o ms aplicaciones se comuniquen entre s y con el propio sistema Windows. Se dice que las aplicaciones Windows son conducidas por mensajes o sucesos. Conocer todas las APIs de Windows es imposible, ya que tiene gran similitud con aprenderse la gua de telfonos. Lo que debemos hacer es realizar un razonamiento contrario, nosotros tenemos una necesidad a la hora de programar, y debemos pensar que eso tiene una solucin con una API.. En la mayora de los casos es as.
Libreras Dinmicas.
Casi todas las APIs de Windows se unen formando libreras de enlace dinmico. Una librera dinmica ( Dynamic Link Libraries, abreviadamente DLLs ) permite que las aplicaciones Windows compartan cdigo y recursos. Una DLL es actualmente un fichero ejecutable que contiene funciones de Windows que pueden ser utilizadas por todas las aplicaciones. Si bien en DOS estamos acostumbrados a utilizar libreras de enlace esttico, es decir, a la hora de compilar incluyen junto con nuestro cdigo, y de esta manera cuando se ejecuta nuestra aplicacin, todas las libreras se cargan en memoria esperando a ser invocadas. Sin embargo, cuando trabajamos con DDLs, el enlace con la aplicacin es dinmico en tiempo de ejecucin. Una DDL no se incluye dentro de nuestro cdigo, sino que en el momento que realizamos la llamada a la funcin, la DLL se carga en memoria, se utiliza la API, y a continuacin se descarga. La gran ventaja que posee este mtodo es que no es necesario tener gran cantidad de cdigo cargado en memoria a la hora de ejecutar nuestra aplicacin. En contra, es necesario que cuando llevemos nuestro ejecutable a otra instalacin, tengamos que llevar las DLLs necesarias. Tambin tenemos que pensar que si utilizamos las DLLS que nos proporciona Windows, en cualquier
mquina con este sistema operativo vamos a encontrar esas mismas DLLs, con lo cual no es necesario que nos las llevemos. La utilizacin de libreras dinmicas tiene ventajas. Una ventaja es que como estn separadas del programa se pueden actualizar sin tener que modificar los programas que las utilizan. Otra ventaja es el ahorro de memoria principal y de disco ya que como es Windows quien administra la utilizacin de las DLLs, no existe duplicidad de cdigo cuando varias aplicaciones las utilizan. Tambin, como todo (jeje) tiene inconvenientes. Uno de ellos es el tiempo que Windows tiene que emplear en leer las funciones que el programa necesita utilizar de una DLL. Otra desventaja es que cada programa ejecutable necesita que estn presentes las DLLs que utiliza. Cuando se utilizan libreras estticas, las funciones que el programa necesita se incluyen en el mismo, por lo que ni se pierde tiempo en leerlas ni la librera tiene que estar presente. La mayora de stas libreras suelen estar localizadas en el directorio SYSTEM de Windows. Dentro de Windows tenemos gran cantidad de DLLs, agrupando las APIs en funciones respecto a un mismo tema. Adems en cada nueva versin de Windows, posiblemente tengamos ms DLLs para utilizar. Para acceder a las funciones de las libreras dinmicas, lo primero que debemos hacer es declararlas.
La sentencia declare debe contener asimismo una lista de los parmetros que se pasarn a la funcin. La mayor parte del trabajo consiste en determinar cules sern esos parmetros. Algo muy utilizado dentro de los parmetros son lo que podemos traducir como manejadores ( handles ). Esto es un valor entero nico definido por el entorno operativo y utilizado para referirse a objetos tales como formularios, controles, etc. Un handle es un nmero de identificacin. HWnd es un handle para referirse a una ventana, hDC es un handle para referirse al contexto de dispositivo de un objeto ( Device Context ). Cuando una funcin de una DLL espera recibir como argumento un handle, se debe declarar como ByVal Integer. Declare Function IsIconic Lib "User" (ByVal hWnd As Integer) As Integer If IsIconic (Form1.hWnd) Then .... El entorno operativo asigna un handle a cada formulario de una aplicacin para posteriormente identificarles. La propiedad hWnd de un formulario o de un control no grfico permite acceder a este handle. Por contexto de dispositivo se entiende un conjunto de atributos (color de fondo, tipo de letra, espaciado entre caracteres, posicin actual de la pluma, paleta de colores, etc.) que determinan la localizacin y la apariencia de un objeto. Una aplicacin puede modificar estas propiedades a travs del hDC del objeto. Afortunadamente, Microsoft ha pensado en el programador y proporciona una herramienta dentro de algunos lenguajes de programacin de entorno visual como es el API viewer, en Visual Basic versin 4.0. Con sta herramienta podemos cargar unos archivos TXT que nos proporcionan las sentencias declare de gran cantidad de funciones API. Si no poseemos ningn tipo de ayuda respecto a una API especfica, es muy posible que todos nuestros intentos en utilizarla sean intiles. Para declarar una funcin de una librera dinmica, se tiene que escribir en la seccin de declaraciones de un formulario o de un mdulo de la aplicacin en construccin. Una funcin declarada en un formulario es privada para este formulario, y declarada en un mdulo es pblica, y por lo tanto puede ser llamada desde cualquier parte de la aplicacin. Si la funcin no retorna un valor, se declarar como un procedimiento o sub, aunque esta opcin no se utiliza casi nunca, pues la mayora de las APIs retornan un valor, aunque sea una verificacin de su realizacin. Los argumentos que se pasan a una funcin pueden ser pasados por valor o por referencia. UN parmetro por valor quiere decir que lo que estamos metiendo dentro de la funcin es el contenido de la variable, mientras que por referencia se introduce la direccin de memoria donde reside la variable que contiene el valor que queremos pasar.
Habitualmente, dentro de nuestro programa trabajamos con variables que se pasan por valor, es decir, no nos interesa la posicin de memoria de la variable, sino su contenido. Al trabajar con APIs la cosa cambia. La mayora de estas funciones estn desarrolladas en C, y en este lenguaje se utiliza asiduamente los punteros (direcciones de memoria ) Por defecto, los lenguajes actuales de entorno visual pasa los argumentos por referencia ( utilizando direcciones de 32 bits ). Para pasar un argumento por valor, se debe de escribir la palabra clave ByVal delante de la declaracin del argumento. Algunas funciones aceptan ms de un tipo de datos para un mismo argumento, y esto se indica declarando el argumento como Any.
Declare Function Catch Lib "Kernel" (lpCatchBuf As Any) As Integer Esta funcin puede ser llamada con un argumento tipo cadena, de tipo largo, etc.
- Funciones de cursor. Gestionan todo lo relacionado con el cursor. Createcursor, crea un cursor con dimensiones especificadas. - Funciones DDE (Data Dinamic Exchange ). Gestiona el intercambio de datos dinmico. DdeAccessData, proporciona un acceso a un objeto con memoria global. DdeGetdata, copia los datos de un objeto de memoria global a un buffer. - Funciones de error. Funciones que gestionan los errores de los dispositivos. Debugoutput, enva mensajes al terminal errneo. - Funciones de movimiento y visualizacin. Isiconic, determina si una ventana est minimizada. - Funciones para las propiedades. Informa y modifica el estado de las propiedades. Getprop, devuelve una lista de propiedades de una ventana. - Funciones pen. Son las funciones correspondientes al lpiz. - Funciones de paleta de colores. - Funciones de dibujo y pintura. - Grupo de funciones OLE. Funciones que se basan en el manejo de objetos. Olenumobjects, enumera los objetos en un documento. - Funciones Toolhelp. Normalmente devuelven informacin sobre los objetos que hay en memoria. - Funciones Drag & Drop Funciones de arratrar y soltar. Tiene informacin sobre la posicin de arrastre de algn elemento, si se puede arrastrar, etc. - Funciones de controladores instalables. Hacen una gestin de los controladores instalables. - Funciones de decodificacin LEMPEL-ZIV. Hacen una gestin de los ficheros comprimidos. - Funciones para la impresin. Devuelve tamaos de letra, pgina, etc. y activa o desactiva algunas funciones, configura colores, etc. a la hora de imprimir. - Funciones SHELL (entorno). Son las funciones que controlan el entorno. FindExecutable: recupera el nombre del ejecutable asociado a un fichero especificado. - Funciones "Stress" Controla espacio libre y manejadores de ficheros (handles).
AllocDiskSpace: crea un fichero del espacio consumido en una particin del disco (instalar software). - Funciones TrueType Funciones que controlan los fuentes o tipos de letra a utilizar. GetRasterizarCaps: recupera el estado del tipo de letra en un sistema. Cuando se hace un cambio de tipo de letra , reestablece el que hay por defecto. - Funciones de versin. Funcin que controla la versin de los ficheros. GetfileVersionInfo: devuelve informacin sobre un fichero especificado. - Funciones GDI. Controla todo lo que se refiere a los grficos, ya sea tipos de letra, manejo de trabajo a la hora de una impresin, prepara la impresora para aceptar datos, etc. StartPage: Prepara un controlador de impresora para aceptar datos. StarDoc: Inicializar un trabajo de impresin. GetRasterizerCaps: recupera el estado del tipo de letra de un sistema. - Funciones KERNEL. Lleva a cabo una E/S a ficheros, control de errores,etc. hread: Lee datos de un fichero. hwrite: escribe datos en un fichero. Debugoutput: enva mensajes a un terminal errneo. - Funciones de usuario. Son funciones en las que el usuario realiza alguna accin, como activar o desactivar flechas de scrollbar (texto horizontal-vetical), recupera informacin de mensajes de hardware, etc. GetDriverInfo: recupera datos de un dispositivo instalable. CopyIcon: copia un icono. OpenDriver: abre un dispositivo instalable.
Una de las primeras funciones que vamos a comentar es bastante utilizada. En muchas ocasiones hemos querido saber qu resolucin tiene la pantalla de la pc en el momento que se ejecuta nuestro software. Con sta informacin podemos dar un aspecto bastante ms profesional a nuestra aplicacin si ajustamos el tamao de nuestros formularios a la resolucin de la pantalla. Tambin a travs de la misma API sabemos la cantidad de puntos que nos da la impresora, con lo que podemos ajustar nuestros informes independientemente de la impresora seleccionada. Esta funcin la tenemos dentro de la librera GDI, y se denomina GetDeviceCaps. Dependiendo del valor del ndice introducido, as nos da la informacin sobre la cantidad de puntos horizontales de la pantalla, cantidad de puntos verticales de la pantalla, puntos por pulgada horizontalmente en la impresora y puntos por pulgada verticalmente en la impresora. Declare Function GetDeviceCaps Lib "GDI" ( ByVal HDC As Integer, Byval nIndex As Integer) As Integer Global Const HorRes = 8 ' resolucin horizontal en pixels Global Const VerRes = 10 ' resolucin vertical en pixels Global Const PPPX = 88 ' pixels por pulgada en X Global Const PPPY = 90 ' pixels por pulgada en Y
Private Sub Command1_click() p1 = GetDeviceCaps ( HDC, HorRes ) p2 = GetDeviceCaps ( HDC, VerRes ) i1 = GetDeviceCaps ( Printer, HDC, PPPX ) i2 = GetDeviceCaps ( Printer, HDC, PPPY ) Label1.Caption = "Pantalla: " & p1 & " x" & p2 Label2.Caption = "Impresora: " & i1 & " x " & i2 End Sub
En muchas ocasiones necesitamos conocer dnde esta el directorio de Windows y dnde reside el directorio System del mismo. Es muy lgico suponer que todas las instalaciones estn en el directorio C:\Windows. Puede ser que se ejecute desde una red, o que el usuario haya cambiado el directorio por omisin. En cualquiera de estos casos no podemos referirnos directamente a estos directorios, sino que debemos conocerlos dinmicamente cuando ejecutamos la aplicacin. Para ello utilizamos dos APIs de la librera Kernel, la primera nos devuelve el directorio de Windows (GetWindowsDirectory ), mientras que la segunda el directorio de System ( GetSystemDirectory ). Para hacer funcionar esta API debemos inicializar la variable que nos devuelve la informacin, con 255 caracteres rellenos con el valor ASCII 0. Si la cadena estuviese vaca, no funcionara, y su comportamiento sera impredecible. Declare Function GetWindowsDirectory Lib "Kernel " (ByVal lpBuffer As String, ByVal nSize As Integer Declare Function GetSystemDirectory Lib "Kernel" (ByVal lpBuffer As String, ByVal nSize As Integer Private Sub Command2_Click () Dim Camino As String Camino = String( 255, 0 ) w = GetWindowsDirectory ( Camino, Len(camino)) Label3.Caption = Camino w = GetSystemDirectory ( Camino, Len(Camino)) Label4.Caption = Camino End Sub
Por ltimo queria comentar una utilidad realizada con llamadas a APIs. Consiste en el efecto de poder rotar un texto, 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 programacin ms compleja. En primer lugar debemos definir dos estructuras. La primera nos va a permitir introducir una posicin del texto, y la segunda es una definicin completa de una fuente por el usuario. Type RECT LEFT As Integer TOP As Integer RIGHT As Integer
BOTTOM As Integer End Type Global Const F_TAMNOMBRE = 32 Type FUENTE FANCHO As Integer FLARGO As Integer FESCAPE As Integer FORIENTACION As Integer FWEIGHT As Integer FITALICA As String * 1 FUNDERLINE As String * 1 FSTRIKEOUT As String * 1 FCHARSET As String * 1 FOUTPRECISION As String * 1 FCLIPRECISION As String * 1 FQUALITY As String * 1 FPITCHANDFAMILY As String * 1 FNOMBRE As String * F_TAMNOMBRE End Type Global Const TRANSPARENTE = 1 Global Const OPACO = 2 Como se ha comentado antes, se utilizan varias APIs para realizar este efecto. Todo ellas son de la librera GDI, excepto una de USER.
Declare Sub GETCLIENTRECT Lib "USER" (ByVal HWND As INTEGER, LPRECT As RECT) Declare Function SETBKMODE Lib "GDI" (ByVal HDC As Integer, ByVal NBKMODE As Integer) As Integer Declare Function CREATEFONTINDIRECT Lib "GDI" (LPLOGFONT As FUENTE) As Integer Declare Function SELECTOBJECT Lib "GDI" (ByVal HDC As Integer, ByVal HOBJECT As Integer Declare Function TEXTOUT Lib "GDI" (ByVal X As Integer, ByVal Y As Integer, ByVal LPSTRING As String ByVal NCOUNT As Integer) As Integer Declare Function DELETEOBJECT Lib "GDI"
El mecanismo utilizado para visualizar un texto inclinado consiste en crear una fuente ya inclinada y visualizar el texto con esa fuente y el fondo transparente para no ocultar otros elementos de la pantalla. En el ejemplo que sigue se puede ver que se va realizando el giro a travs de una barra de desplazamiento. Private Sub HScroll_Change ( ) Dim POS As RECT Dim LF As FUENTE Dim I As Integer, ANGULO As Integer Dim HFONT As Integer, HOLDFONT As Integer Dim TEXTO As String ' INICIALIZA EL TEXTO A VISUALIZAR TEXTO = " TEXTO A ROTAR " ' ESPECIFICA LA FUENTE A USAR
LF.NOMBRE = "Arial" LF.FWEIGHT = 1000 ' USA FONDO TRANSPARENTE I = SETBKMODE (HDC, TRANSPARENTE ) ' CENTRA EL TEXTO EN LA VENTANA Call GETCLIENTRECT ( HWND, POS ) Cls ANGULO = HScroll.Value LF.FESCAPE = ANGULO HFONT = CREATEFONTINDIRECT ( LF ) HOLDFONT = SELECTOBJECT ( HDC, HFONT ) I = TEXTOUT ( HDC, POS.RIGHT / 2, POS.BOTTOM / 2, TEXTO. Len ( TEXTO )) I = SELECTOBJECT ( HDC, HOLDFONT ) I =DELETEOBJECT ( HFONT ) ' RESTAURA EL FONDO POR DEFECTO I = SETBKMODE ( HDC, OPACO ) End Sub Como podemos comprobar, no siempre se puede realizar las operaciones que deseamos con una sola API. En la mayora de los casos es necesario utilizar varias, que se complementan para obtener los resultados deseados.
API de Windows 2
Funciones y ejemplos: SendMessage: la que siempre hay que tener a mano SetWindowWord: crear ventanas flotantes Manejo de ventanas... GetVolumeInformation: leer el volumen de un disco (32 bits) GetDriveType: comprobar el tipo de unidad Dejar una ventana siempre visible Usar Sleep en lugar de DoEvents Manejo del Registro Dilogos comunes del API Iconos en la barra de tarea Marcador de telfonos de Win95 La lnea actual y el nmero de lneas de un text-box Uso de PostMessage en lugar de SendMessage
'Utilidades para un men de edicin: ' 'Declaracin de las constantes Global Const WM_USER = &H400 Global Const EM_GETSEL = WM_USER + 0 Global Const EM_SETSEL = WM_USER + 1 Global Const EM_REPLACESEL = WM_USER + 18 Global Const EM_UNDO = WM_USER + 23 Const EM_LINEFROMCHAR = WM_USER + 25
Const EM_GETLINECOUNT = WM_USER + 10 ' Global Const WM_CUT = &H300 Global Const WM_COPY = &H301 Global Const WM_PASTE = &H302 Global Const WM_CLEAR = &H303 ' 'Deshacer: 'Nota: si se hace de esta forma, 'no es necesario usar una variable para asignar el valor devuelto. If SendMessage(Screen.ActiveForm.ActiveControl.hWnd, EM_UNDO, 0, ByVal 0&) Then End If 'tambin: x = SendMessage(Screen.ActiveForm.ActiveControl.hWnd, EM_UNDO, 0, ByVal 0&) 'Copiar: If SendMessage(Screen.ActiveForm.ActiveControl.hWnd, WM_COPY, 0, ByVal 0&) Then End If 'Cortar: If SendMessage(Screen.ActiveForm.ActiveControl.hWnd, WM_CUT, 0, ByVal 0&) Then End If 'Borrar: If SendMessage(Screen.ActiveForm.ActiveControl.hWnd, WM_CLEAR, 0, ByVal 0&) Then End If 'Pegar: If SendMessage(Screen.ActiveForm.ActiveControl.hWnd, WM_PASTE, 0, ByVal 0&) Then End If 'Seleccionar Todo: If SendMessage(Screen.ActiveForm.ActiveControl.hWnd, EM_SETSEL, 0, ByVal &HFFFF0000) Then
End If
'Crear un TextBox con 64 KB en lugar de 32 Global Const WM_USER = &H400 Global Const EM_LIMITTEXT = WM_USER + 21
'Crear una ventana flotante al estilo de los tool-bar 'Cuando se minimiza la ventana padre, tambin lo hace sta. Const SWW_hParent = -8
'En Form_Load (suponiendo que la ventana padre es Form1) If SetWindowWord(hWnd, SWW_hParent, form1.hWnd) Then End If
Declare Function IsWindowVisible Lib "User" (ByVal hWnd As Integer) As Integer 'Declaraciones para 32 bits Declare Function GetWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Long, ByVal wCmd As Long) As Long Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As Long
'Constantes para GetWindow Const GW_HWNDFIRST = 0 Const GW_HWNDLAST = 1 Const GW_HWNDNEXT = 2 Const GW_HWNDPREV = 3 Const GW_OWNER = 4 Const GW_CHILD = 5
Si "unidad" es el CD-ROM y tenemos un disco de msica, podemos usar el VSN para hacer un catlogo de CD's ya que cada CD tiene un nmero diferente.
szRoot="D:\" 'Poner aqu la unidad del CD-ROM o la que queramos comprobar lDrive= GetDriveType(szRoot) If lDrive = DRIVE_CDROM Then 'Es un CD-ROM/Compact-Disc End If
' SetWindowPos Flags Const SWP_NOSIZE = &H1 Const SWP_NOMOVE = &H2 'Const SWP_NOZORDER = &H4 'Const SWP_NOREDRAW = &H8 Const SWP_NOACTIVATE = &H10 'Const SWP_DRAWFRAME = &H20 Const SWP_SHOWWINDOW = &H40 'Const SWP_HIDEWINDOW = &H80 'Const SWP_NOCOPYBITS = &H100 'Const SWP_NOREPOSITION = &H200 Const SWP_FLAGS = SWP_NOMOVE Or SWP_NOSIZE Or SWP_SHOWWINDOW Or SWP_NOACTIVATE
'Cdigo para poner en Form_Load 'De esta forma no es necesario usar una variable para asignar el valor devuelto: If SetWindowPos(hWnd, -1, 0, 0, 0, 0, SWP_FLAGS) Then End if
Normalmente, para obtener los programas asociados a una extensin, slo es necesario usar la funcin: RegQueryValue. La siguiente funcin de ejemplo, es la que uso para obtener informacin de una clave del registro: Public Const HKEY_CLASSES_ROOT = &H80000000
Declare Function RegQueryValue Lib "advapi32.dll" Alias "RegQueryValueA" _ (ByVal hKey As Long, ByVal lpSubKey As String, ByVal lpValue As String, _ lpcbValue As Long) As Long
'Busca una entrada en el registro Private Function QueryRegBase(ByVal Entry As String, Optional vKey) As String Dim buf As String Dim buflen As Long Dim hKey As Long 'Si no se especifica la clave del Registro, usar HKEY_CLASSES_ROOT If IsMissing(vKey) Then hKey = HKEY_CLASSES_ROOT Else hKey = CLng(vKey) End If
On Local Error Resume Next buf = Space$(300) buflen = Len(buf) 'Buscar la entrada especificada y devolver el valor asignado If RegQueryValue(hKey, Entry, buf, buflen) = 0 Then If buflen > 1 Then 'El formato devuelto es ASCIIZ, as que quitar el ltimo caracter QueryRegBase = Left$(buf, buflen - 1)
Else QueryRegBase = "" End If Else QueryRegBase = "" End If 'Desactivar la deteccin de errores On Local Error GoTo 0 End Function Para usarla, por ejemplo para saber el programa asociado para abrir una determinada extensin, de que programa se obtiene el icono y que nmero de icono es: NOTA: Para usar este ejemplo, hay que tener un control List2 en el Form y la rutina mostrada antes. Private Sub BuscarExtensionID(sExt As String) Dim lRet As Long Dim sKey As String Dim sValue As String Dim hKey As Long Dim sExe As String Dim sIcon As String Dim lIcon As Long Dim sProgId As String Dim i As Integer
Caption = "Mostrar asociaciones de la clave: " & sExt List2.Visible = True List2.Clear List2.AddItem "Valores del Registro para " & sExt '
'Buscar en el registro la extensin... sProgId = QueryRegBase(sExt) If Len(sProgId) Then List2.AddItem "Clave: " & sProgId sKey = sProgId & "\DefaultIcon" List2.AddItem sKey sValue = QueryRegBase(sKey) If Len(sValue) Then i = InStr(sValue, ",") If i Then sIcon = Left$(sValue, i - 1) lIcon = Val(Mid$(sValue, i + 1)) Else 'No tiene programa para Defaulticon
sIcon = sValue lIcon = 0 sValue = "" End If End If List2.AddItem " Icono de: " & sIcon List2.AddItem " Icono n: " & lIcon ' 'Obtener el programa asociado por defecto para Abrir 'no quiere decir que este sea el que se ejecute cuando se haga doble-click sKey = sProgId & "\Shell\Open\Command" sValue = QueryRegBase(sKey) If Len(sValue) Then i = InStr(sValue, ".") If i Then
i = InStr(i, sValue, " ") If i Then sExe = Trim$(Left$(sValue, i - 1)) Else sExe = Trim$(sValue) End If Else sExe = Trim$(sValue) End If End If List2.AddItem sKey List2.AddItem " Programa asociado: " & sExe End If End Sub Ejemplo para crear claves en el Registro: Para no alargar demasiado este fichero, aqu slo estn las declaraciones de las funciones; en los listados del programa gsExecute, hay ejemplos de cmo crear y borrar claves para asociar/desasociar un programa a una extensin determinada. 'Claves del Registro Public Const HKEY_CLASSES_ROOT = &H80000000 Public Const HKEY_CURRENT_USER = &H80000001 Public Const HKEY_LOCAL_MACHINE = &H80000002 Public Const HKEY_USERS = &H80000003 ' 'Para los valores devueltos por las funciones de manejo del Registro Public Const ERROR_SUCCESS = 0& Public Const ERROR_NO_MORE_ITEMS = 259& ' ' Tipos de datos Reg...
Public Const REG_SZ = 1 ' 'Declaraciones del API de Windows para 32 bits Declare Function RegQueryValue Lib "advapi32.dll" Alias "RegQueryValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal lpValue As String, lpcbValue As Long) As Long Declare Function RegEnumKey Lib "advapi32" Alias "RegEnumKeyA" (ByVal hKey As Long, ByVal iSubKey As Long, ByVal lpszName As String, ByVal cchName As Long) As Long Declare Function RegOpenKey Lib "advapi32" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpszSubKey As String, phkResult As Long) As Long Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long Declare Function RegSetValue Lib "advapi32.dll" Alias "RegSetValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long
'Declaraciones para el API de 16 bits Declare Function RegQueryValue Lib "shell.dll" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal lpValue As String, lpcbValue As Long) As Long Declare Function RegEnumKey Lib "shell.dll" (ByVal hKey As Long, ByVal iSubKey As Long, ByVal lpszName As String, ByVal cchName As Long) As Long Declare Function RegOpenKey Lib "shell.dll" (ByVal hKey As Long, ByVal lpszSubKey As String, phkResult As Long) As Long Declare Function RegCloseKey Lib "shell.dll" (ByVal hKey As Long) As Long Declare Function RegCreateKey Lib "shell.dll" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long Declare Function RegSetValue Lib "shell.dll" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long Declare Function RegDeleteKey Lib "shell.dll" (ByVal hKey As Long, ByVal lpSubKey As String) As Long
Si vas a trabajar con el registro del sistema, te recomiendo que antes hagas copia del mismo. En el CD de Windows 95, hay una utilidad: ERU.exe que copia los archivos del Sistema, as como Autoexec, etc. Si no tienes este programa, copia los archivos System.dat y User.dat que estn el directorio de Windows. Suerte y que no se te cuelgue!
'Declaraciones para 32 bits 'Abrir y guardar Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long Declare Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long Declare Function GetFileTitle Lib "comdlg32.dll" Alias "GetFileTitleA" (ByVal lpszFile As String, ByVal lpszTitle As String, ByVal cbBuf As Integer) As Integer 'Buscar y reemplazar
Declare Function FindText Lib "comdlg32.dll" Alias "FindTextA " (pFindreplace As FINDREPLACE) As Long Declare Function ReplaceText Lib "comdlg32.dll" Alias "ReplaceTextA" (pFindreplace As FINDREPLACE) As Long 'Para la impresora Declare Function PrintDlg Lib "comdlg32.dll" Alias "PrintDlgA" (pPrintdlg As PRINTDLG) As Long Declare Function PageSetupDlg Lib "comdlg32.dll" Alias "PageSetupDlgA" (pPagesetupdlg As PAGESETUPDLG) As Long 'Para los colores Declare Function ChooseColor Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As CHOOSECOLOR) As Long 'Las fuentes Declare Function ChooseFont Lib "comdlg32.dll" Alias "ChooseFontA" (pChoosefont As CHOOSEFONT) As Long No incluyo ejemplos ni las declaraciones de los tipos, por ser demasiado "grandes". Pero las incluyo en un listado con ejemplos para abrir, etc., aunque con las funciones para 16 bits, ya que desde que uso el VB para 32 bits, suelo hacerlo con el control que trae. Si quieres ver ejemplos usando el control de dilogos comunes, pasate por la pgina de trucos.
End Type '-----------------Private Const NIM_ADD = &H0 Private Const NIM_MODIFY = &H1 Private Const NIM_DELETE = &H2 Private Const WM_MOUSEMOVE = &H200 Private Const NIF_MESSAGE = &H1 Private Const NIF_ICON = &H2 Private Const NIF_TIP = &H4 Private Const WM_LBUTTONDBLCLK = &H203 Private Const WM_LBUTTONDOWN = &H201 Private Const WM_LBUTTONUP = &H202 Private Const WM_RBUTTONDBLCLK = &H206 Private Const WM_RBUTTONDOWN = &H204 Private Const WM_RBUTTONUP = &H205 '-------------------Private Declare Function Shell_NotifyIcon Lib "shell32" _ Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, _ pnid As TIPONOTIFICARICONO) As Boolean '-------------------Private Declare Function WinExec& Lib "kernel32" _ (ByVal lpCmdLine As String, ByVal nCmdShow As Long) '-------------------Dim t As TIPONOTIFICARICONO
Unload Me End End If '--------------------------------t.cbSize = Len(t) t.hwnd = picGancho.hwnd t.uId = 1& t.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE t.ucallbackMessage = WM_MOUSEMOVE t.hIcon = Me.Icon '--------------------------------t.szTip = "Ejemplo de barra de tareas..." & Chr$(0) ' Es un string de "C" ( \0 ) Shell_NotifyIcon NIM_ADD, t Me.Hide App.TaskVisible = False End Sub
Private Sub Command1_Click() Dim ValDev&, Numero$, NombreProg$, Quien$ Numero = "123-4567" NombreProg = "Mi Programa" Quien = "Pepe"
'Declaracin de la funcin, slo est en el API de 32 bits ' Private Declare Function GetVolumeInformation Lib "Kernel32" _ Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, _ ByVal lpVolumeNameBuffer As String, _ ByVal nVolumeNameSize As Long, _ lpVolumeSerialNumber As Long, _ lpMaximumComponentLength As Long, _ lpFileSystemFlags As Long, _ ByVal lpFileSystemNameBuffer As String, _ ByVal nFileSystemNameSize As Long) As Long
Private Sub Command1_Click() 'Accin Dim lVSN As Long, n As Long, s1 As String, s2 As String
Dim unidad As String Dim sTmp As String On Local Error Resume Next 'Se debe especificar el directorio raiz unidad = Trim$(Text1) 'Reservar espacio para las cadenas que se pasarn al API s1 = String$(255, Chr$(0)) s2 = String$(255, Chr$(0)) n = GetVolumeInformation(unidad, s1, Len(s1), lVSN, 0, 0, s2, Len(s2)) 's1 ser la etiqueta del volumen 'lVSN tendr el valor del Volume Serial Number (nmero de serie del volumen) 's2 el tipo de archivos: FAT, etc. 'Convertirlo a hexadecimal para mostrarlo como en el Dir. sTmp = Hex$(lVSN) Label3(0) = s1 Label3(1) = Left$(sTmp, 4) & "-" & Right$(sTmp, 4) Label3(2) = s2 End Sub
Private Sub Form_Unload(Cancel As Integer) 'Asegurarnos de "liberar" la memoria. Set Form1 = Nothing End Sub
Otras cosas ms que se pueden hacer con SendMessage. La declaracin de esta funcin del API, para 16 y 32 bits, est en el punto 1 Const WM_USER = 1024 Const EM_GETLINECOUNT = WM_USER + 10 Const EM_LINEFROMCHAR = WM_USER + 25 TotalLineas = SendMessage(Text1.hWnd, EM_GETLINECOUNT, 0, 0&) LineaActual = SendMessage(Text1.hWnd, EM_LINEFROMCHAR, -1, 0&) + 1
'Declaracin del API de 16 bits Declare Function PostMessage Lib "User" _ (ByVal hWnd As Integer, ByVal wMsg As Integer, _