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 :

C++ -> Delphi , Type Word : valeur erronée


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    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
    Points : 113
    Points
    113
    Par défaut C++ -> Delphi , Type Word : valeur erronée
    Bonjour tout le monde,

    J'ai des valeurs que me renvoi une DLL en C++ via un callback dans mon application en Delphi XE8, des valeurs de type Byte, Integer, et Word. Pas de soucis les valeurs sont celles attendues.

    Sauf que je dois passer cela en Delphi 2007, les valeurs de type Byte sont bonnes mais celles de type Word sont erronées.
    Il y a forcément entre delphi 2007 et XE.. une différence avec le type Word mais laquelle ? Dois-je passer par autre chose comme type ?

    Merci pour votre soutient et bonne journée !

    Greg

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    non le type Word reste sur 16bits, pas de changement de ce côté là
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre régulier
    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
    Points : 113
    Points
    113
    Par défaut
    Ok merci Paul, donc ça vient d'ailleurs, je pense que ma fonction callback est mal implémentée.

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    peut etre un probleme de cdecl ou stdcall, mais tu aurai aussi eu le problème avant théoriquement ...

  5. #5
    Membre régulier
    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
    Points : 113
    Points
    113
    Par défaut
    nan ça doit être autre chose, comme dit les valeurs de type Word sont bien retournées sous Delphi XE8 mais sous Delphi 2007 elles ne le sont pas, ça ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    stTMessGeneric = Packed record
        by_sop_address: byte;
        dw_e_equ_type: word;
        dw_e_type_msg: word;
        aby_mid:Array[0..5] of byte;
        dw_num_synch: word;
    end;
    La valeur pour by_sop_address est bonne (Byte) mais les autres dw_e_equ_type, dw_e_type_msg, dw_num_synch (Word) me donnes des valeurs incohérentes..
    Pourtant du côté Visual Studio (là où est développée ma dll en C++), quand je joue avec mes petits breakpoints, les valeurs sont pourtant bonnes.
    Logiquement ça vient du côté de Delphi 2007 !

    Greg

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 745
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 745
    Points : 13 306
    Points
    13 306
    Par défaut
    Et tu es sûr que ces données sont compactées (packed) et non alignées ?
    Si aligné, le premier byte sera juste (little-endian) mais le reste décalé de N bytes (1 ou 3).

  7. #7
    Membre régulier
    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
    Points : 113
    Points
    113
    Par défaut
    oui normalement, le mot clé "packed" est bien déclaré et j'ai même mis {$ALIGN OFF} avant mon record pour être sûr.

  8. #8
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 745
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 745
    Points : 13 306
    Points
    13 306
    Par défaut
    Ça c'est de ton côté mais que renvoit la DLL ?

    Pour essai, ajoute des information bidons pour aligner sur un mot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    stTMessGeneric = Packed record
        by_sop_address: byte;
        Dummy :byte;
        dw_e_equ_type: word;
        dw_e_type_msg: word;
        aby_mid:Array[0..5] of byte;
        dw_num_synch: word;
    end;

  9. #9
    Membre régulier
    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
    Points : 113
    Points
    113
    Par défaut
    Ah on se rapproche ! Il faut que je regarde en effet du côté C++ si les bytes sont bien compactées.
    J'ai rajouté Dummy en effet, maintenant les valeurs suivantes dw_e_equ_type, dw_e_type_msg de type word sont bonnes.
    Donc il y a quelque chose à faire du côté C++.

    Merci Andnotor

  10. #10
    Membre régulier
    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
    Points : 113
    Points
    113
    Par défaut
    Et bien voilà ce n'était pas du côté Delphi mais côté C++, j'ai rajouté la directive #pragma pack(push, 1) qui permet de ne pas ajouter de padding :
    #pragma pack(push[,n]) pushes the current alignment setting on an internal stack and then optionally sets the new alignment.
    et à la fin du struct #pragma pack(pop) revient à la version d'alignement précédente :
    #pragma pack(pop) restores the alignment setting to the one saved at the top of the internal stack (and removes that stack entry)
    Voilà merci à vous !

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    J'ai eu un problème ressemblant une fois, je ne pense pas que ca change quelque chose dans ton cas, mais ca pourra peut etre t'aider plus tard, ou pour d'autres.
    Dans mon cas, c'était à cause d'un enum, qui n'a pas la même taille en Delphi et en C++.
    Si ta fonction contient un enum, du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TPenStyle = (psSolid, psDot, psDashDot);
    procedure GetPenStyle(Handle: THandle; var ps: TPenStyle; xxx: integer); stdcall; external 'maDllCpp.dll';
    tu aura le même décalage car l'enum est codé sur un byte en Delphi, 4 en C++. Il faut donc forcer l'enum à être sur 4 octets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    {$Z4}
    TPenStyle = (psSolid, psDot, psDashDot);
    {$Z1}
    (je crois qu'il y a aussi $Z+ zr $Z-, mais j'en suis plus sur)

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

Discussions similaires

  1. renvoie une valeur erronée
    Par m@thieu dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 09/12/2004, 17h09
  2. [delphi 7 / DOA] valeur null dans setvariable
    Par delphim dans le forum Bases de données
    Réponses: 1
    Dernier message: 05/11/2004, 10h14
  3. [Delphi] Type de fichier DBISAM
    Par Henkyl dans le forum Bases de données
    Réponses: 2
    Dernier message: 27/04/2004, 17h14
  4. [Base de Registre] Nouveaux type de valeur !?
    Par Lung dans le forum Langage
    Réponses: 4
    Dernier message: 07/04/2004, 10h22
  5. [Delphi 6] EditBox -> valeurs numériques ?
    Par JBrek dans le forum Composants VCL
    Réponses: 9
    Dernier message: 02/12/2002, 13h08

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