Como você não está respondendo aos comentários por mais tempo, só posso supor que com a atualização do sistema operacional, você também atualizou de 32 bits para 64 bits.
Se você está declarando chamadas de API, você precisará torná-las PtrSafe
.
Por exemplo, considere a seguinte chamada de DLL:
Declare Function RegOpenKeyA Lib "advapi32.dll" ( _
ByVal Key As Long, ByVal SubKey As String, NewKey As Long) As Long
Qualquer ponteiro de endereço de memória e identificadores de janela precisam ser definidos como LongPtr
, porque o modo como o SO de 64 bits gerencia sua memória. O tipo de retorno para a função acima é aceitável para manter como Long
, porque não está endereçando a memória ou um identificador.
Depois de fazer seu ponteiro de memória e janela manipular conversões, você precisa informar ao Excel que é "seguro" usar declarando sua função como PtrSafe
(Pense em "ponteiro seguro" para os ponteiros de memória):
Declare PtrSafe Function RegOpenKeyA Lib "advapi32.dll" ( _
ByVal Key As LongPtr, ByVal SubKey As String, NewKey As LongPtr) As Long
Take notice of the three changes made in our declaration:
Declare Function
changed toDeclare PtrSafe Function
(Isso informa ao Excel que todos os ponteiros foram alterados e que a função é segura de usar)
ByVal Key As Long
changed toByVal Key As LongPtr
e finalmente
ByVal NewKey As Long
changed toByVal NewKey As LongPtr
Então agora a questão permanece. E se eu quisesse distribuir isso para diferentes arquiteturas do sistema operacional?
Você está com sorte, pois o VBA permite utilizar uma instrução If...Then
especial para suas declarações de módulo. Então, para o código acima, você pode distribuir para 32 & SO de 64 bits com a seguinte declaração:
#If VBA7 Then '64-bit Office
Declare PtrSafe Function RegOpenKeyA Lib "advapi32.dll" ( _
ByVal Key As LongPtr, ByVal SubKey As String, NewKey As LongPtr) As Long
#Else
Declare Function RegOpenKeyA Lib "advapi32.dll" ( _
ByVal Key As Long, ByVal SubKey As String, NewKey As Long) As Long
#End If