Declare Statement
Declara una referencia a un procedimiento implementado en un archivo externo.
Sintaxis
[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ Overloads ] _
Declare [ charsetmodifier ] [ Sub ] name Lib "libname" _
[ Alias "aliasname" ] [ ([ parameterlist ]) ]
' -or-
[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ Overloads ] _
Declare [ charsetmodifier ] [ Function ] name Lib "libname" _
[ Alias "aliasname" ] [ ([ parameterlist ]) ] [ As returntype ]
Partes
| Término | Definición |
|---|---|
attributelist |
Opcional. Vea Lista de atributos. |
accessmodifier |
Opcional. Puede ser uno de los siguientes: - Público - Protegido - Amigo - Privado - Protected Friend - Private Protected Consulte Niveles de acceso en Visual Basic. |
Shadows |
Opcional. Vea Sombras. |
charsetmodifier |
Opcional. Especifica el juego de caracteres y la información de búsqueda de archivos. Puede ser uno de los siguientes: - Ansi (valor predeterminado) - Unicode - Automático |
Sub |
Opcional, pero debe Sub aparecer o Function . Indica que el procedimiento externo no devuelve un valor. |
Function |
Opcional, pero debe Sub aparecer o Function . Indica que el procedimiento externo devuelve un valor . |
name |
Necesario. Nombre de esta referencia externa. Para obtener más información, vea Nombres de elementos declarados. |
Lib |
Necesario. Presenta una cláusula , que identifica el archivo externo (dll o recurso Lib de código) que contiene un procedimiento externo. |
libname |
Necesario. Nombre del archivo que contiene el procedimiento declarado. |
Alias |
Opcional. Indica que el procedimiento que se declara no se puede identificar en su archivo con el nombre especificado en name . Especifique su identificación en aliasname . |
aliasname |
Obligatorio si usa la palabra Alias clave . Cadena que identifica el procedimiento de una de estas dos maneras:Nombre del punto de entrada del procedimiento dentro de su archivo, entre comillas ( "" )O bien Signo de número ( ) seguido de un entero que especifica el número ordinal del punto de entrada del # procedimiento dentro de su archivo |
parameterlist |
Obligatorio si el procedimiento toma parámetros. Vea Lista de parámetros. |
returntype |
Obligatorio si Function se especifica y es Option Strict On . Tipo de datos del valor devuelto por el procedimiento. |
Comentarios
A veces es necesario llamar a un procedimiento definido en un archivo (como un archivo DLL o un recurso de código) fuera del proyecto. Al hacerlo, el compilador de Visual Basic no tiene acceso a la información que necesita para llamar correctamente al procedimiento, como dónde se encuentra el procedimiento, cómo se identifica, su secuencia de llamada y el tipo de valor devuelto, y el juego de caracteres de cadena que usa. La Declare instrucción crea una referencia a un procedimiento externo y proporciona esta información necesaria.
Solo se puede usar Declare en un nivel de módulo. Esto significa que el contexto de declaración de una referencia externa debe ser una clase, estructura o módulo, y no puede ser un archivo de código fuente, un espacio de nombres, una interfaz, un procedimiento o un bloque. Para obtener más información, vea Declaration Contexts and Default Access Levels (Contextos de declaración y niveles de acceso predeterminados).
Las referencias externas tienen como valor predeterminado acceso público. Los niveles de acceso se pueden ajustar con los modificadores de acceso.
Reglas
Atributos. Puede aplicar atributos a una referencia externa. Cualquier atributo que aplique solo tiene efecto en el proyecto, no en el archivo externo.
Modificadores. Los procedimientos externos son compartidos implícitamente. No puede usar la
Sharedpalabra clave al declarar una referencia externa y no puede modificar su estado compartido.Un procedimiento externo no puede participar en la invalidación, implementar miembros de interfaz ni controlar eventos. En consecuencia, no puede usar la palabra clave
Overrides, , , , o en una instrucciónOverridableNotOverridableMustOverrideImplementsHandlesDeclare.Nombre del procedimiento externo. No es necesario dar a esta referencia externa el mismo nombre (en ) que el nombre del punto de entrada del procedimiento dentro de
namesu archivo externo (aliasname). Puede usar una cláusulaAliaspara especificar el nombre del punto de entrada. Esto puede ser útil si el procedimiento externo tiene el mismo nombre que un modificador reservado de Visual Basic, una variable, un procedimiento o cualquier otro elemento de programación en el mismo ámbito.Nota
Los nombres de punto de entrada en la mayoría de los archivos DLL distinguen mayúsculas de minúsculas.
Número de procedimiento externo. Como alternativa, puede usar una cláusula para especificar el número ordinal del punto de entrada dentro de la tabla
Aliasde exportación del archivo externo. Para ello, comience conaliasnameun signo de número (#). Esto puede ser útil si no se permite ningún carácter en el nombre del procedimiento externo en Visual Basic o si el archivo externo exporta el procedimiento sin un nombre.
Reglas de tipo de datos
Tipos de datos de parámetros. Si
Option Strictes , debe especificar el tipo de datos de cada parámetro enOnparameterlist. Puede ser cualquier tipo de datos o el nombre de una enumeración, estructura, clase o interfaz. En , se usa una cláusula para especificar el tipo de datos del argumento queparameterlistse va a pasar a cadaAsparámetro.Nota
Si el procedimiento externo no se escribió para el .NET Framework, debe tener cuidado de que los tipos de datos se correspondan. Por ejemplo, si declara una referencia externa a un procedimiento Visual Basic 6.0 con un parámetro (16 bits en Visual Basic 6.0), debe identificar el argumento correspondiente como en la instrucción , porque es el tipo entero de
IntegerShort16 bits enDeclareVisual Basic. De forma similar,Longtiene un ancho de datos diferente Visual Basic 6.0 y se implementa de formaDatediferente.Tipo de datos devuelto. Si el procedimiento externo es y es , debe especificar el tipo de datos
Functiondel valor devuelto al código deOption StrictOnllamada. Puede ser cualquier tipo de datos o el nombre de una enumeración, estructura, clase o interfaz.Nota
El Visual Basic no comprueba que los tipos de datos sean compatibles con los del procedimiento externo. Si hay una discrepancia, Common Language Runtime genera una excepción MarshalDirectiveException en tiempo de ejecución.
Tipos de datos predeterminados. Si es y no se especifica el tipo de datos de un parámetro en , el compilador Visual Basic convierte el argumento correspondiente al tipo de
Option StrictOffdatosparameterlistobject. Del mismo modo, si no especificareturntype, el compilador toma el tipo de datos devuelto para que seaObject.Nota
Dado que está trabajando con un procedimiento externo que podría haber sido escrito en una plataforma diferente, es peligroso realizar suposiciones sobre los tipos de datos o permitir que se realicen de forma predeterminada. Es mucho más seguro especificar el tipo de datos de cada parámetro y del valor devuelto, si existe. Esto también mejora la legibilidad del código.
Comportamiento
Ámbito. Una referencia externa está en el ámbito a lo largo de su clase, estructura o módulo.
Vida. Una referencia externa tiene la misma duración que la clase, estructura o módulo en que se declara.
Llamar a un procedimiento externo. Se llama a un procedimiento externo de la misma manera que se llama a un procedimiento o ; se usa en una expresión si devuelve un valor o se especifica en una instrucción Call si no devuelve
FunctionSubun valor.Los argumentos se pasan al procedimiento externo exactamente como se especifica en
parameterlistlaDeclareinstrucción . No tiene en cuenta cómo se declararon originalmente los parámetros en el archivo externo. De forma similar, si hay un valor devuelto, úselo exactamente como se especifica enreturntypelaDeclareinstrucción .Juegos de caracteres. Puede especificar en cómo
charsetmodifierse Visual Basic serializar cadenas cuando llama al procedimiento externo. El modificador dirige Visual Basic serializar todas las cadenas a valores ANSI y el modificador lo dirige para serializar todas las cadenas aAnsiUnicodevalores Unicode. El modificador indica a Visual Basic serializar cadenas según las .NET Framework basadas en la referencia externaAutonameo si sealiasnameespecifica. El valor predeterminado esAnsi.charsetmodifiertambién especifica cómo Visual Basic buscar el procedimiento externo dentro de su archivo externo.AnsiyUnicodedirigen Visual Basic buscarlo sin modificar su nombre durante la búsqueda.Autodirige Visual Basic para determinar el juego de caracteres base de la plataforma en tiempo de ejecución y, posiblemente, modificar el nombre del procedimiento externo, como se muestra a continuación:En una plataforma Unicode, como Windows, primero busque el procedimiento externo sin modificar el nombre. Si se produce un error, anexe "W" al final del nombre del procedimiento externo y vuelva a buscarlo.
En una plataforma ANSI, primero busque el procedimiento externo sin modificar el nombre. Si se produce un error, anexe "A" al final del nombre del procedimiento externo y vuelva a buscarlo.
Mecanismo. Visual Basic usa el .NET Framework de invocación de plataforma (PInvoke) para resolver y acceder a procedimientos externos. Tanto la instrucción como la clase usan este mecanismo automáticamente y no necesita
DeclareDllImportAttribute ningún conocimiento de PInvoke. Para obtener más información, vea Tutorial: Llamar a Windows API.
Importante
Si el procedimiento externo se ejecuta fuera de Common Language Runtime (CLR), es código no administrado. Al llamar a este procedimiento, por ejemplo, una función de API Windows o un método COM, puede exponer la aplicación a riesgos de seguridad. Para obtener más información, vea Instrucciones de codificación segura para código no administrado.
Ejemplo 1
En el ejemplo siguiente se declara una referencia externa a un Function procedimiento que devuelve el nombre de usuario actual. A continuación, llama al procedimiento GetUserNameA externo como parte del getUser procedimiento.
Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (
ByVal lpBuffer As String, ByRef nSize As Integer) As Integer
Sub GetUser()
Dim buffer As String = New String(CChar(" "), 25)
Dim retVal As Integer = GetUserName(buffer, 25)
Dim userName As String = Strings.Left(buffer, InStr(buffer, Chr(0)) - 1)
MsgBox(userName)
End Sub
Ejemplo 2
proporciona DllImportAttribute una manera alternativa de usar funciones en código no administrado. En el ejemplo siguiente se declara una función importada sin usar una Declare instrucción .
' Add an Imports statement at the top of the class, structure, or
' module that uses the DllImport attribute.
Imports System.Runtime.InteropServices
<DllImportAttribute("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
' This function copies a file from the path src to the path dst.
' Leave this function empty. The DLLImport attribute forces calls
' to MoveFile to be forwarded to MoveFileW in KERNEL32.DLL.
End Function