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

Windows Forms Discussion :

Passage de Paramètres avec DLL C++


Sujet :

Windows Forms

  1. #1
    Membre régulier
    Profil pro
    Ingénieur de développement
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur de développement

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Points : 96
    Points
    96
    Par défaut Passage de Paramètres avec DLL C++
    Oyé à tous


    Je dois utiliser une fonction C++ présente dans une DLL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [DllImport("DLLUtil.dll")]
    public static extern Int32 ReconstructImage(tagReconstructImage Param);

    Cette fonction reçoit en paramètre une structure "tagReconstructImage". Cette structure contient elle-même un pointeur sur un tableau (dynamique) contenant d'autres structures ("tagRoi").



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    typedef struct 
    {
        long X;
        long Y;
        long Largeur;
        long Hauteur;	
    }tagRoi;
     
    typedef struct 
    {
        long NbBuffers;
        tagRoi* pRoi; 
    }tagReconstructImage;

    Voici mes déclarations de structure en C# :


    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
    public const Int32 NBMX_CAMERAS = 5;
     
    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct tagRoi
    {
        public Int32 X;
        public Int32 Y;
        public Int32 Largeur;
        public Int32 Hauteur;
    }
     
    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct tagReconstructImage
    {
        /// <summary>Nombre de buffer</summary>    
         public Int32 NbBuffers;
         /// <summary>Zone de travail sur les images</summary>
         public tagRoi[] pRoi;  
    }
     
    [DllImport("DLLUtil.dll")]
    public static extern Int32 ReconstructImage(tagReconstructImage Param);

    Je suis pas sûr du tout du : public tagRoi[] pRoi;
    pour le faire correspondre à tagRoi* pRoi;
    (C'est même là qu'est mon problème !!)


    Voici mon code pour appeler la fonction C++


    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
    //--- Paramètres de reconstruction
    tagReconstructImage paramReconstruct = new tagReconstructImage();
    paramReconstruct.pRoi = new tagRoi[NBMX_CAMERAS];
    paramReconstruct.NbBuffers = NBMX_CAMERAS;
    //-
    for (Int32 IdxCamera = 0; IdxCamera < NBMX_CAMERAS; IdxCamera++)
    {
        paramReconstruct.pRoi[IdxCamera] = new tagRoi();
        paramReconstruct.pRoi[IdxCamera].X = 10 + IdxCamera;
        paramReconstruct.pRoi[IdxCamera].Y = 20 + IdxCamera;
        paramReconstruct.pRoi[IdxCamera].Largeur = 30 + IdxCamera;
        paramReconstruct.pRoi[IdxCamera].Hauteur = 40 + IdxCamera;
    }
     
    //- Reconstruction Image
    Int32 Retour = ReconstructImage(paramReconstruct);

    A l'appel de la fonction, il y a une execption qui est levée :
    Paramètre incorrect. (Exception de HRESULT : 0x80070057 (E_INVALIDARG))

    Pourtant, coté C#, quand on la visualise avec le débogeur, tout est OK (tout est alloué et affecté). C'est vraiment lors de passage à la fonction C++.


    Qqun a t il une idée ?

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Bonjour,

    Je ne suis pas sur que le marshalling de tableau sur des objet non primitif fonctionne.
    Du coup tu devrais essayer en unsafe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    [StructLayout(LayoutKind.Sequential)]
    public unsafe struct tagReconstructImage
    {
        /// <summary>Nombre de buffer</summary>    
         public Int32 NbBuffers;
         /// <summary>Zone de travail sur les images</summary>
         public tagRoi* pRoi;  
    }
    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
     
    tagReconstructImage paramReconstruct = new tagReconstructImage();
    tagRoi[] pRoi = new tagRoi[NBMX_CAMERAS];
    paramReconstruct.NbBuffers = NBMX_CAMERAS;
    //-
    for (Int32 IdxCamera = 0; IdxCamera < NBMX_CAMERAS; IdxCamera++)
    {
        pRoi[IdxCamera] = new tagRoi();
        pRoi[IdxCamera].X = 10 + IdxCamera;
        pRoi[IdxCamera].Y = 20 + IdxCamera;
        pRoi[IdxCamera].Largeur = 30 + IdxCamera;
        pRoi[IdxCamera].Hauteur = 40 + IdxCamera;
    }
    Int32 Retour;
    unsafe
    {
        fixed (tagRoi* tmp = &pRoi)
        {
            paramReconstruct.pRoi = tmp;
            Retour = ReconstructImage(paramReconstruct);
        }
    }
    PS: Tu ne devrais pas spécifie de "Pack" s'il n'y en a pas en C++

Discussions similaires

  1. Pb de passage de paramètre avec une dll
    Par fcrd03 dans le forum LabVIEW
    Réponses: 3
    Dernier message: 23/07/2011, 12h05
  2. Passage de paramètres avec Redirect
    Par abir84 dans le forum Ruby on Rails
    Réponses: 4
    Dernier message: 24/09/2007, 10h51
  3. Passage de paramètres avec DLL Delphi
    Par GroovyBaby dans le forum C#
    Réponses: 2
    Dernier message: 08/03/2007, 14h51
  4. Réponses: 5
    Dernier message: 01/03/2007, 17h19
  5. Passage de paramètre avec POST
    Par boulette85 dans le forum Langage
    Réponses: 4
    Dernier message: 28/02/2007, 20h59

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