AddressOf
Operador unário
que transfere o endereço de memória de um procedimento para uma função API que
espera receber o primeiro do procedimento em um de seus argumentos, utilizando
esta sintaxe:
AdderessOf NomeDoProcedimento
Onde,
- NomeDoProcedimento: argumento obrigatório, especifica o nome de um procedimento existente em um módulo padrão do projeto onde a chamada é efetuada, cujo endereço deve ser passado para a API.
As seguintes considerações são válidas para o operador
AddressOf:
- AddressOf é normalmente empregada em funções de call-back: uma função API existente em uma DLL, que recebe o endereço do procedimento a ser executado em um momento posterior;
- AddressOf pode aparecer apenas em listas de argumentos de função – jamais como uma linha de código que atribui seu valor a uma variável;
- Para capturar o endereço de memória de um procedimento utilizando a instrução AddressOf, atribua o resultado a um argumento de função do tipo Long;
- O emprego de AddressOf pode provocar resultados imprevisíveis, de depuração difícil ou até mesmo impossível, devido a ambos os procedimentos (API em DLL e procedimento em VBA) executaram-se no mesmo processo do ambiente de desenvolvimento.
- Para criar protótipos de funções que empregam caal-back em DLLs, você deverá utilizar o Microsoft Visual C++ ou ferramentas similares, utilizando as convenções de chamada de procedimento __ stdcall (__cdecl não funciona com AddressOf);
- Empregue sempre uma instrução On Error Resume Next para evitar que qualquer erro proveniente do procedimento de call-back,escrito em VBA, se propague no procedimento externo (API).
Exemplo: O exemplo a seguir demonstra como empregar
as API do Windows SetTimer e KillTimer para criar um cronômetro a partir de
qualquer aplicativo COM compatível (como Visual Basic, Access, Excel etc.). O
cronômetro é disparado utilizando-se a função SetTimer e passando-lhe o
endereço de um procedimento que deverá ser chamado quando o intervalo de tempo
desejado tiver sido atingido, o que é feito utilizando-se a função AddressOf do
VBA.
Declare
Function SetTimer Lib “user32” (ByVal hwnd As Long, ByVal nlDEvent As Long,
ByVal uElapse As Long, ByVal IpTimerFunc As Long) As Long
Declare
Function KillTimer Lib “user32” (ByVal hwnd As Long, ByVal nlDEvent As Long) As
Long
Dim
IngTimerID As Long
Public Sub AtivaCronômetro(Optional IngTempo As Long = 5000)
‘IngTempo = Tempo em milisegundos
IngTimerID = SetTimer(0,0,IngTempo,AddressOf Minha função)
End Sub
Public Sub
MinhaFunção(ByVal hwnd&, ByVal msg&, ByVal ID&, ByVal
CurrentTime&)
Call
KillTimer(0, IngTimerID)
MsgBox “O evento ocorreu após o tempo especificado!”
End Sub
Para verificar o funcionamento do procedimento de
Call-back, basta efetuar uma chamada ao procedimento AtivaCronômetro()
passando-lhe um valor em milisegundos (o valor padrão é de 5 milesegundos).
Após o intervalo fornecido (5 segundos), você obterá uma MsgBox indicando que o
tempo esperado já passou.
Até a Próxima!!
Nenhum comentário:
Postar um comentário