Como obter o endereço de variáveis no Visual Basic

Traduções deste artigo Traduções deste artigo
ID do artigo: 199824 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sumário

É incomum para um programador de Visual Basic precisar obter informações de nível baixas em uma variável, como seu endereço de memória. No entanto, há algumas funções de API que requerem essas informações. Este artigo descreve as seguintes funções Visual Basic que podem ajudar um programador de Visual Basic obter essas informações:

VarPtr - Devolve o endereço de uma variável.

VarPtrArray - Devolve o endereço de uma matriz.

StrPtr - Devolve o endereço do buffer de seqüência de caracteres UNICODE.

VarPtrStringArray - devolve o endereço de uma matriz de seqüências de caracteres.

ObjPtr - Devolve o ponteiro para a interface referenciada por uma variável de objeto.

Mais Informações

Aviso : um ou mais das seguintes funções são discutidos neste artigo; VarPtr, VarPtrArray, VarPtrStringArray, StrPtr, ObjPtr. Essas funções não são suportadas pelo suporte técnico da Microsoft. Eles não estão documentados na documentação do Visual Basic e são fornecidos neste artigo Base de dados de Conhecimento "como"estão. A Microsoft não garante que elas estarão disponíveis em versões futuras do Visual Basic.

VarPtr

Esta função pode ser usada para obter o endereço de uma variável ou um elemento de matriz. Ele usa o nome da variável ou elemento da matriz como o parâmetro e retorna o endereço. No entanto, você deve estar ciente de que matrizes dinâmicas desbloqueada pode ser realocado pelo Visual Basic, para que você deve ter muito cuidado ao utilizar VarPtr para obter o endereço de um elemento de matriz.

O exemplo a seguir obtém o endereço de uma variável:

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

Este exemplo obtém o endereço do quarto elemento da matriz:

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

Limitações: A função VarPtr não pode ser usada para obter o endereço de uma matriz. Para obter mais informações, consulte a função VarPtrArray.

VarPtrArray

Matrizes no Visual Basic são armazenadas como SAFEARRAYs. Para obter o endereço da estrutura de SAFEARRAY, você precisará usar a função VarPtrArray. A seguir estão as declarações de Visual Basic 5.0 e 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 obter o endereço de um SAFEARRAY, passe o nome SAFEARRAY (incluindo os parênteses) para a função VarPtrArray:

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

Limitações: A função VarPtrArray não pode ser usada para obter o endereço de uma matriz de cadeias, porque Visual Basic faz a conversão UNICODE/ANSI para seqüências. Se você utilizar VarPtrArray em uma matriz de seqüências de caracteres, você irá obter o endereço de uma cópia ANSI temporária da matriz. Para obter mais informações, consulte a função VarPtrStringArray.

StrPtr

Cadeias de caracteres no Visual Basic são armazenadas como do BSTR. Se você usar o VarPtr em uma variável do tipo String, você irá obter o endereço do BSTR, que é um ponteiro para um ponteiro da seqüência de caracteres. Para obter o endereço do buffer de seqüência de caracteres propriamente dito, você precisará usar a função StrPtr. Esta função retorna o endereço do primeiro caractere da seqüência de caracteres. Leve em conta que seqüências de caracteres são armazenadas como UNICODE no Visual Basic.

Para obter o endereço do primeiro caractere de uma String, passe a variável String para a função StrPtr.

Exemplo:

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

Você pode usar esta função quando você precisar passar um ponteiro para uma seqüência UNIOCODE para uma chamada API.

VarPtrStringArray

VarPtrStringArray obtém o endereço de uma matriz de seqüências de caracteres. Para evitar a conversão UNICODE/ANSI intrínseca realizada pelo Visual Basic, a declaração deve ser definidos em uma biblioteca de tipos.

Como alternativa, você pode usar o compilador MIDL para compilar sua própria biblioteca de tipos de arquivos .odl seguintes.

Para o Visual Basic 6.0, crie um arquivo de texto chamado VB6ptrlib.odl com o conteúdo abaixo:

#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);
   }
}
				

Para Visual Basic 5.0, crie um arquivo de texto chamado VB5ptrlib.odl com o conteúdo abaixo:

#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);
   }
}
				

Use as seguintes linhas de comando para compilar os arquivos .odl anteriores com o compilador MIDL para criar um arquivo de biblioteca (.tlb) de tipo do Visual Basic 6.0 ou Visual Basic 5.0 respectivamente:

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

Para usar a função VarPtrStringArray no seu projeto, você precisará criar uma referência para a biblioteca de tipos que acabou de criar.

Exemplo:

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

ObjPtr

ObjPtr usa um nome de variável de objeto como um parâmetro e obtém o endereço da interface referenciada por essa variável de objeto.

Um cenário de usar esta função é quando você precisa fazer uma coleção de objetos. O objeto usando seu endereço como a chave de indexação, você pode obter acesso mais rápido ao objeto que percorrer a coleção e usando o operador É. Em muitos casos, o endereço de um objeto é a coisa apenas confiável para usar como uma chave.

Exemplo:

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

Propriedades

ID do artigo: 199824 - Última revisão: quinta-feira, 1 de julho de 2004 - Revisão: 2.1
A informação contida neste artigo aplica-se a:
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Visual Basic 6.0 Learning Edition
  • 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
Palavras-chave: 
kbmt kbhowto KB199824 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 199824

Submeter comentários

 

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