Visual Basic, VB .NET, ASP, Active X, Access, SQL Server

Usando a função não documentada ObjPtr

 

Ha casos em que não se tem como usar uma propriedade estável e de valor único de um objeto como chave para adicioná-lo a uma coleção. Nestes casos é muito comum se usar a função ObjPtr, que retorna um ponteiro para o objeto. O ponteiro é o endereço de memória do objeto e, como tal, é único. Embora não documentada, esta função já é muito utilizada por programadores avançados. ObjPtr é usada tanto  para a necessidade acima como também para situações onde se precisa armazenar uma referência a um objeto sem poder usar uma variável do tipo objeto. Por exemplo, você pode querer realizar uma operação assíncrona postando uma mensagem para uma janela da sua aplicação usando a API PostMessage. Você pode enviar uma mensagem passando como um dos parâmetros o ponteiro para um objeto a ser usado no ato de recepção da mensagem.  Também pode usar ObjPtr para armazenar referência a um objeto Pai em um objeto Filho sem precisar usar variáveis de tipo de objeto e cair nas referências circulares do COM, que tanta dor de cabeça dão aos programadores na hora de destruir objetos.

ObjPtr funciona assim:

'variável lngPtr para armazenar o ponteiro para o objeto
Dim lngPtr as Long 

lngPtr = ObjPtr(Objeto)

Se quiser usar o ponteiro de um objeto como chave ao adicioná-lo a uma coleção, converta-o para string com CStr.

Para usar ObjPtr para fins mais avançados, no entando, você precisa ter um meio de recuperar o objeto a partir do ponteiro. Para isto declare a função da API CopyMemory como mostrado abaixo.

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)

Para recuperar o objeto utilize a função ObjectFromPtr que retorna um objeto extraído de um ponteiro.

Public Function ObjectFromPtr(ByVal lPtr As Long) As Object
Dim objT As Object
     ' código de Bruce McKinney para obter um objeto
     ' de um ponteiro:

      CopyMemory objT, lPtr, 4
      Set ObjectFromPtr = objT
      CopyMemory objT, 0&, 4
End Function