Compartir a través de


Tutorial: Llamar a las API de Windows (Visual Basic)

Las API de Windows son bibliotecas de vínculos dinámicos (DLL) que forman parte del sistema operativo Windows. Los usa para realizar tareas cuando es difícil escribir procedimientos equivalentes propios. Por ejemplo, Windows proporciona una función denominada FlashWindowEx que permite hacer que la barra de título de una aplicación se alterne entre tonos claros y oscuros.

La ventaja de usar las API de Windows 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 las APIs de Windows pueden ser difíciles con las que trabajar y poco indulgentes cuando algo sale mal.

Las API de Windows representan una categoría especial de interoperabilidad. Las API de Windows no usan código administrado, no tienen bibliotecas de tipos integradas y usan tipos de datos diferentes a los usados con Visual Studio. Debido a estas diferencias, y como las API de Windows no son objetos COM, la interoperabilidad con las API de Windows y .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, consulte Consumo de funciones DLL no administradas. Puede usar PInvoke en Visual Basic mediante la Declare instrucción o aplicando el DllImport atributo a un procedimiento vacío.

Las llamadas api de Windows eran una parte importante de la programación de Visual Basic en el pasado, pero rara vez son necesarias con Visual Basic .NET. Siempre que sea posible, debe usar código administrado desde .NET Framework para realizar tareas, en lugar de llamar a la API de Windows. En este tutorial se proporciona información sobre aquellas situaciones en las que se necesitan las API de Windows.

Nota:

El equipo puede mostrar nombres o ubicaciones diferentes para algunos de los elementos de la interfaz de usuario de Visual Studio en las instrucciones siguientes. La edición de Visual Studio que tiene y la configuración que usa determinan estos elementos. Para obtener más información, consulte Personalizando el IDE.

Llamadas API mediante Declare (declaraciones)

La manera más común de llamar a las API de Windows es mediante la Declare instrucción .

Para declarar un procedimiento de DLL

  1. Determine el nombre de la función a la que desea llamar, además de sus argumentos, tipos de argumentos y valor devuelto, así como el nombre y la ubicación del archivo DLL que lo contiene.

    Nota:

    Para obtener información completa sobre las API de Windows, consulte la documentación del SDK de Win32 en la API de Windows del SDK de plataforma. Para obtener más información sobre las constantes que usan las API de Windows, examine los archivos de encabezado como Windows.h incluidos con el SDK de plataforma.

  2. Abra un nuevo proyecto de aplicación de Windows haciendo clic en Nuevo en el menú Archivo y, a continuación, haga clic en Proyecto. Aparecerá el cuadro de diálogo Nuevo proyecto .

  3. Seleccione Aplicación de Windows en la lista de plantillas de proyecto de Visual Basic. Se muestra el nuevo proyecto.

  4. Agregue la siguiente Declare función a la clase o al módulo en el 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 declaración incluye los siguientes elementos.

Modificador automático

El Auto modificador indica al tiempo de ejecución que convierta la cadena en función del nombre del método según las reglas de Common Language Runtime (o nombre de alias si se especifica).

Palabras clave Lib (biblioteca) y Alias

El nombre que sigue a la Function 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 que está llamando, o puede usar cualquier nombre de procedimiento válido y, a continuación, emplear la Alias palabra clave para especificar el nombre real de la función a la que 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 se llama. No es necesario especificar la ruta de acceso para los archivos ubicados en los directorios del sistema de Windows.

Use la Alias palabra clave si el nombre de la función que está llamando no es un nombre de procedimiento de Visual Basic válido o entra en conflicto con el nombre de otros elementos de la aplicación. Alias indica el nombre verdadero de la función a la que se llama.

Declaraciones de tipo de datos y argumentos

Declare los argumentos y sus tipos de datos. Esta parte puede ser difícil porque los tipos de datos que Usa Windows no corresponden a los tipos de datos de Visual Studio. Visual Basic realiza una gran cantidad del trabajo por usted mediante la conversión de argumentos en tipos de datos compatibles, un proceso denominado serialización. Puede controlar explícitamente cómo se serializarán los argumentos mediante el atributo MarshalAsAttribute definido en el espacio de nombres System.Runtime.InteropServices.

Nota:

Las versiones anteriores de Visual Basic le permitían declarar parámetros As Any, lo que significa que se podrían usar datos de cualquier tipo de datos. Visual Basic requiere que use un tipo de datos específico para todas las Declare instrucciones.

Constantes de API de Windows

Algunos argumentos son combinaciones de constantes. Por ejemplo, la MessageBox API que se muestra en este tutorial acepta un argumento entero denominado Typ que controla cómo se muestra el cuadro de mensaje. Puede determinar el valor numérico de estas constantes examinando las #define instrucciones del archivo WinUser.h. Los valores numéricos se muestran generalmente en hexadecimal, por lo que es posible que desee usar una calculadora para agregarlos y convertir en decimal. Por ejemplo, si desea combinar las constantes para el estilo MB_ICONEXCLAMATION de exclamación 0x00000030 y el estilo MB_YESNO Sí/No 0x00000004, puede agregar los números y obtener un resultado de 0x00000034 o 52 decimales. Aunque puede usar el resultado decimal directamente, es mejor declarar estos valores como constantes en la aplicación y combinarlos con el Or operador .

