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++/CLI Discussion :

Int�rop�rabilit� C++/CLI avec VB.net


Sujet :

C++/CLI

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    8
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 8
    Par d�faut Int�rop�rabilit� C++/CLI avec VB.net
    Bonjour,
    Je suis nouveau en C++, bien que j'ai un peu potass� le tuto du site des z�ro.
    Je pr�cise que mon travail doit �tre r�alis� sous Visual Studio Community 2015.
    J'ai a r�aliser une DLL qui utilisera des fonctions d'OpenCV qui est je ne crois pas me tromper en C++ natif.
    Le but de cette application est de calculer les axes des spores de champignons sur photo d'apr�s :
    - un objet BITMAP qui est l'image de d�part
    - les coordonn�es du curseur � l'endroit o� l'on a cliqu�
    je dois m'occupper du calcul des axes mais c'est dans la partie wrapper que j'aurais besoin d'aide.
    Si vous voulez le code VB fonctionnant est :
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    Imports System.Drawing
     
    ''' <summary>
    ''' Définition des deux axes de la spore
    ''' </summary>
    Public Class DEUXAXESCPP
        Public axe1() As Tuple(Of Double, Double)
        Public axe2() As Tuple(Of Double, Double)
    End Class
     
     
     
    Public Class Spore
     
        '-------------------------------------------------------------
        ' DLL en VB.Net
        ' Simule une DLL en C++.
        ' Le C++ ne possède pas de classe PointF compatible avec .NET
        ' On remplace le PointF par un Tuple de double
        ' Un axe possède deux points donc deux Tuples
        '
        '-------------------------------------------------------------
     
     
        ''' <summary>
        ''' Facteur d'échelle
        ''' </summary>
        Public Shared Property Echelle As Double = 1.0
     
     
        ''' <summary>
        ''' Simulation de la DLL de reconnaissance de forme
        ''' </summary>
        ''' <param name="Org">PointF : Point origine à l'intérieur de la spore</param>
        ''' <param name="Img">Image contenant une ou plusieurs spores</param>
        ''' <returns></returns>
        Public Shared Function GetAxes(ByVal Org As PointF, ByVal Img As Bitmap) As DEUXAXESCPP
            Dim Valeur As New DEUXAXESCPP
     
            ' Grand axe 
            ' ici on définit arbitrairement un axe horizontal de +/- 50 pixels / origine
            Valeur.axe1 = {New Tuple(Of Double, Double)(Org.X - 50, Org.Y), New Tuple(Of Double, Double)(Org.X + 50, Org.Y)}
            ' Petit axe perpendiculaire
            ' ici on définit arbitrairement un axe vertical de +/- 20 pixels / origine
            Valeur.axe2 = {New Tuple(Of Double, Double)(Org.X, Org.Y - 20), New Tuple(Of Double, Double)(Org.X, Org.Y + 20)}
     
            Return Valeur
        End Function
     
    End Class
    Apr�s je dois remplacer ce code bidon (pour les tests) par deux fichiers : l'un en C++ natif qui fera le travail de reconnaissance de formes (ma DLL), l'autre en C++/CLI un wrapper avec une application VB.net.
    J'ai lu plusieurs tutoriels sur Internet mais je n'y arrive pas tout seul.
    Voici mes codes pour l'instant :
    le code "bidon" = temporaire de test en C++ natif
    GestSporesNatif.h
    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
    #pragma once
    class Spore {
    public:
     
    	//-------------------------------------------------
    	//---- Fonction d'analyse d'image en C++ natif ----
    	//-------------------------------------------------
    	//     Img : Image à analyser
    	//    x, y : Coordonnées du point d'analyse sur l'image
    	double* ChercheAxes(BITMAP Img, double x, double y)
    	{
    		double*** res;
    		res[0] = new double*[2];
    		res[1] = new double*[2];
    		res[0][0] = new double[2];
    		res[0][1] = new double[2];
    		res[1][0] = new double[2];
    		res[1][1] = new double[2];
    		res[0][0][0] = x - 50;
    		res[0][0][1] = y;
    		res[0][1][0] = x + 50;
    		res[0][1][1] = y;
    		res[1][0][0] = x;
    		res[1][0][1] = y-20;
    		res[1][1][0] = x;
    		res[1][1][1] = y+20;
     
    		return (double*) res;
    	}
     
    };
    GetSporesNatif.cpp
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    // GetSporesNatif.cpp*: définit les fonctions exportées pour l'application DLL.
    //
     
    #include "stdafx.h"
    #include "GetSporesNatif.h"
    le code en C++/CLI de mon wrapper qui ne fonctionne pas :
    Wrapper.h
    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
    // ClassLibrary1.h
     
    #pragma once
    #include "../GetSporesNatif/GetSporesNatif.h"
    using namespace System;
    using namespace System::Collections::Generic;
    using namespace System::Drawing;
    namespace Wrapper {
     
    	public ref class DEUXAXESCPP
    	{
    	public:
    		DEUXAXESCPP(void) {};
    		property IList<Tuple<Double, Double>^>^ axe1;
    		property IList<Tuple<Double, Double>^>^ axe2;
    	};
     
    }
    Wrapper.cpp
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #include "stdafx.h"
     
    #include "wrapper.h"
     
    #include <vcclr.h>
     
    namespace Wrapper {
     
    	public ref class Spore
    	{
     
    	public:
    		static property Double Echelle;
    		static DEUXAXESCPP^ GetAxes(Bitmap^ Img, Double x, Double y);
     
    	};
     
    	public ref class Wrapper {
     
    	public:
    		Wrapper();
     
    		~Wrapper();
    		Wrapper()
    		{
     
    			spore = new Spore();
     
    		}
     
     
     
    		~Wrapper()
     
    		{
     
    			delete spore;
     
    		};
    		DEUXAXESCPP^ GetAxes(Bitmap^ Img, Double x, Double y)
    		{
    			DEUXAXESCPP^ Valeur = gcnew(DEUXAXESCPP);
    			spore.GetAxes(Img, x, y);
     
     
    			return Valeur;
    		}
    	private:
     
    		Spore spore;
    	};
    };
    Merci de votre aide.
    Bien cordialement.

  2. #2
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    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
    	double* ChercheAxes(BITMAP Img, double x, double y)
    	{
    		double*** res;
    		res[0] = new double*[2];
    		res[1] = new double*[2];
    		res[0][0] = new double[2];
    		res[0][1] = new double[2];
    		res[1][0] = new double[2];
    		res[1][1] = new double[2];
    		res[0][0][0] = x - 50;
    		res[0][0][1] = y;
    		res[0][1][0] = x + 50;
    		res[0][1][1] = y;
    		res[1][0][0] = x;
    		res[1][0][1] = y-20;
    		res[1][1][0] = x;
    		res[1][1][1] = y+20;
     
    		return (double*) res;
    	}
    ;
    What.

    que...

    je ne m�me...





    PS: Tu ne devrais pas avoir � d�finir DEUXAXESCPP dans les deux langages. Surtout que tu sembles h�siter entre faire de axe1 et axe2 des champs ou des propri�t�s...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 504
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 504
    Par d�faut
    Je suis nouveau en C++, bien que j'ai un peu potass� le tuto du site des z�ro.
    Bin, t'es bon pour tout r�apprendre correctement, ce tuto est l'un des plus mauvais qui m'�t� donn� de survoler.
    Le forum du m�me site regorge d'explication sur ce fait que ce tuto est horrible et de lien vers un cours de C++ Moderne.

    Faire un wrapper entre 2 technologies implique une connaissance assez pouss�e dans ces 2 technologies, et l�, vous �tes clairement pas encore au niveau, ni dans l'une ni dans l'autre.

    Toutes les remarques de @M�dinoc sont plus que pertinentes.

    Vous ne devriez pas avoir un seul pointeur nu dans votre code natif (alors de code � base de ***, m�me pas dans un cauchemar de l'apocalypse).
    Regardez du cot� des pointeurs intelligents.
    OpenCV a une API en C, c'est � vous de faire un wrapper (1 de plus ) C/C++.

    On instance une classe manag�e (.NET, "ref") avec gcnew et on appelle jamais directement delete, ni en manag� ni en natif (gr�ce aux pointeurs intelligents).

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    8
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 8
    Par d�faut merci de vos remarques
    Bonjour,
    Donc je sens que l'op�ration va �tre compliqu�e donc si je comprends bien il me faut ma�triser :
    - le C (l� j'ai quelques connaissances)
    - le C++ natif (l� pas grand chose � vrai dire)
    - le C++/CLI (l� rien)
    - le VB.NET (l� rien)
    - savoir cr�er un wrapper entre le C et le C++ natif (l� rien)
    - savoir cr�er un wrapper entre le C++ natif et le VB.NET (l� rien)
    �a fait beaucoup !!
    l'application VB.NET ce n'est pas moi qui l'ai cod�
    je dois cr�er une DLL en C++ avec OpenCV (car d'apr�s leur site ils supportent bien le C++ natif)
    et le point noir c'est de cr�er un "pont" entre cette DLL et l'interface de l'application VB.NET.
    M�me si c'est une t�che ardue, auriez-vous quelques lectures du plus simple au plus compliqu� pour m'aider � progresser ?
    Merci de votre aide.

  5. #5
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 504
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 504
    Par d�faut
    Bon, apr�s une petite balade avec Google, l'API officielle d'OpenCV, c'est du C++ et pas su C, un wrapping de moins.
    Si vous maitrisez le C++/CLI vous n'aurez pas besoin de connaitre le VB.NET, vous aurez le m�me "vocabulaire" que les d�veloppeurs VB.NET (et tout autre langage .NET).

    Mais le fait de connaitre le C avant le C++ est un gros inconv�nient, car beaucoup de pratique du C ne sont pas les bonnes en C++.

    En C++ moderne, on n'utilise quasiment jamais de pointeurs nus (les pointeurs � la C) mais quasi-exclusivement des pointeurs intelligents.

    Je vous conseille donc d'apprendre le C++ moderne (C++11/14) donc n'utilisez ni de vieux bouquin ni des trucs qui demande � connaitre le C avant le C++.

    Pour faire du C++/CLI, il faut connaitre avant le C++, de pr�f�rence moderne.

    Si l'API d'OpenCV est assez bien con�ue / simple (pas de pointeur en param�tre, par de fonction de callback, etc...) vous n'aurez qu'� cr�er des classe manag�es (ref class) donc visible par le code VB.NET qui seront du copier-coller des classes OpenCV au niveau de l'API (m�thodes) et qui ne feront que passe-plats entre le code VB et OpenCV.

    Attention � ne pas n�gliger l'apprentissage d'une biblioth�que comme OpenCV, qui peut �tre bien plus long que le C++ lui-m�me.

  6. #6
    Expert confirm�
    Avatar de Mat.M
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 537
    D�tails du profil
    Informations personnelles :
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 537
    Par d�faut
    Donc je sens que l'op�ration va �tre compliqu�e donc si je comprends bien il me faut ma�triser :
    comme M�dinoc le sugg�re je crois que revoir les allocations m�moires �a s'impose vraiment

    sinon si tu ne veux pas te casser la t�te avec des tableaux statiques il vaut mieux utiliser les conteneurs du C++ et de la STL comme std::list,std::vector...� toi de voir celui qui est le plus adapt�.
    C'est pas si compliqu� que �a � utiliser et �a simplifie le code

Discussions similaires

  1. [VB.NET] Formulaire word a remplir avec vb.net
    Par Monster77 dans le forum Windows Forms
    R�ponses: 15
    Dernier message: 16/08/2011, 14h22
  2. R�ponses: 3
    Dernier message: 08/04/2004, 13h40

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