Violation d'accès lors de l'exécution de l'application C ++ natif qui utilise un / clr construit DLL

StackOverflow https://stackoverflow.com/questions/2645961

  •  27-09-2019
  •  | 
  •  

Question

Je reorganzing un héritage mixte (gérés et DLL non gérés) application afin que le segment d'application principale est non géré MFC et qui appelle une DLL C ++ compilé avec / drapeau clr qui pont la communication entre la gestion (C # DLLs) et code non managé. Unfortuantely, mon changement ont donné lieu à une violation d'accès qui se produit avant la InitInstance de l'application () est appelée. Cela rend très difficile à déboguer. La seule information que je reçois est la trace de la pile suivante.

>   64006108()  
ntdll.dll!_ZwCreateMutant@16()  + 0xc bytes 
kernel32.dll!_CreateMutexW@12()  + 0x7a bytes   

Alors, voici quelques sceanrios que j'ai essayé.
- Tourné sur exceptions près> Win32 exceptions près> c0000005 Violation d'accès à briser quand Jeté. Toujours le get plus en détail I est de la trace de la pile ci-dessus. J'ai essayé l'application avec F10, mais il tombe en panne avant les points d'arrêt sont frappés et échoue avec la trace de la pile ci-dessus.
-. J'ai écrasa la DLL de pont de sorte qu'il n'a qu'une seule méthode qui retourne un bool et cette méthode est codée false juste de retour (pas de code C # appelé)

bool DllPassthrough::IsFailed() { return false; }

Si la écrasa DLL est compilé avec l'indicateur / clr, l'application échoue. Si elle est compilé sans / drapeau clr, l'application est exécutée.
- J'ai créé une application stub MFC à l'aide de l'Assistant Visual Studio pour les applications et multidocuments appelle DllPassthrough :: IsFailed (). Cela réussit même avec le drapeau / clr utilisé pour compiler la DLL.
- Je l'ai essayé de faire un LoadLibrary manuel sur Winmm.lib comme indiqué dans la note suivante violation d'accès lors de l'utilisation de c ++ / cli . L'application ne fonctionne toujours pas.
Donc, mes questions sont de savoir comment résoudre le problème? Toutes les astuces, stratégies, ou des incidents. Et, à défaut, comment puis-je obtenir plus d'informations sur ce segment de code ou d'une bibliothèque est à l'origine à l'exception d'accès? Si je tente des solutions de contournement plus impliqués comme faire des appels LoadLibrary, je voudrais me limiter aux bibliothèques défaillantes.
Merci. BTW, nous utilisons Visual Studio 2008 et le projet est construit sur le NET Framework 2.0 pour les sections gérées.

Était-ce utile?

La solution

Je crois que je résoudre mon problème. En supprimant systématiquement chaque référence et bibliothèque commentant les appels à cette bibliothèque dans le code d'application (non géré), j'ai finalement retiré la bibliothèque de problèmes et a obtenu le programme à exécuter. Il est un moyen de force brute de diagnostiquer le problème, et heureusement je ne pas avoir à retirer trop de bibliothèques pour le résoudre. Je serais toujours curieux de savoir si quelqu'un a un commentaire si la bibliothèque aurait pu être identifié que le débogueur.
Ainsi, l'étape suivante consiste à déplacer ces appels bibliothèque à code managé et de transmettre l'arrière de l'information sur le côté non géré via mon DLL pont. BTW, je le Winmm.lib dans réintégré le projet et il fonctionne encore.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top