Sur certains cas d'erreur ATL invoque AtlThrow()
qui est implémenté en tant que ATL::AtlThrowImpl()
qui à son tour lance CAtlException
. Ce dernier n'est pas très bon - CAtlException
n'est même pas dérivé de std::exception
et aussi nous utilisons notre propre hiérarchie d'exceptions et maintenant nous devrons attraper CAtlException
séparément ici et là ce qui est beaucoup de code supplémentaire et sujet aux erreurs.Comment remplacer de manière fiable un gestionnaire d'erreurs défini par la bibliothèque avec le mien?
On dirait qu'il est possible de remplacer ATL::AtlThrowImpl()
avec mon propre gestionnaire - définir _ATL_CUSTOM_THROW
et définir AtlThrow()
être le gestionnaire personnalisé avant d'inclure atlbase.h
- et ATL appellera le gestionnaire personnalisé.
Pas si facile. Une partie du code ATL n'est pas dans les sources - il est compilé en tant que bibliothèque - statique ou dynamique. Nous utilisons le statique - atls.lib
. Et ... il est compilé de telle sorte qu'il a ATL::ThrowImpl()
à l'intérieur et du code l'appelant. J'ai utilisé un outil d'analyse statique - il montre clairement qu'il y a des chemins sur lesquels l'ancien gestionnaire par défaut est appelé.
Pour s'assurer que j'ai même essayé de "réimplémenter" ATL::AtlThrowImpl()
dans mon code. Maintenant, l'éditeur de liens dit qu'il voit deux déclarations de ATL::AtlThrowImpl()
qui, je suppose, confirme qu'il existe une autre implémentation qui peut être appelée par du code.
Comment puis-je gérer cela? Comment puis-je remplacer complètement le gestionnaire par défaut et m'assurer que le gestionnaire par défaut n'est jamais appelé?
Vous avez raison, mais il s'avère que le problème est AtlThrowImpl() est une fonction inline et ceux qui sont gérés spécialement - http://blogs.msdn.com/b/aszego/archive/2010/05/12/override -atlthrow-with-care.aspx donc la ligne du bas est en cours La conception ATL nécessite une recompilation de la librairie pour remplacer le gestionnaire. – sharptooth
Il est évidemment impossible de contourner les méthodes en ligne de cette manière. Je ne vois aucune solution pour cela, sauf pour modifier les en-têtes et recompiler toute la bibliothèque ATL. – Patrick