IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Problème interopérabilité entre une DLL Delphi (NaviCon.dll) et Visual Studio Community 2015 C#


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Gamer
    Inscrit en
    Novembre 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Gamer

    Informations forums :
    Inscription : Novembre 2003
    Messages : 26
    Points : 13
    Points
    13
    Par défaut Problème interopérabilité entre une DLL Delphi (NaviCon.dll) et Visual Studio Community 2015 C#
    Bonjour tous.
    Je suis Zadmalck, mais on m'appelle Zad, je viens du monde GNU/Linux et je suis un passionné de vol à voile, en réel et en simulation avec le simulateur Condor Soaring sous Windows.
    Je me suis mis à Visual Studio Community 2015 en C#, il y a quelques jours. Je trouve cet environnement de développement For Mi Dable.

    Résumé de mon problème :
    Je n'arrive pas à me servir d'une DLL apparemment provenant de Delphi (J'ignore la version) en C#

    Ressources pour que vous puissiez avoir tout ce qu'il faut pour m'aider :
    http://zadmalckz.free.fr/annexe.zip : contient le fichier TRN et le fichier FPL
    http://zadmalckz.free.fr/Condor.zip : le code source de mon test avec Visual Studio Community 2015 en C#

    Explications :
    Le jeu Condor Soaring qui a été fait en Delphi (je ne sais pas quelle version) contient une DLL, NaviCon que l'on trouvera dans le dossier du projet dans un dossier Navicon. Cette DLL permet de faire la conversion des points écrans entre la scène ou l'on se trouve (Slovenia dans l'exemple) et la position en Latitude et longitude décimale des TPs du circuit de la course. Dans ce même dossier, un fichier FPL.pas issue d'une personne tierce qui a concu un programme en delphi qui utilise cette DLL NaviCon.dll et qui fonctionne.

    Nom : circuit-tp.png
Affichages : 249
Taille : 593,2 Ko

    Ce circuit est sous la forme d'un fichier FPL dans CondorSoaring. Vous trouverez ce fichier dans annexe.zip

    La scène Slovenia quant à elle contient un fichier TRN (Généré avec terragen) créé par le concepteur de la scène. Ce fichier se situe dans annexe.zip. Ce fichier est utilisé par la DLL navicon avec la méthode NaviConInit.
    Je ne connais pas la structure de ce fichier TRN et je n'ai pas besoin de la connaitre. A l'initialisation de la DLL NaviCon, on doit appeler la fonction NaviConInit avec en paramètre le chemin du fichier TRN.


    Pour le TP1, les coordonnées écrans dans la scène pour ce circuit sont :

    TPPosX1=180345.140625
    TPPosY1=91709.90625

    Le but de la DLL navicon.dll est de pouvoir convertir ces coordonnées écran 180345.140625 et 91709.90625 en latitude/longitude décimale. Ce qui me permettra ensuite en C# de tracer le circuit constitué des TPs Depart, TP1, TP2, Arrivee et de les mettre sur une carte de relief via la bibliothèque GMap.NET. On trouve les DLL référencées dans C# dans le répertoire GMap.NET dans Condor.zip

    Mon problème se situe à la ligne 90 :

    ok = NaviConInit(ref trn);

    La fonction renvoi toujours faux. trn étant la variable contenant le chemin du fichier TRN.

    Dans mon projet de test, j'affiche une boite d'alerte si NaviConInit est faux ( vrai si <> 0)
    Mon programme de test doit m'afficher sur la carte les TPs du circuit quand j'aurai avec votre aide résolu ce problème.

    Nom : condortestNav.png
Affichages : 267
Taille : 637,7 Ko


    Je vous remercie d'avance pour votre aide et peut-être à bientôt avec le simulateur de vol à voile Condor.

    Nom : vol.jpg
Affichages : 239
Taille : 147,5 Ko

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    salut

    c'est la signature de la fonction NaviConInit qui déconne

    Essaie plutôt ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     [DllImport(pathCondor + "\\" + "NaviCon.dll", CharSet = CharSet.Unicode,  ExactSpelling = true, CallingConvention = CallingConvention.StdCall, EntryPoint = "NaviConInit")]
            private static extern bool NaviConInit([MarshalAs(UnmanagedType.LPStr)] string TRNFile);
    et tu verras que ça doit beaucoup mieux marcher (ça a fonctionné chez moi)
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  3. #3
    Membre à l'essai
    Homme Profil pro
    Gamer
    Inscrit en
    Novembre 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Gamer

    Informations forums :
    Inscription : Novembre 2003
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par theMonz31 Voir le message
    salut

    c'est la signature de la fonction NaviConInit qui déconne

    Essaie plutôt ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     [DllImport(pathCondor + "\\" + "NaviCon.dll", CharSet = CharSet.Unicode,  ExactSpelling = true, CallingConvention = CallingConvention.StdCall, EntryPoint = "NaviConInit")]
            private static extern bool NaviConInit([MarshalAs(UnmanagedType.LPStr)] string TRNFile);
    et tu verras que ça doit beaucoup mieux marcher (ça a fonctionné chez moi)
    Trop génial. Mille milliard de merci. Cela fonctionne

    Juste par curiosité, comment t'es venu cette solution ? Tu as été soumis auparavant à un problème similaire ?

    Je regarde la suite de mon code et je mets résolu ensuite.


  4. #4
    Membre à l'essai
    Homme Profil pro
    Gamer
    Inscrit en
    Novembre 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Gamer

    Informations forums :
    Inscription : Novembre 2003
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Bon ben c'est nickel theMonz31. Encore grand merci.

    Il me reste une seule chose encore à résoudre, voici le nouveau circuit de test FPL et la modification des coordonnées de chaque porte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
                    // Depart
                    XX = 179624.734375; YY = 93566.6015625;
                    X = Convert.ToSingle(XX); Y = Convert.ToSingle(YY);
     
                    lat = XYToLat(X, Y);
                    lon = XYToLon(X, Y);
                    gmap.Position = new PointLatLng(lat, lon);
     
                    points.Add(new PointLatLng(lat, lon));
     
                    // TP1
                    XX = 778811.4375; YY = 76240.4765625;
                    X = Convert.ToSingle(XX); Y = Convert.ToSingle(YY);
                    lat = XYToLat(X, Y);
                    lon = XYToLon(X, Y);
                    points.Add(new PointLatLng(lat, lon));
     
                    // TP2
                    XX = 756184.875; YY = 73977.3828125;
                    X = Convert.ToSingle(XX); Y = Convert.ToSingle(YY);
                    lat = XYToLat(X, Y);
                    lon = XYToLon(X, Y);
                    points.Add(new PointLatLng(lat, lon));
     
                    // Arrivee
                    XX = 755017.125; YY = 71190.546875;
                    X = Convert.ToSingle(XX); Y = Convert.ToSingle(YY);
                    lat = XYToLat(X, Y);
                    lon = XYToLon(X, Y);
                    points.Add(new PointLatLng(lat, lon));
     
                    //GMapPolygon polygon = new GMapPolygon(points, "mypolygon");
                    GMapPolygon polygon = new GMapPolygon(points, "testpolygon");
                    polygon.Fill = new System.Drawing.SolidBrush(System.Drawing.Color.FromArgb(0, System.Drawing.Color.Red));
                    polygon.Stroke = new System.Drawing.Pen(System.Drawing.Color.Red, 1);
                    polyOverlay.Polygons.Add(polygon);
                    gmap.Overlays.Add(polyOverlay);
                    RefreshCarte();
    Et le fichier FPL correspondant
    Richi fly_CC.zip

    Comme tu peux le constater si tu recompiles avec cette modif de code et le FPL ci-joint modifié, j'ai une ligne qui rejoint le départ et l'arrivée sur le tracé sur la carte. Certainement du au fait que je trace un polygone et que celui-ci est fermé.

    Est t'il possible avec GMap.net de tracer simplement par les méthodes à disposition de simples lignes entre les points ?
    Ou bien de virer ou rendre transparent la ligne du polygone qui rejoint le départ et l'arrivée ?
    Je n'aurai pas alors ce problème.

  5. #5
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    Salut

    Alors pour répondre à ta première question : comment m'est venu l'idée..

    Simple... J'ai cherché sur google NaviConInit, j'ai trouvé quelques sites qui l'utilisaient et j'ai vu alors que la signature de la fonction était un PChar.

    J'ai alors chercher un truc du genre "C# Interop Delphi pchar"... pour finalement comprendre qu'il y avait une différence de gestion des chaines entre .Net et Delphi
    et que donc, il fallait surement passer un pointeur (d'ou le MArshall)...

    Ensuite, j'ai pu tester avec la solution que tu avais mise en pièce jointe pour valider mon idée !!!

    Pour GMap, je ne sais pas, je ne l'utilise pas beaucoup (même si je l'avais un peu plus regardé en détails il y a quelques années).
    Si tu veux de la transparence, tu dois pouvoir créer ton "Pen" en t'appuyant sur la méthode "Color.Argb()" (ou FromArgb) et ainsi indiqué la valeur de Alpha (la transparence).

    Ensuite, tu peux avoir plusieurs Overlays (gestion de calques) pour masquer, etc... ce que tu veux !
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  6. #6
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    et pour la ligne, j'ai trouvé ça :

    http://stackoverflow.com/questions/3...ne-in-gmap-net
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  7. #7
    Membre à l'essai
    Homme Profil pro
    Gamer
    Inscrit en
    Novembre 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Gamer

    Informations forums :
    Inscription : Novembre 2003
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par theMonz31 Voir le message
    et pour la ligne, j'ai trouvé ça :

    http://stackoverflow.com/questions/3...ne-in-gmap-net
    re salut.

    j'avais déjà regarder ce lien, mais le tracé suit la route. Ce n'est pas une ligne droite.
    Je vais chercher plutôt de ce coté là : "Ensuite, tu peux avoir plusieurs Overlays (gestion de calques) pour masquer, etc... ce que tu veux !"

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème cohérence entre une base fichier et sauvegarde
    Par jonsnow38 dans le forum Modélisation
    Réponses: 0
    Dernier message: 11/07/2011, 08h47
  2. Problème d'appel à une fonction de Shell32.dll sous win server 2008
    Par ludogoal dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 05/06/2009, 15h06
  3. Réponses: 3
    Dernier message: 16/06/2008, 15h23
  4. Utiliser une DLL sans le .LIB dans Visual Studio 2005
    Par lekernel dans le forum Visual C++
    Réponses: 5
    Dernier message: 02/08/2007, 08h54
  5. Conflit entre une fonction Delphi et une API ?
    Par [ZiP] dans le forum Delphi
    Réponses: 2
    Dernier message: 23/01/2007, 10h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo