Como Obter o Endereço de Variáveis no Visual Basic

Traduções de Artigos Traduções de Artigos
Artigo: 199824 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

É pouco frequente que um programador de Visual Basic necessite de obter informações de baixo nível sobre uma variável, tal como o respectivo endereço de memória. No entanto, existem algumas funções da API que requerem estas informações. Este artigo descreve as seguintes funções do Visual Basic que poderão ajudar um programador a obter estas informações:

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

VarPtrArray - Devolve o endereço de uma matriz.

StrPtr - Devolve o endereço da memória intermédia da cadeia UNICODE.

VarPtrStringArray - Devolve o endereço de uma matriz de cadeias.

ObjPtr - Devolve o ponteiro para a interface referenciado por uma variável de objecto.

Mais Informação

AVISO: Uma ou mais das funções seguintes são descritas neste artigo: VarPtr, VarPtrArray, VarPtrStringArray, StrPtr, ObjPtr. Estas funções não são suportadas pelo Suporte Técnico da Microsoft. Estas funções não se encontram documentadas na documentação do Visual Basic e são fornecidas neste artigo da Base de Dados de Conhecimento "tal como estão". A Microsoft não garante que estarão disponíveis em versões futuras do Visual Basic.

VarPtr

Esta função pode ser utilizada para obter o endereço de uma variável ou elemento de matriz. A função utiliza o nome da variável ou elemento de matriz como parâmetro e devolve o endereço. No entanto, deverá estar ciente de que Matrizes Dinâmicas não bloqueadas poderão ser realocadas pelo Visual Basic, pelo que deverá tomar muito cuidado quando utilizar VarPtr para obter o endereço de um elemento de matriz.

O exemplo seguinte conté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 de uma 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 utilizada para obter o endereço de uma matriz. Para obter mais informações, consulte a função VarPtrArray.

VarPtrArray

No Visual Basic, as matrizes são guardadas como SAFEARRAYs. Para obter o endereço da funcionalidade SAFEARRAY, necessita de utilizar a função VarPtrArray. Em seguida, apresentamos 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 do SAFEARRAY (incluindo os parênteses) para a função VarPtrArray:

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

Limitações: Não é possível utilizar a função VarPtrArray para obter o endereço de uma matriz de Cadeias, porque o Visual Basic efectua a conversão UNICODE/ANSI das Cadeias. Se utilizar VarPtrArray numa matriz de cadeias, 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

No Visual Basic, as cadeias são armazenadas como BSTRs. Se utilizar VarPtr numa variável do tipo Cadeia, irá obter o endereço do BSTR, que é um apontador para um apontador da cadeia. Para obter o endereço da memória intermédia de cadeias propriamente dita, necessita de utilizar a função StrPtr. Esta função devolve o endereço do primeiro carácter da cadeia. Tome em consideração que as Cadeias são armazenadas como UNICODE no Visual Basic.

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

Exemplo:

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

Pode utilizar esta função quando necessitar de passar um apontador para uma cadeia UNIOCODE para uma chamada da API.

VarPtrStringArray

VarPtrStringArray devolve o endereço de uma matriz de Cadeias. Para evitar a conversão UNICODE/ANSI intrínseca efectuada pelo Visual Basic, a declaração tem de estar definida numa biblioteca de tipo.

Alternativamente, poderá utilizar o compilador MIDL para compilar uma biblioteca de tipos própria a partir dos ficheiros .odl seguintes.

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

#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 o Visual Basic 5.0, crie um ficheiro de texto chamado VB5ptrlib.odl com o conteúdo seguinte:

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

Utilize as linhas de comandos seguintes para compilar os ficheiros .odl anteriores com o compilador MIDL para criar um ficheiro de biblioteca de tipos (.tlb) do Visual Basic 6.0 ou Visual Basic 5.0, respectivamente:

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

Para utilizar a função VarPtrStringArray no seu projecto, necessita de criar uma referência à 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 utiliza um nome de variável de objecto como parâmetro e obtém o endereço da interface referenciada por esta variável de objecto.

Um cenário de utilização desta função é quando necessita de efectuar uma colecção de objectos. Através da indexação do objecto com o respectivo endereço como chave, poderá obter um acesso mais rápido ao objecto do que percorrer a colecção e utilizar o operador Is. Em muitos casos, o endereço de um objecto é o único item fiável a utilizar como chave.

Exemplo:

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

Propriedades

Artigo: 199824 - Última revisão: 28 de dezembro de 2007 - 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 6.0 Enterprise Edition
Palavras-chave: 
kbhowto KB199824

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