Bonjour,

Dans un développement Excel VBA, j'enregistre l'adresse mémoire d'un objet avec ObjPtr, pour retrouver plus tard une référence à l'objet avec RtlMoveMemory. Le problème est que dans certains cas, l'adresse enregistrée n'est plus valable au moment où j'essaie de l'utiliser. Du coup, la création d'objet fonctionne (ou en tout cas elle ne provoque pas d'erreur), mais quand j'invoque une méthode de cet objet, ça plante Excel.

Je cherche donc un moyen de tester que le numéro de pointeur est toujours valable, ou que l'objet renvoyé est correct, du bon type, etc., pour abandonner la création d'objet et éviter le plantage.

Je ne m'y connais pas trop en programmation système, donc toute piste sera la bienvenue !

Les infos détaillées : je suis en Excel 2010 sur du Windows 7 SP1 64 bit. J'utilise le CustomUI, et l'objet que je référence est le ruban personnalisé (classe IRibbonUI).

Voici les lignes pertinentes de mon code :
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
' déclarations
Private iRuban As IRibbonUI
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDest As Any, lpSource As Any, ByVal cBytes&)

' enregistrement de l'adresse mémoire de l'objet ribbon dans un name du fichier Excel
Sub ruban_chg(ribbon As IRibbonUI) ' événement qui se produit au chargement du ruban
Set iRuban = ribbon
ThisWorkbook.Names(NOMRUBAN_REVLIST).RefersTo = ObjPtr(ribbon)
End Sub

' récupération de l'objet ruban
Function Ruban() As IRibbonUI
Dim ribbonPointer As Long

If iRuban Is Nothing Then
  ribbonPointer = Mid(ThisWorkbook.Names(NOMRUBAN_REVLIST).Value, 2) ' le premier caractère est un = généré par Excel
    If ribbonPointer <> 0 Then Call CopyMemory(iRuban, ribbonPointer, 4)
Set Ruban = iRuban
End Function

' ça plante ensuite quand je fais par exemple ça :
Ruban.Invalidate

En vous remerciant,