Tutorial: Llamar a las API de Windows (Visual Basic)
Windows Las API son bibliotecas de vínculos dinámicos (DLL) que forman parte del Windows operativo. Se usan para realizar tareas cuando es difícil escribir procedimientos equivalentes propios. Por ejemplo, Windows proporciona una función denominada que le permite crear la barra de título de una aplicación alternativa entre los FlashWindowEx sombreados claros y oscuros.
La ventaja de usar Windows API en el código es que pueden ahorrar tiempo de desarrollo porque contienen docenas de funciones útiles que ya están escritas y esperando su uso. La desventaja es que Windows API pueden ser difíciles de trabajar con e imperdables cuando las cosas van mal.
Windows Las API representan una categoría especial de interoperabilidad. Windows Las API no usan código administrado, no tienen bibliotecas de tipos integradas y usan tipos de datos diferentes de los que se usan con Visual Studio. Debido a estas diferencias y Windows LAS API no son objetos COM, la interoperabilidad con las API de Windows y el .NET Framework se realiza mediante la invocación de plataforma o PInvoke. La invocación de plataforma es un servicio que permite que el código administrado llame a funciones no administradas implementadas en archivos DLL. Para obtener más información, vea Consumo de funciones DLL no administradas. Puede usar PInvoke en Visual Basic mediante la instrucción o aplicando el Declare atributo a un procedimiento DllImport vacío.
Windows Las llamadas API eran una parte importante de Visual Basic programación en el pasado, pero rara vez son necesarias con Visual Basic .NET. Siempre que sea posible, debe usar código administrado de la .NET Framework para realizar tareas, en lugar de Windows API. En este tutorial se proporciona información para aquellas situaciones en las que es necesario Windows API.
Nota
Es posible que el equipo muestre nombres o ubicaciones diferentes para algunos de los elementos de la interfaz de usuario de Visual Studio en las siguientes instrucciones. La edición de Visual Studio que se tenga y la configuración que se utilice determinan estos elementos. Para obtener más información, vea Personalizar el IDE.
Llamadas API mediante Declare
La manera más común de llamar a Windows API es mediante la Declare instrucción .
Para declarar un procedimiento DLL
Determine el nombre de la función a la que desea llamar, además de sus argumentos, tipos de argumento y valor devuelto, así como el nombre y la ubicación del archivo DLL que la contiene.
Nota
Para obtener información completa sobre Windows API, consulte la documentación del SDK de Win32 en Platform SDK Windows API. Para obtener más información sobre las constantes que Windows API, examine los archivos de encabezado como Windows.h incluidos con el SDK de plataforma.
Abra un nuevo proyecto Windows aplicación haciendo clic en Nuevo en el menú Archivo y, a continuación, Project. Aparecerá el cuadro de diálogo Nuevo proyecto .
Seleccione Windows Aplicación en la lista de plantillas Visual Basic proyecto. Se muestra el nuevo proyecto.
Agregue la siguiente función a la clase o módulo en
Declareel que desea usar el archivo DLL:Declare Auto Function MBox Lib "user32.dll" Alias "MessageBox" ( ByVal hWnd As Integer, ByVal txt As String, ByVal caption As String, ByVal Typ As Integer) As Integer
Partes de la instrucción Declare
La Declare instrucción incluye los siguientes elementos.
Modificador Auto
El modificador indica al tiempo de ejecución que convierta la cadena según el nombre del método según las reglas de Common Language Runtime (o el Auto nombre de alias si se especifica).
Palabras clave Lib y Alias
El nombre que sigue a Function la palabra clave es el nombre que usa el programa para acceder a la función importada. Puede ser el mismo que el nombre real de la función a la que está llamando, o puede usar cualquier nombre de procedimiento válido y, a continuación, emplear la palabra clave para especificar el nombre real de la función a la que Alias está llamando.
Especifique la Lib palabra clave , seguida del nombre y la ubicación del archivo DLL que contiene la función a la que está llamando. No es necesario especificar la ruta de acceso de los archivos ubicados en los Windows directorios del sistema.
Use la palabra clave si el nombre de la función a la que está llamando no es un nombre de procedimiento Visual Basic válido o entra en conflicto con el nombre de otros elementos de Alias la aplicación. Alias indica el nombre verdadero de la función a la que se llama.
Declaraciones de argumentos y tipos de datos
Declare los argumentos y sus tipos de datos. Esta parte puede ser complicada porque los tipos de datos que Windows no se corresponden con Visual Studio tipos de datos. Visual Basic gran parte del trabajo al convertir argumentos en tipos de datos compatibles, un proceso denominado serialización. Puede controlar explícitamente cómo se serializan los argumentos mediante el MarshalAsAttribute atributo definido en el espacio de nombres System.Runtime.InteropServices .
Nota
Las versiones anteriores de Visual Basic permitían declarar parámetros , lo que significa que se podían usar datos de As Any cualquier tipo de datos. Visual Basic requiere que se use un tipo de datos específico para todas Declare las instrucciones.
Windows Constantes de API
Algunos argumentos son combinaciones de constantes. Por ejemplo, la API que se muestra en este tutorial acepta un argumento entero denominado MessageBox que controla cómo se muestra el cuadro de Typ mensaje. Para determinar el valor numérico de estas constantes, examine las instrucciones del #define archivo WinUser.h. Los valores numéricos se muestran generalmente en formato hexadecimal, por lo que es posible que desee usar una calculadora para agregarlos y convertirlos en decimales. Por ejemplo, si desea combinar las constantes para el estilo de exclamación 0x00000030 y el estilo Sí/No 0x00000004, puede agregar los números y obtener un resultado de 0x00000034, o MB_ICONEXCLAMATION MB_YESNO 52 decimales. Aunque puede usar el resultado decimal directamente, es mejor declarar estos valores como constantes en la aplicación y combinarlos mediante el Or operador .
Para declarar constantes para las llamadas Windows API
Consulte la documentación de la Windows a la que está llamando. Determine el nombre de las constantes que usa y el nombre del archivo .h que contiene los valores numéricos de estas constantes.
Use un editor de texto, como Bloc de notas, para ver el contenido del archivo de encabezado (.h) y buscar los valores asociados a las constantes que está usando. Por ejemplo, la
MessageBoxAPI usa la constante para mostrar un signo deMB_ICONQUESTIONinterrogación en el cuadro de mensaje. La definiciónMB_ICONQUESTIONde está en WinUser.h y aparece como sigue:#define MB_ICONQUESTION 0x00000020LAgregue instrucciones
Constequivalentes a la clase o módulo para que estas constantes estén disponibles para la aplicación. Por ejemplo:Const MB_ICONQUESTION As Integer = &H20 Const MB_YESNO As Integer = &H4 Const IDYES As Integer = 6 Const IDNO As Integer = 7
Para llamar al procedimiento DLL
Agregue un botón denominado al formulario de inicio del proyecto y, a continuación, haga doble clic
Button1en él para ver su código. Se muestra el controlador de eventos para el botón.Agregue código al controlador de eventos para el botón que agregó para llamar al
Clickprocedimiento y proporcionar los argumentos adecuados:Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' Stores the return value. Dim RetVal As Integer RetVal = MBox(0, "Declare DLL Test", "Windows API MessageBox", MB_ICONQUESTION Or MB_YESNO) ' Check the return value. If RetVal = IDYES Then MsgBox("You chose Yes") Else MsgBox("You chose No") End If End SubEjecute el proyecto presionando F5. El cuadro de mensaje se muestra con los botones Sí y No respuesta. Haga clic en cualquiera de ellos.
Serialización de datos
Visual Basic convierte automáticamente los tipos de datos de parámetros y los valores devueltos para las llamadas API de Windows, pero puede usar el atributo para especificar explícitamente los tipos de datos no administrados que espera una MarshalAs API. Para obtener más información sobre la serialización de interoperabilidad, vea Serialización de interoperabilidad.
Para usar Declare y MarshalAs en una llamada API
Determine el nombre de la función a la que desea llamar, además de sus argumentos, tipos de datos y valor devuelto.
Para simplificar el acceso al atributo , agregue una instrucción al principio del código para la clase o
MarshalAsImportsmódulo, como en el ejemplo siguiente:Imports System.Runtime.InteropServicesAgregue un prototipo de función para la función importada a la clase o módulo que está usando y aplique el atributo a los
MarshalAsparámetros o al valor devuelto. En el ejemplo siguiente, una llamada API que espera que el tipovoid*se serializa comoAsAny:Declare Sub SetData Lib "..\LIB\UnmgdLib.dll" ( ByVal x As Short, <MarshalAsAttribute(UnmanagedType.AsAny)> ByVal o As Object)
Llamadas API mediante DllImport
El DllImport atributo proporciona una segunda manera de llamar a funciones en archivos DLL sin bibliotecas de tipos. DllImport es aproximadamente equivalente al uso de una instrucción , pero proporciona más control sobre cómo se llama a Declare las funciones.
Puede usar con la mayoría de Windows API, siempre y cuando la llamada hace referencia a un método compartido (a veces DllImport denominado estático). No se pueden usar métodos que requieran una instancia de una clase . A Declare diferencia de las instrucciones , las llamadas no pueden usar el atributo DllImport MarshalAs .
Para llamar a una API Windows mediante el atributo DllImport
Abra un nuevo proyecto Windows aplicación haciendo clic en Nuevo en el menú Archivo y, a continuación, Project. Aparecerá el cuadro de diálogo Nuevo proyecto .
Seleccione Windows Aplicación en la lista de plantillas Visual Basic proyecto. Se muestra el nuevo proyecto.
Agregue un botón denominado
Button2al formulario de inicio.Haga doble clic
Button2para abrir la vista de código del formulario.Para simplificar el acceso a , agregue una instrucción al principio
DllImportdel código para la clase de formulario deImportsinicio:Imports System.Runtime.InteropServicesDeclare una función vacía que preceda
End Classa la instrucción del formulario y asigne a la función el nombreMoveFile.Aplique los modificadores y a la declaración de función y establezca los parámetros para en función de los argumentos que
Publicusa Windows función deSharedMoveFileAPI:Public Shared Function MoveFile( ByVal src As String, ByVal dst As String) As Boolean ' Leave the body of the function empty. End FunctionLa función puede tener cualquier nombre de procedimiento válido; el
DllImportatributo especifica el nombre en el archivo DLL. También controla la serialización de interoperabilidad para los parámetros y los valores devueltos, por lo que puede elegir Visual Studio tipos de datos similares a los tipos de datos que usa la API.Aplique el
DllImportatributo a la función vacía. El primer parámetro es el nombre y la ubicación del archivo DLL que contiene la función a la que está llamando. No es necesario especificar la ruta de acceso de los archivos ubicados en los Windows directorios del sistema. El segundo parámetro es un argumento con nombre que especifica el nombre de la función en Windows API. En este ejemplo, el atributo fuerza a que las llamadas seDllImportMoveFilereenvganMoveFileWa en KERNEL32.DLL. ElMoveFileWmétodo copia un archivo de la ruta de acceso a la ruta de accesosrcdst.<DllImport("KERNEL32.DLL", EntryPoint:="MoveFileW", SetLastError:=True, CharSet:=CharSet.Unicode, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> Public Shared Function MoveFile( ByVal src As String, ByVal dst As String) As Boolean ' Leave the body of the function empty. End FunctionAgregue código al controlador
Button2_Clickde eventos para llamar a la función :Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim RetVal As Boolean = MoveFile("c:\tmp\Test.txt", "c:\Test.txt") If RetVal = True Then MsgBox("The file was moved successfully.") Else MsgBox("The file could not be moved.") End If End SubCree un archivo denominado Test.txt y colódelo en el directorio C:\Tmp de la unidad de disco duro. Cree el directorio Tmp si es necesario.
Presione F5 para iniciar la aplicación. Aparece el formulario principal.
Haga clic en Button2. Se muestra el mensaje "El archivo se movió correctamente" si se puede mover el archivo.