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 :

Passage d'une adresse en c# vers une fonction C++


Sujet :

C++/CLI

  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Passage d'une adresse en c# vers une fonction C++
    Bonjour,

    J'ai un projet C++ (C++ ou C je sais pas) qui a une fonction que j'ai besoin d'appeler depuis mon projet C#. Voilà l'en-tête de la fonction en question :

    int LocateDataMatrix(int Width, int Height, unsigned char* SrcBitmap, int MinSize)

    Pour le moment j'ai fait un projet "propre" en C++ MFC depuis visual studio (Wrapper) qui fait appel à la fonctions que j'ai besoin. De cette manière j'ai une .DLL (avec le projet de base, j'avais uniquement un .LIB).

    J'utilise cette DLL depuis mon projet C# à l'aide de la fonction DLLImport :


    [DllImport("DataMatrixWrapper.dll")]
    unsafe static extern int w_LocateDataMatrix(int Width, int Height, byte[] SrcBitmap, int MinSize);


    Les paramètres sont :

    int Width : Largeur de l'image en int

    int Height : Hauteur de l'image en int

    unsigned char* SrcBitmap : Adresse de pointeur vers un tableau de byte (ce tableau de byte correspond à une image convertie en niveaux de gris puis mise dans un tableau sous forme de bytes)

    int MinSize : Taille fixe de 54

    Lorsque l'on appelle cette fonction depuis c#, nous avons la valeur 2 qui nous est toujours retournée, elle correspond à un code d'erreur. Comme à ce moment on est entré dans le fonction, le problème ne peut pas se situer dans la communication entre les 2 languages. La fonction C++ marche depuis une autre applic C++, donc la fonction est correcte de toute facon.

    Le seul problème possible peut venir du passage de paramètre :
    La largeur et la hauteur de l'image ne peuvent être faux. Le seul problème peut venir de SrcBitmap qui veut un unsigned char* en c++. D'après le créateur du projet C++, il faudrait envoyer une adresse mémoire qui pointe sur le tableau de byte de l'image. Et comme il n'y a pas de pointeur en C# c'est la que se situe le problème : Si on a un tableau de byte, comment connaitre son adresse mémoire ?

    Merci d'avance pour votre aide

  2. #2
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    Hello,

    pas de pointeurs en C# ?
    T'as essayé l'opérateur * à tout hasard. Essaye, tu vas être surpris.

    Bye.

  3. #3
    Candidat au Club
    Inscrit en
    Septembre 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Pilloutou
    Hello,

    pas de pointeurs en C# ?
    T'as essayé l'opérateur * à tout hasard. Essaye, tu vas être surpris.

    Bye.
    Il faut à ce moment que j'utilise du code unsafe, je dois convertir toutes mes fonctions dont j'ai besoin en code unsafe, c'est ça ?

    J'avais déjà essayé, mais dans mon code j'ai un buffer MemoryStream et il n'acceptait pas de le convertir en unsafe par exemple.

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    t'as essayé en faisant un wrapper en c++/cli ?

  5. #5
    Candidat au Club
    Inscrit en
    Septembre 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par nico-pyright(c)
    t'as essayé en faisant un wrapper en c++/cli ?
    Quel est la différence ?

    Si j'ai un message d'erreur (2) qui vient de la classe c++, c'est que la communication entre les 2 classes se fait non ?

  6. #6
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    je n'ai pas vraiment compris ce que tu faisais, mais je pense qu'il est plus simple d'effectuer une conversion s'il y a besoin, ou du marshalling s'il y a aussi besoin, à l'interieur d'une classe en c++/cli

  7. #7
    Candidat au Club
    Inscrit en
    Septembre 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par nico-pyright(c)
    je n'ai pas vraiment compris ce que tu faisais, mais je pense qu'il est plus simple d'effectuer une conversion s'il y a besoin, ou du marshalling s'il y a aussi besoin, à l'interieur d'une classe en c++/cli
    On vient de me dire que je devais laisser tombé ce projet donc c'est bon

    J'avais déjà fait le marshalling, mais ma question était de savoir en gros comment avoir l'adresse d'un tableau de char en c#. J'ai réussi à le faire grace au code unsafe et quelques magouilles, mais le paramètre que j'envoie est toujours pas correct, mais c'est pas grave comme je dois pas continuer dans ce projet.

    Merci quand même !

  8. #8
    ARB
    ARB est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 12
    Points : 11
    Points
    11
    Par défaut A ce propos.
    Citation Envoyé par nico-pyright(c)
    t'as essayé en faisant un wrapper en c++/cli ?
    Bonjour,
    Par l'intermédiaire d'un wrapper c++/cli, je peux faire passer des tableaux à 1 dimension (pin_ptr<int>...), mais existe-t-il un moyen pour passer un tableau à 2 dimensions ?
    Merci.

  9. #9
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    oui, tu peux utiliser Marshall::Copy

  10. #10
    ARB
    ARB est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 12
    Points : 11
    Points
    11
    Par défaut ???
    Pourrais-tu être un peu plus explicite
    Comment utiliser Marshall::Copy dans le cadre C++/cli ?
    Un petit lien ou un exemple seraient les bien venus.
    Je sais, j'abuse, mais malgré ma bonne volonté, je ne suis pas très bon ( et je débarque de BuilderC++ dans ce nouveau monde plein de mystères)
    Merci.

  11. #11
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075

  12. #12
    ARB
    ARB est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 12
    Points : 11
    Points
    11
    Par défaut Courage, contournons l'obstacle !
    Merci pour cette réponse rapide.
    Je viens de jeter un coup d'oeil sur le lien : je ne vois traités que des tableaux à une dimension.
    Je vais donc botter en touche, et passer ma matrice (A,B) par un tableau à une dimension (A*B) et la reconstituer dans la dll en C++ natif.
    Pour le fun, si tu vois une autre solution... Sinon, je considère cette question comme résolue (du moins je l'espère).

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/08/2014, 19h14
  2. Réponses: 14
    Dernier message: 23/04/2012, 22h32
  3. Passage d'une adresse en c# vers une fonction C++
    Par Nico_stras dans le forum C++/CLI
    Réponses: 2
    Dernier message: 09/01/2007, 19h51
  4. [Frames] un lien vers une page de Frames vers une page sans
    Par jamesleouf dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 23/09/2005, 18h25
  5. Redirection d'un site vers une adresse dans UNE NEW FENETRE
    Par Mout85 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 20/06/2005, 09h40

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