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

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

ID do Artigo: 199824 - Última Revisão: 28/12/2007 - Revisão: 1

Comentários