Para declarar constantes para las llamadas a la API de Windows
  1. Consulte la documentación de la función de Windows que está utilizando. Determine el nombre de las constantes que usa y el nombre del archivo .h que contiene los valores numéricos de estas constantes.

  2. Use un editor de texto, como el Bloc de notas, para ver el contenido del archivo de encabezado (.h) y busque los valores asociados a las constantes que está usando. Por ejemplo, la MessageBox API usa la constante MB_ICONQUESTION para mostrar un signo de interrogación en el cuadro de mensaje. La definición de MB_ICONQUESTION está en WinUser.h y aparece de la siguiente manera:

    #define MB_ICONQUESTION 0x00000020L

  3. Agregue instrucciones equivalentes Const 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 de DLL
  1. Agregue un botón denominado Button1 al formulario de inicio del proyecto y, a continuación, haga doble clic en él para ver su código. Se muestra el controlador de eventos del botón.

  2. Agregue código al Click controlador de eventos para el botón que agregó para llamar al procedimiento 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 Sub
    
  3. Ejecute el proyecto presionando F5. El cuadro de mensaje se muestra con los botones de respuesta y No. Haga clic en cualquiera de ellos.

Serialización de datos

Visual Basic convierte automáticamente los tipos de datos de parámetros y valores devueltos para las llamadas a la API de Windows, pero puede usar el MarshalAs atributo para especificar explícitamente tipos de datos no administrados que espera una API. Para más información sobre la serialización de interoperabilidad, vea Serialización de interoperabilidad.

Para usar Declare y MarshalAs en una llamada API
  1. Determine el nombre de la función a la que desea llamar, además de sus argumentos, tipos de datos y valor devuelto.

  2. Para simplificar el acceso al atributo MarshalAs, agregue una instrucción Imports al principio del código de la clase o del módulo, como se muestra en el siguiente ejemplo.

    Imports System.Runtime.InteropServices
    
  3. Agregue un prototipo de función para la función importada a la clase o módulo que está usando y aplique el MarshalAs atributo a los parámetros o al valor devuelto. En el ejemplo siguiente, una llamada API que espera el tipo void* se serializa como AsAny:

    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 Declare instrucción , pero proporciona más control sobre cómo se llama a las funciones.

Puede usar DllImport con la mayoría de las llamadas a la API de Windows siempre que la llamada haga referencia a un método compartido (a veces denominado estático). No se pueden usar métodos que requieran una instancia de una clase. A diferencia de las instrucciones Declare, las llamadas DllImport no pueden usar el atributo MarshalAs.

Para llamar a una API de Windows mediante el atributo DllImport

  1. Abra un nuevo proyecto de aplicación de Windows haciendo clic en Nuevo en el menú Archivo y, a continuación, haga clic en Proyecto. Aparecerá el cuadro de diálogo Nuevo proyecto .

  2. Seleccione Aplicación de Windows en la lista de plantillas de proyecto de Visual Basic. Se muestra el nuevo proyecto.

  3. Agregue un botón denominado Button2 al formulario de inicio.

  4. Haga doble clic Button2 para abrir la vista de código del formulario.

  5. Para simplificar el acceso a DllImport, agregue una Imports instrucción a la parte superior del código de la clase de formulario de inicio:

    Imports System.Runtime.InteropServices
    
  6. Declare una función vacía que precede a la End Class instrucción para el formulario y asigne un nombre a la función MoveFile.

  7. Aplique los Public modificadores y Shared a la declaración de función y establezca parámetros para MoveFile en función de los argumentos que usa la función de la API de Windows:

    Public Shared Function MoveFile(
        ByVal src As String,
        ByVal dst As String) As Boolean
        ' Leave the body of the function empty.
    End Function
    

    La función puede tener cualquier nombre de procedimiento válido; el DllImport atributo especifica el nombre en el archivo DLL. También controla la manipulación de interoperabilidad para los parámetros y los valores devueltos, permitiéndole elegir tipos de datos de Visual Studio similares a los tipos de datos que utiliza la API.

  8. Aplique el DllImport atributo 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 se llama. No es necesario especificar la ruta de acceso para los archivos ubicados en los directorios del sistema de Windows. El segundo parámetro es un argumento con nombre que especifica el nombre de la función en la API de Windows. En este ejemplo, el atributo DllImport fuerza que las llamadas a MoveFile se reenvíen a MoveFileW en KERNEL32.DLL. El MoveFileW método copia un archivo desde la ruta src a la ruta dst.

    <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 Function
    
  9. Agregue código al Button2_Click controlador de 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 Sub
    
  10. Cree un archivo denominado Test.txt y colóquelo en el directorio C:\Tmp del disco duro. Cree el directorio Tmp si es necesario.

  11. Presione F5 para iniciar la aplicación. Aparece el formulario principal.

  12. Haga clic en Botón2. El mensaje "El archivo se movió correctamente" se muestra si se puede mover el archivo.

Consulte también