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 :

Conversion type C vers Delphi


Sujet :

Langage Delphi

  1. #1
    Membre actif
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 416
    Points : 299
    Points
    299
    Par défaut Conversion type C vers Delphi
    Bonjour,

    Je cherche à utiliser un type déclaré en C, à partir d'une doc pour une DLL, mais je pêche depuis un bon moment,
    pour mettre ça sous Delphi XE7.
    Y aurait il un ame avertie qui pourrait m'aider là dessus:
    C'est bien sur le union {...} qui me pose problème

    Code c++ : 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
    typedef struct {
     
     
        int             iSize;
        int             iVersion;
        int             iRet;
        DWORD           dwNotifyType;
        DWORD           dwTimeout;
        union {
            LPHANDLE        lphNotifyEvent;
            HWND            hNotifyWnd;
        } uNotifyHandle;
        HWND            hProgressWnd;
        WORD            wErrorEject;
        BYTE            bBuzzerHz[MF_BUZZER_TYPE_MAX];
        BYTE            bBuzzerCount[MF_BUZZER_TYPE_MAX];
        BYTE            bUseNVMemory;
        char            cPortName[256];
        WORD            wSuccessEject;
    } ABASE, *LP_ABASE;

    Merci
    “La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer.” Antoine de Saint-Exupéry.

    D1..D7-2005,2006-Xe2 Ent-XE7 archi-MsSql 2005..2008 & R2, FB 1.5..2.5.x.x -Win10,Win7/64-Xp-
    _____________________________________________________

  2. #2
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 381
    Points : 2 995
    Points
    2 995
    Par défaut
    J'avais entendu parler de http://rvelthuis.de/programs/convertpack.html
    mais je n'ai pas testé.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 627
    Points : 10 551
    Points
    10 551
    Par défaut
    Tu t'en fiches de l'union

    Parce qu'il sert à regrouper dans un espace (du type le plus long) plusieurs types.
    Donc:
    • Soit tu crées 2 variables
    • Soit tu crées 1 seule variable de type long (parce qu'il me semble que HWND c'est un unsigned long) qui aura une double signification (mais 1 seule à la fois)

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 266
    Points : 4 810
    Points
    4 810
    Par défaut
    Bonsoir

    L'union en C est repris en tant que partie variable des enregistrement en Delphi: Le case dans la structure record.
    Voir l'aide pour les détails.

    De ma compréhension des deux langages, le principe du stockage en mémoire est le même. Faut faire attention aux points classiques (que je maîtrise mal).

    Bonne soirée

    Delias

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 844
    Points : 11 274
    Points
    11 274
    Billets dans le blog
    6
    Par défaut
    Hormis les solutions proposées, fort judicieuses, je ne suis pas sûr que Delphi permette une déclaration en un seul temps.
    Pour coller au plus près au code C, il faudrait créer un premier type enregistrement à partie variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    type 
      TNotifyHandle = record
        case Boolean of
          True:  ( lphNotifyEvent: LPHANDLE );
          False: ( hNotifyWnd:     HWND );
        end;
      end;
    puis l'intégrer dans le second :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    type 
      LP_ABASE = ^ABASE;
      ABASE = record
         iSize : int;
         //...
         uNotifyHandle: TNotifyHandle; // ici !
         hProgressWnd: HWND;
         //...
       end;
    Delphi 5 Pro - Delphi 10.4 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  6. #6
    Membre actif
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 416
    Points : 299
    Points
    299
    Par défaut
    Merci à tous, pour votre aide.

    La solution via un "case" m'a permis de me rappeler la doc papier de Delphi 6
    et la proposition de Tourlourou colle parfaitement aux explications.

    Je vais tenter ça, dans ce sens pour "coller" au C.

    D'autre part,
    Ce type de déclaration:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // en C
    BYTE            bBuzzerCount[MF_BUZZER_TYPE_MAX];
    //ou en VB
    bBuzzerCount(1 To MF_BUZZER_TYPE_MAX) As Byte
    Vous la voyez comment en Delphi ?
    Parce que tout ce que je tente est rejeté par le compilateur.
    “La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer.” Antoine de Saint-Exupéry.

    D1..D7-2005,2006-Xe2 Ent-XE7 archi-MsSql 2005..2008 & R2, FB 1.5..2.5.x.x -Win10,Win7/64-Xp-
    _____________________________________________________

  7. #7
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 844
    Points : 11 274
    Points
    11 274
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    bBuzzerCount: array[0..MF_BUZZER_TYPE_MAX-1] of byte;
    // ou
    bBuzzerCount: array[1..MF_BUZZER_TYPE_MAX] of byte;
    Delphi 5 Pro - Delphi 10.4 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  8. #8
    Membre actif
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 416
    Points : 299
    Points
    299
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    bBuzzerCount: array[0..MF_BUZZER_TYPE_MAX-1] of byte;
    // ou
    bBuzzerCount: array[1..MF_BUZZER_TYPE_MAX] of byte;
    Merci, j'avais trouvé ce type de déclaration, mais je n'étais pas certain de l'équivalence.
    D'ailleurs en cherchant dans les sources, je suis tombé sur des structures que je n'avais jamais vu et qui me laissent bouche bée d'ignorance...

    Merci encore,
    “La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer.” Antoine de Saint-Exupéry.

    D1..D7-2005,2006-Xe2 Ent-XE7 archi-MsSql 2005..2008 & R2, FB 1.5..2.5.x.x -Win10,Win7/64-Xp-
    _____________________________________________________

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 429
    Points : 24 794
    Points
    24 794
    Par défaut
    Cher Maitre Castor



    Ne pas oublier de vérifier l'alignement entre le struct de la DLL en C et le record Delphi !
    Cela se verra surtout à partir de wErrorEject et bUseNVMemory si c'est un alignement à 0 (packed), 4 ou 8

    Idem pour le char a mapper en AnsiChar : cPortName: array[0..255] of AnsiChar;



    Votre éternel apprenti
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  10. #10
    Membre actif
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 416
    Points : 299
    Points
    299
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Cher Maitre Castor



    Ne pas oublier de vérifier l'alignement entre le struct de la DLL en C et le record Delphi !
    Cela se verra surtout à partir de wErrorEject et bUseNVMemory si c'est un alignement à 0 (packed), 4 ou 8

    Idem pour le char a mapper en AnsiChar : cPortName: array[0..255] of AnsiChar;



    Votre éternel apprenti
    Monsieur est trop bon
    “La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer.” Antoine de Saint-Exupéry.

    D1..D7-2005,2006-Xe2 Ent-XE7 archi-MsSql 2005..2008 & R2, FB 1.5..2.5.x.x -Win10,Win7/64-Xp-
    _____________________________________________________

Discussions similaires

  1. Delphi 7, Conversion de type Shortstring vers int
    Par Marc_3 dans le forum Langage
    Réponses: 6
    Dernier message: 30/09/2013, 13h34
  2. conversion type Image vers tableau
    Par elektronik-17 dans le forum Débuter
    Réponses: 6
    Dernier message: 22/08/2008, 01h47
  3. Réponses: 1
    Dernier message: 11/05/2007, 19h18
  4. Conversion Delphi 2 vers Delphi 2005
    Par ROYER dans le forum Bases de données
    Réponses: 10
    Dernier message: 25/11/2005, 19h45
  5. conversion d'un type Extended vers un string
    Par matterazzo dans le forum Langage
    Réponses: 2
    Dernier message: 28/10/2005, 20h22

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