2010-03-03 10 views
0

J'ai un problème où dû à la mémoire partagée, lorsque MS Visual C 6.0 DLL se bloque, VB 6 EXE se bloque également. Notre programme principal EXE est écrit en VB 6. Il appelle des plug-ins (DLL) pour les différents types de fichiers, ceux-ci sont écrits en MS Visual C 6.0. Quand un plug-in "C" (DLL) rencontre un problème, il se bloque parfois et cela provoque le crash du programme EXE car ils partagent le même espace d'adressage. Donc, je cherche un moyen d'empêcher les DLL MS Visual C 6.0 de provoquer le crash de l'EXE VB 6, lorsque la DLL se bloque.En raison de la mémoire partagée, lorsque DLL Microsoft Visual C 6.0 se bloque, provoque également VB 6 EXE

+2

La DLL s'exécute dans le même espace de traitement que l'exécutable - pour l'OS ils font partie du même "programme". – Joe

+0

Comment les fonctions C sont-elles exportées? ... Cela nous aiderait à inclure du code pour expliquer plus ... nous regardons aveuglément et ne pouvons pas voir quoi/où/pourquoi/comment ... – t0mm13b

Répondre

2

Cela n'a rien à voir avec les DLL et les EXE. C'est un fil qui se bloque. Si vous n'attrapez pas l'exception, cela appellera le gestionnaire d'exceptions par défaut dans Windows. Ce qui mettra fin au processus, en informant éventuellement Microsoft du problème.

La prise en charge et la gestion d'exceptions telles qu'AccessViolation ne sont pas possibles dans VB6. Cela n'en vaut pas la peine quand même, votre thread d'exécution principal a subi une crise cardiaque et ne peut pas continuer de façon significative. Même si vous pouviez l'attraper, le programme est dans un très mauvais état avec son état global partiellement muté. Essayer de continuer créera simplement plus de plantages. Ou bien pire, générer des résultats invalides et détruire des données précieuses.

Une option consiste à exécuter la DLL dans un processus distinct. Un crash va terminer ce processus, pas le vôtre. Obtenir ce droit est très difficile, il est difficile de détecter le crash. Et le processus d'interop est délicat.

+0

Le processus interop est banal. Créez un EXE ActiveX. Sinon, bonne réponse – MarkJ

+0

Bon exemple de comment ne pas le faire. Une AV ne plante pas l'exe, elle est interceptée et renvoyée avec le code d'erreur RPC_E_SERVER_FAULT. Avec absolument aucune indication de ce qui s'est mal passé et un serveur qui est dans un état d'exécution très périlleux. IGlobalOptions de Vista a apporté un soulagement. –