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 :

Resultat incohérent Dll C++ programme C#


Sujet :

C++/CLI

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Resultat incohérent Dll C++ programme C#
    Je fais un programme d'interface qui doit gérer à terme un programme central en c++. Pour ce faire je fais une interface graphique en c# et une dll C++ que j'importe.

    Après lecture du tutorial sur l'interroperabilité j'ai utilisé la p/invoke ainsi:
    code de la dll:

    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
     
    .h
     
    typedef struct DATAS
    {
    	int * tabINT;
    	int * tabBOOL;
    	wchar_t **tabCHAR;
    }t_COMPUTDATA; 
     
     
     
    .cpp
     t_COMPUTDATA *getStructureDataTest()
     {
    	 t_COMPUTDATA *data = new t_COMPUTDATA;
     
    		data->tabINT= new int[size_set_datas];
    		data->tabBOOL= new int[size_set_commands];
    		data->tabCHAR= new char*[size_set_errors];
     
    		data->tabINT[0] = 12;
    		data->tabINT[1] = 13;
    		data->tabINT[2] = 222;
     
    		data->tabBOOL[0]=0;
    		data->tabBOOL[1]=1;
    		data->tabBOOL[2]=0;
     
    		data->tabCHAR[0]="Les sanglots longs de l'automne bercent mon coeur d'une langueur monotone";
     
    		return(data);
     }

    dans le programme en c#
    dans class FData:

    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
       [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = (int)DATA.SIZE_SET_DATAS)]
            public Int32[] tabINT;
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = (int)COMMAND.SIZE_SET_COMMANDS)]
            public Int32[] tabBOOL;
     
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)ERROR.SIZE_SET_ERRORS)]
            public IntPtr[] tabCHAR;
     
            public FData()
            {
                tabINT = new Int32[(int)DATA.SIZE_SET_DATAS];
                tabBOOL = new Int32[(int)COMMAND.SIZE_SET_COMMANDS];
                tabCHAR = new IntPtr[(int)ERROR.SIZE_SET_ERRORS];
            }
     
    la fonction d'affichage:
     public void sreenFDatas()
            {
                Console.WriteLine("FData");
     
                Console.WriteLine("FData.tabINT");
                Console.WriteLine(tabINT[0]);
                Console.WriteLine(tabINT[1]);
                Console.WriteLine(tabINT[2]);
     
                Console.WriteLine("FData.tabBOOL");
                Console.WriteLine(tabBOOL[0]);
                Console.WriteLine(tabBOOL[1]);
                Console.WriteLine(tabBOOL[2]);
     
                Console.WriteLine("FData.tabCHAR");
                Console.WriteLine(tabCHAR[0]);
     
     
            }
     
    l'appel dans la winform
     
                fData = new FData();
                IntPtr DataT = getStructureDataTest();
                Marshal.PtrToStructure(DataT, fData);



    Ce que j'obtient sur la console

    FData.tabINT
    59338008
    59338032
    59338052
    FData.tabBOOL
    196611
    524697
    13
    FData.tabCHAR
    222

    Quelqu'un a une idée pour comprendre ce qui se passe? (conversion foireuse? écriture décalée de la mémoire? dois je remplacer les int32 par des int par exmple?). Merci d'avance!

  2. #2
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Les tabMachin sont donc des pointeurs vers des tableaux ... bon en supposant que côté c++ ce soit correct (j'ai un doute mais bon), il y a toujours un nombre fixe d'éléments ? car de toute façon côté C# tu devra savoir exactement le nombre d'éléments qu'il y a pour pouvoir "parser" les différentes valeurs ...

    Citation Envoyé par vings Voir le message
    Les sanglots longs de l'automne bercent mon coeur d'une langueur monotone
    wow

  3. #3
    Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par smyley Voir le message
    Les tabMachin sont donc des pointeurs vers des tableaux ... bon en supposant que côté c++ ce soit correct (j'ai un doute mais bon), il y a toujours un nombre fixe d'éléments ? car de toute façon côté C# tu devra savoir exactement le nombre d'éléments qu'il y a pour pouvoir "parser" les différentes valeurs ...


    wow

    C'est bon j'ai résolu mon problème en employant des Marshal.Copy pour chaque champ de la structure fData.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Pour l'explication, on ne peut utiliser UnmanagedType.ByValArray que si le tableau est statique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct DATAS
    {
    	int tabINT[MAX_SIZE];
    	//...
    }t_COMPUTDATA;
    Étant donné que ton tableau est dynamique, tu obtiens des valeurs absurdes coté C#.

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

Discussions similaires

  1. creer une dll pour programme etranger
    Par lez-j dans le forum C++
    Réponses: 1
    Dernier message: 28/02/2010, 07h41
  2. [Seven][64Bit] Acces Dll depuis programme 32 Bit ?
    Par boulbi dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 17/02/2010, 12h05
  3. Resultat incohérent requete JPQL
    Par mickael.guilbert dans le forum JPA
    Réponses: 1
    Dernier message: 03/07/2009, 11h15
  4. resultat incohérent sur un if
    Par oliver75 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/07/2007, 15h08
  5. Réponses: 3
    Dernier message: 31/08/2006, 16h11

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