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

Langage Delphi Discussion :

Alignement de bits entre programme Delphi et DLL C++


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Par défaut Alignement de bits entre programme Delphi et DLL C++
    Bonjour tout le monde,

    voilà mon soucis, j'ai une structure que je dois passer à une DLL en C++:

    côté Delphi :
    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
     
    ST_MESS_PARAMS_BUFFER = Packed record
        dw_length: DWORD;
        by_buffer: BYTE;
    end;
     
    ST_MESS_PARAMS = Packed record
      by_device_ID              : BYTE; // SU ID
      by_param_value            : BYTE; // RW data
      by_family_nb              : BYTE;  // family number
      aby_user_id               : TUserIdArray; // user ID on 4 BYTES
      dw_num_synchro            : DWORD; // synchronization number, for asynchrone call
      dw_index_nb               : DWORD; // index number of the parameter
      dw_SM100IP_ID             : DWORD; // SM100 ID
      e_state_resp              : E_RESP_STATE; // ERROR OR SUCCESS
      e_type_param              : E_TYPE_PARAM; // type parameter: BYTE, WORD, etc ...
      st_params_buffer: ST_MESS_PARAMS_BUFFER;
      case Integer of
    	0:
      (
        by_value                : BYTE;
      );
      1:
      (
    		w_value                 : WORD;
      );
      2:
      (
    		aby_value               : ARRAY[0..15] of BYTE // string
      );
    end;
    et du côté 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    #pragma pack(push, 1) 
    typedef struct stMessParamsBuffer
    {
    	unsigned long dw_length;
    	unsigned char by_buffer;
    } ST_MESS_PARAMS_BUFFER;
    #pragma pack(pop)
     
     
    #pragma pack(push, 1) 
    typedef struct stMessParams
    {		
    	unsigned char by_device_ID; // SU ID
    	unsigned char by_param_value; // RW data	
    	unsigned char by_family_nb; // 0 to 7	
    	unsigned char aby_user_id[USER_ID_HSL]; // user ID on 4 bytes	
    	unsigned long dw_num_synchro; // see information above	
    	unsigned long dw_index_nb; // index number of the parameter	
    	unsigned long dw_SM100IP_ID; // SM100 ID		
    	E_RESP_STATE e_state_resp;	
    	E_TYPE_PARAM e_type_param;
    	stMessParamsBuffer st_params_buffer;
    	union Value
    	{
    		unsigned char by_value;
    		unsigned short w_value;
    		unsigned char aby_value[16]; // string
    	} value;		
    } ST_MESS_PARAMS;
    #pragma pack(pop)
    Quand je passe ma structure par ma fonction,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SendParamsSettings(mess_params);
    , du côté C++ j'ai à chaque fois la bonne valeur pour l'enum E_RESP_STATE mais jamais pour E_TYPE_PARAM (il me sort un chiffre au lieu de mon enum).
    J'ai l'impression que ça coince lorsque j'utilise plusieurs enum dans un struct :s.

    Quelqu'un ai-t-il déjà tombé sur ce problème ?

    Merci et bonne journée !

  2. #2
    Membre Expert Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Par défaut
    Oui. Par défaut, Delphi va stocker un enum sur le plus petit type possible
    • de 1 à 8 éléments : Byte
    • de 9 à 16 éléments : Word
    • ...

    tu peux forcer ton type à être codé sur 4 octets, car c'est ce qu'attend une dll c++, avec la directive Z :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    {$Z4} //on force le stockage sur 4 octets
    type
      MonEnum = (me1, me2);

  3. #3
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Par défaut
    Et voilà ce qui me manquait, tu as sauvé ma journée merci guillemouze

  4. #4
    Membre Expert Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Par défaut
    Citation Envoyé par phoenixgreg Voir le message
    Et voilà ce qui me manquait, tu as sauvé ma journée merci guillemouze

    Un petit click sur et tout sera parfait

  5. #5
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Par défaut
    Auuuuutant pour moi ! Mais un modérateur s'en est chargé je pense

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

Discussions similaires

  1. DLL XE2 utilisée par un programme Delphi 5
    Par Papy214 dans le forum Langage
    Réponses: 15
    Dernier message: 11/07/2013, 11h28
  2. Programmes Delphi 32 bits fonctionnent en 64 bits ?
    Par Droïde Système7 dans le forum Débuter
    Réponses: 10
    Dernier message: 09/01/2009, 15h04
  3. passage de pointeurs entre appli delphi et DLL c++
    Par e-teo dans le forum Langage
    Réponses: 1
    Dernier message: 13/10/2005, 21h46
  4. Dll en c++ dans un programme delphi
    Par wikers dans le forum Langage
    Réponses: 2
    Dernier message: 04/08/2005, 15h39
  5. Question de pointeur entre un programme et une DLL
    Par Neilos dans le forum C++Builder
    Réponses: 12
    Dernier message: 01/02/2005, 19h12

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