none
Dll C++ gestion des erreur. RRS feed

  • Question

  • Bonjour,

    Il y'a pas longtemps j'ai faire une dll en C++ pour mon programme codé en C#.

     

    Mais question est de savoir si il est possible de récupérer les erreurs de mon code C++ en C#, et si il est possible quand il se produit une erreur dans ma dll c++ de ne pas faire crache le programme entier.

     

    Code C#:

    [DllImport("PathFinder.dll")]
        public static extern int GetPathFinder(out float startPos, out float endPos, out float locationOut, uint continentID, int gx, int gy, bool canFly, bool useStraightPath);
    

    Code C++:

    #define DllExportInt  extern "C" __declspec(dllexport) int __stdcall 
    
    DllExportInt GetPathFinder(float *startPos, float *endPos, float *locationOut, unsigned int continentID, int gx, int gy, bool canFly, bool useStraightPath)
    

    Les appels de ma fonction C++ sont bien entre Try/Catch dans mon code C# mais ça fait quand même crache mon programme et impossible de récupéré le message d'erreur.

     

    Merci d'avance.

     

    mercredi 3 novembre 2010 12:47

Réponses

Toutes les réponses

  • Bonjour,

    peux t-on voir le code C# d'appel à la méthode GetPathFinder.

    Cordialement

    mercredi 3 novembre 2010 14:28
    Modérateur
  •  public static List<Point> Find(Point start, Point end, bool canFly = false, int gx = -1, int gy = -1, bool useStraightPath = false, uint idContinent = 99999999)
        {
          List<Point> locList = new List<Point>();
          try
          {
            if (start.X == 0 || start.Y == 0 || start.Z == 0)
              return new List<Point>();
            if (end.X == 0 || end.Y == 0 || end.Z == 0)
              return new List<Point>();
            locList.Add(start);
            if (start.DistanceTo(end) <= 4)
            {
              locList.Add(end);
              return locList;
            }
    
            if (idContinent == 99999999)
              idContinent = (uint)Useful.ContinentId;
    
            int nbPath = 0;
    
            float[] startPos = new float[3];
            float[] endPos = new float[3];
            float[] locationOut = new float[400 * 3];
    
            // Start Point
            startPos[0] = start.X;
            startPos[1] = start.Y;
            startPos[2] = start.Z;
    
            // End Point
            endPos[0] = end.X;
            endPos[1] = end.Y;
            endPos[2] = end.Z;
    
            // Find Path
            nbPath = GetPathFinder(out startPos[0], out endPos[0], out locationOut[0], idContinent, gx, gy, canFly, useStraightPath);
    
    
            // List float to list Point
            locList = new List<Point>();
            locList.Add(start);
            for (int i = 0; i <= nbPath * 3 - 1; i++)
            {
              if (locationOut[i] != 0 || locationOut[i + 1] != 0)
              {
                locList.Add(new Point(locationOut[i], locationOut[i + 1], locationOut[i + 2]));
                i = i + 2;
              }
              else
                break;
            }
            locList.Add(end);
    
            // Clean Path
            for (int i = 0; i <= locList.Count - 1; i++)
            {
              if (locList.Count <= 1)
                break;
    
              int inext = i + 1;
              if (inext >= locList.Count - 1)
              {
                inext = 0;
              }
    
              if (locList[i].DistanceTo(locList[inext]) < 0.5f)
              {
                locList.RemoveAt(inext);
                i--;
              }
            }
    
            return locList;
          }
          catch
          {
            if (end.X != 0 || end.Y != 0 || end.Z != 0)
              locList.Add(end);
            return locList;
          }
        }
    
    
    public class Point
      {
        public float X;
        public float Y;
        public float Z;
    
        public Point()
        {
        }
    
        public Point(float x, float y, float z)
        {
          X = x;
          Y = y;
          Z = z;
        }
        public Point(Point point)
        {
          X = point.X;
          Y = point.Y;
          Z = point.Z;
        }
     }
    


    Voila la fonction qui utilise ma Dll C++ si sa peux vous aider.

     

    Merci pour votre réponse rapide.

    mercredi 3 novembre 2010 14:33
  • Bonjour,

     

    S’il s’agit d’une exception SEH, elle sera empaquetée dans une exception .NET et sera interceptée dans un bloc catch(Exception). Un code d’exception inconnu va générer seulement une exception de type SEHException.

     

    Si aucune exception n’est interceptée, utilisez un bloc de type

    catch

    {

    }

     

     

     

    Normalement, vous pouvez intercepter l’exception et continuer l’application s’il ne s’agit pas d’une exception définitive, qui cause la terminaison de l’exécution. Avec cette approche, quand-même, vous n’avez pas un message de l’exception pour l’analyser.

    Je vous recommande cet article sur le traitement des exceptions natives :

    http://msdn.microsoft.com/en-gb/bb264489.aspx

     

    Si vous avez la possibilité, implémentez la gestion des exceptions dans la dll et essayez de faire aussi un système de journalisation, pour mieux voir ce que se passe dans le code c++.

    Cordialement,

    Alex

    ________________

    Publiez un article sur MSDN !

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     


    Suivez MSDN sur Twitter 

    mercredi 3 novembre 2010 15:27
  • Merci pour ta réponse.

    Quand j'arrive a récupéré les erreurs j'ai soit:

    Une exception non gérée du type 'System.StackOverflowException' s'est produite dans Module inconnu.

    ou

    Accés violation a l'adresse ....

    Dé fois mon programme ce ferme tout seule sans aucune trace.

    Je vais regarder et voir ce que donne ta réponse.

    Le problème si je veux transformer ma dll en dll manager pour la gestion de Try cast sa risque d'être compliqué car j'utilise Detour&Recast http://code.google.com/p/recastnavigation/ qui est un projet important donc de rentre le code entièrement managé risque de me prendre pas mal de temps.

     

    jeudi 4 novembre 2010 14:03
  • Bonjour,

     

    Si l’exception dans le dll native est critique et n’est pas de type SEHException, je ne vois aucune autre solution que le deboggage du dll en cause pour en trouver plusieurs informations.

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur MSDN !

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     


    Suivez MSDN sur Twitter 

    • Marqué comme réponse Alex Petrescu lundi 8 novembre 2010 10:09
    vendredi 5 novembre 2010 12:58