Cómo obtener la dirección de las variables en Visual Basic

Seleccione idioma Seleccione idioma
Id. de artículo: 199824 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

Es raro que un programador de Visual Basic es necesario obtener información de nivel bajo en una variable, como su dirección de memoria. Sin embargo, hay algunas funciones de API que requieren dicha información. En este artículo se describe las siguientes funciones de Visual Basic que pueden ayudar a un programador de Visual Basic obtener esta información:

VarPtr - devuelve la dirección de una variable.

VarPtrArray - devuelve la dirección de la matriz.

StrPtr - devuelve la dirección del búfer de cadena UNICODE.

VarPtrStringArray - devuelve la dirección de una matriz de cadenas.

ObjPtr - devuelve el puntero a la interfaz que hace referencia una variable de objeto.

Más información

Advertencia : una o más de las siguientes funciones se describen en este artículo; VarPtr, VarPtrArray, VarPtrStringArray, StrPtr, ObjPtr. Estas funciones no son compatibles con soporte técnico de Microsoft. No aparecen en la documentación de Visual Basic y se proporcionan en este artículo de Knowledge Base "tal"cual. Microsoft no garantiza que estarán disponibles en versiones futuras de Visual Basic.

VarPtr

Esta función puede utilizarse para obtener la dirección de una variable o un elemento de matriz. Toma el nombre de variable o el elemento de matriz como parámetro y devuelve la dirección. Sin embargo, debe saber que reasignen matrices dinámicas desbloqueada por Visual Basic, por lo que debe ser mucho cuidado cuando utilice VarPtr para obtener la dirección de un elemento de matriz.

En el ejemplo siguiente se obtiene la dirección de una variable:

Dim lngVariableAddress as Long
Dim dblMyVariable as Double
lngVariableAddress = VarPtr(dblMyVariable)
				

En este ejemplo obtiene la dirección del cuarto elemento de matriz:

Dim lngElementAddress as Long
Dim lngArrayOfLongs(9) as Long
' following will get address of 4th element
lngElementAddress = VarPtr(lngArrayOfLongs(3))
				

Limitaciones: La función VarPtr no puede utilizarse para obtener la dirección de la matriz. Para obtener más información, vea la función VarPtrArray.

VarPtrArray

Matrices en Visual Basic se almacenan como SafeArray. Para obtener la dirección de la estructura SAFEARRAY, deberá utilizar la función VarPtrArray. Los siguientes son las declaraciones de Visual Basic 5.0 y Visual Basic 6.0 respectivamente:

Declare Function VarPtrArray Lib "msvbvm50.dll" Alias "VarPtr" _
(Var() as Any) As Long


Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" _
(Var() as Any) As Long
				

Para obtener la dirección de un SAFEARRAY, pasar el nombre SAFEARRAY (incluido el paréntesis) a la función VarPtrArray:

Dim lngSafeArrayAddress as Long
Dim lngArrayOfLongs(9) as Long
lngSafeArrayAddress = VarPtrArray(lngArrayOfLongs())
				

Limitaciones: La función VarPtrArray no puede utilizarse para obtener la dirección de una matriz de cadenas, ya que Visual Basic realiza la conversión UNICODE/ANSI para cadenas. Si utiliza VarPtrArray en una matriz de cadenas, obtendrá la dirección de una copia temporal de ANSI de la matriz. Para obtener más información, vea la función VarPtrStringArray.

StrPtr

Las cadenas en Visual Basic se almacenan como del tipo BSTR. Si utiliza el VarPtr en una variable de tipo String, obtendrá la dirección del BSTR, que es un puntero a un puntero de la cadena. Para obtener la dirección del búfer de cadena propio, deberá utilizar la función StrPtr. Esta función devuelve la dirección del primer carácter de la cadena. Tenga en cuenta que las cadenas se almacenan como UNICODE en Visual Basic.

Para obtener la dirección del primer carácter de una cadena, pase la variable de cadena a la función de StrPtr.

Ejemplo:

Dim lngCharAddress as Long
Dim strMyVariable as String
strMyVariable = "Some String"
lngCharAddress = StrPtr(strMyVariable)
				

Puede utilizar esta función cuando se necesita pasar un puntero a una cadena UNIOCODE en una llamada a la API.

VarPtrStringArray

VarPtrStringArray Obtiene la dirección de una matriz de cadenas. Para evitar la conversión UNICODE/ANSI intrínseca realizada por Visual Basic, la declaración tiene que definirse en una biblioteca de tipo.

Como alternativa, puede utilizar el compilador MIDL para compilar su propia biblioteca de tipo de los siguientes archivos .odl.

Para Visual Basic 6.0, cree un archivo de texto denominado VB6ptrlib.odl con el contenido siguiente:

#define RTCALL _stdcall
[
uuid(C6799410-4431-11d2-A7F1-00A0C91110C3),
lcid (0), version(6.0), helpstring("VarPtrStringArray Support for VB6")
]
library PtrLib
{
importlib ("stdole2.tlb");
[dllname("msvbvm60.dll")]
module ArrayPtr
   {
   [entry("VarPtr")]
   long RTCALL VarPtrStringArray([in] SAFEARRAY (BSTR) *Ptr);
   }
}
				

En Visual Basic 5.0, cree un archivo de texto denominado VB5ptrlib.odl con el contenido siguiente:

#define RTCALL _stdcall
[
uuid(6E814F00-7439-11D2-98D2-00C04FAD90E7),
lcid (0), version(5.0), helpstring("VarPtrStringArray Support for VB5")
]
library PtrLib
{
importlib ("stdole2.tlb");
[dllname("msvbvm50.dll")]
module ArrayPtr
   {
   [entry("VarPtr")]
   long RTCALL VarPtrStringArray([in] SAFEARRAY (BSTR) *Ptr);
   }
}
				

Utilice las siguientes líneas de comandos para compilar los archivos .odl anterior con el compilador MIDL para crear un archivo de biblioteca (.tlb) de tipo Visual Basic 6.0 o Visual Basic 5.0 respectivamente:

/T MIDL VB6ptrlib.odl MIDL /t VB5ptrlib.odl

Para utilizar la función VarPtrStringArray en su proyecto, deberá crear una referencia a la biblioteca de tipo que acaba de crear.

Ejemplo:

Dim MyArrayOfStrings(2) As String
Dim AddressOfArray As Long
MyArrayOfStrings(0)="AAA"
MyArrayOfStrings(1)="BBB"
AddressOfArray = VarPtrStringArray ( MyArrayOfStrings() )
				

ObjPtr

ObjPtr toma un nombre de variable de objeto como un parámetro y obtiene la dirección de la interfaz al que hace referencia esta variable de objeto.

Un escenario de utilizar esta función es cuando tiene que hacer una colección de objetos. Por el objeto mediante su dirección como la clave de indización, puede obtener acceso más rápido al objeto que recorrer la colección y utilizar el operador IS. En muchos casos, la dirección de un objeto es confiable sólo lo utiliza como clave.

Ejemplo:

objCollection.Add MyObj1, CStr(ObjPtr(MyObj1))
...
objCollection.Remove CStr(ObjPtr(MyObj1))
				

Propiedades

Id. de artículo: 199824 - Última revisión: jueves, 01 de julio de 2004 - Versión: 2.1
La información de este artículo se refiere a:
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Visual Basic 6.0 Edición de aprendizaje
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
Palabras clave: 
kbmt kbhowto KB199824 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 199824

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com