2010-03-21 16 views
0

je le morceau de code suivant:exception de violation d'accès à partir des supports de Delphi -> QueryInterface

for i := 0 to FControlList.Count - 1 do 
     if Supports(IMyControl(FControlList[i]), IMyControlEx) then 
     begin 
     MyControlEx := IMyControl(FControlList[i]) as IMyControlEx; 
     MyControlEx.DoYourMagic(Self, SomeData); 
     end; 

Ce code est appelé à plusieurs reprises au cours de mon exécution de l'application, mais il échoue dans certains cas spécifiques à l'intérieur des supports() méthode. Et plus précisément - il semble tomber dans l'appel de QueryInterface() dans la méthode Supports().

J'ai vérifié que FControlList n'est pas nul et que FControlList [i] n'est pas nul et que cela arrive toujours.

Toute idée sera appréciée !!!

+1

Pouvez-vous enlever le plâtre à IMyControl dans les supports appel? Qu'est-ce que FControlList, une IInterfaceList? – mjn

+0

Notez également que TControl peut avoir sa propre gestion du cycle de vie, même s'il s'agit de sous-classes de TInterfacedPersistent, il n'utilise pas le comptage de références. Voir http://stackoverflow.com/questions/2182612 – mjn

+0

C'est juste parce que TInterfacedPersistent n'utilise pas le comptage de références. Sinon, TInterfacedObject a été utilisé. –

Répondre

5

Même si FControlList[I] n'est pas nil, cela ne signifie pas qu'il pointe vers des données valides. L'instance d'objet sous-jacente a peut-être déjà été libérée.

Je suggère également d'enlever le type coulé à IMyControl. Supports peut prendre des objets et des interfaces en tant que paramètre, même si elles sont nil, et produire le résultat souhaité.

En outre, vous pouvez envisager d'utiliser cette façon d'appeler supports pour votre convenance et readabilty du code:

if Supports(FControlList[i], IMyControlEx, MyControlEx) then 
begin 
    MyControlEx.DoYourMagic(Self, SomeData); 
end; 
+1

+1 pour le bon usage de Supports dans ce cas –

+0

On dirait que vous avez raison et en effet il a des données libérées. Le problème est très compliqué et je ne l'ai pas encore résolu, mais encore - c'est la réponse. Merci! – Sharon