Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 16 sur 16
  1. #1
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : février 2012
    Messages : 7
    Points : 0
    Points
    0

    Par défaut Compatibilité C et Delphi pour une DLL

    Bonjour,

    Voici quelque temps déja que je développe en delphi et je me trouve face a un problème... bizarre et malgré mes recherche je bute dessus :

    Je voudrai utiliser une DLL développée en c/cpp, jusque là rien d'exceptionnel.

    J'ai trouvé une application qui utilise cette dll et j'obtiens des résultats. (normal)

    Mais quand j'utilise la même dll en delphi, les résultats sont complétement différents.

    Pourquoi? Y a-t-il une incompatibilité entre delphi et c/cpp?

    Merci a ceux qui prendront le temps de m'aider.

  2. #2
    Invité de passage
    Homme Profil pro Nicolas DOLE
    Inscrit en
    mai 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Nom : Homme Nicolas DOLE
    Localisation : France

    Informations forums :
    Inscription : mai 2009
    Messages : 2
    Points : 1
    Points
    1

    Par défaut

    Bonjour,

    As-tu utilisé la directive stdcall dans la déclaration des méthodes coté Delphi ?
    Cette directive permet de passer les paramètres de façon standard pour les méthodes d'une dll.

  3. #3
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : février 2012
    Messages : 7
    Points : 0
    Points
    0

    Par défaut

    Oui, j'utilise bien stdcall, voici comment elles sont déclarées:

    function dxl_read_word(id : integer; address : integer): integer; stdcall; external 'dynamixel.dll';

    J'ai fais un croisé avec les réponse reçus en c/cpp et les réponses reçus en delphi... et je ne trouve aucune cohérence.

    Un projet bloqué a cause d'une intolérence de dll.... c'est vexant....
    je trouverai la solution.

  4. #4
    Expert Confirmé Sénior Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    10 025
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 10 025
    Points : 12 830
    Points
    12 830

    Par défaut

    stdcall ce n'est pas forcément le choix du développeur C, il existe aussi cdecl
    tu n'aurais pas un fichier H avec la DLL pour être sûr de la convention d'appel et surtout du langage C et C++ sont subtilement différent !

    dxl_read_word, si le nom est cohérent, cela devrait lire un word (16bit) et non un integer (32bit)
    int en C c'est 16bit mais int en C++ c'est 32bit
    long ing en C c'est 32 bit, long int en C++ c'est 32bit

    Et puis c'est écrit dans la documentation : Information of 2 byte can be read on Dynamixel
    tout comme "It has outstading portability in each platform since written in C language."

    les int du C deviennent des Word en Delphi

    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

    Halte à la ségrégation des Cinémas, VO sur Paris, VF en Banlieue, Abonnement résilié !

  5. #5
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : février 2012
    Messages : 7
    Points : 0
    Points
    0

    Par défaut

    Merci pour vos réponses !!! à défaut de résoudre mon problème, elles m'ont permis de me poser d'autres questions, et m'ont donné d'autres pistes de recherche.

    Effectivement la fonction "dxl_read_word" lit un word plutôt qu'un integer, j'ai pas fait attention...

    Mais mon problème reste entier.

    Je pensais que mon problème venait de la dll... Je vais plutôt chercher du côté de mes déclarations de la dll.

    J'ai le fichier .h de la dll.

    Qu'est ce que je dois chercher dedans ? pour vérifier mes déclarations ?

  6. #6
    Expert Confirmé Sénior Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    10 025
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 10 025
    Points : 12 830
    Points
    12 830

    Par défaut

    C'est évident, tu dois consider le H et la documentation avec une norme C donc 16 bit par défaut et non C++ qui est 32 bit par défaut !
    int => Word n'est qu'une partie !
    la convention d'appel est probablement cdecl du C et non stdcall, je ne suis pas assez habitué au C pour être sûr de cela
    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

    Halte à la ségrégation des Cinémas, VO sur Paris, VF en Banlieue, Abonnement résilié !

  7. #7
    Membre Expert Avatar de Dr.Who
    Inscrit en
    septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : septembre 2009
    Messages : 980
    Points : 1 162
    Points
    1 162

    Par défaut

    La plupart du temps oui les dev C préfère utiliser CDECL que STDCALL (plutôt utilisé en C++ et autre, généralisé dans les API windows).

    si je puis me permettre aussi, evite de déclarer tes wrapper comme ça :


    function nom(param): retour; convention; external 'blabla.dll';

    mais plutot comme ceci :

    Code :
    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
     
    unit Unit9;
     
    interface
     
    {$DEFINE TRUC_FU_STDCALL}
    {$DEFINE MACHIN_FU_STDCALL}
     
    function truc0(p: word): word; {$IFDEF TRUC_FU_STDCALL}stdcall{$ELSE}cdecl{$ENDIF};
    function truc1(p: word): word; {$IFDEF TRUC_FU_STDCALL}stdcall{$ELSE}cdecl{$ENDIF};
    function truc2(p: word): word; {$IFDEF TRUC_FU_STDCALL}stdcall{$ELSE}cdecl{$ENDIF};
    function truc3(p: word): word; {$IFDEF TRUC_FU_STDCALL}stdcall{$ELSE}cdecl{$ENDIF};
     
    function machin0(p: word): word; {$IFDEF MACHIN_FU_STDCALL}stdcall{$ELSE}cdecl{$ENDIF};
    function machin1(p: word): word; {$IFDEF MACHIN_FU_STDCALL}stdcall{$ELSE}cdecl{$ENDIF};
    function machin2(p: word): word; {$IFDEF MACHIN_FU_STDCALL}stdcall{$ELSE}cdecl{$ENDIF};
    function machin3(p: word): word; {$IFDEF MACHIN_FU_STDCALL}stdcall{$ELSE}cdecl{$ENDIF};
     
    implementation
     
    const
      TRUCDLL = 'truc.dll';
      MACHINDLL= 'machin.dll';
     
    function truc0; external TRUCDLL;
    function truc1; external TRUCDLL;
    function truc2; external TRUCDLL;
    function truc3; external TRUCDLL;
     
    function machin0; external MACHINDLL;
    function machin1; external MACHINDLL;
    function machin2; external MACHINDLL;
    function machin3; external MACHINDLL;
     
    end.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  8. #8
    Expert Confirmé Sénior
    Avatar de Paul TOTH
    Homme Profil pro Paul TOTH
    Freelance
    Inscrit en
    novembre 2002
    Messages
    5 489
    Détails du profil
    Informations personnelles :
    Nom : Homme Paul TOTH
    Âge : 45
    Localisation : Réunion

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

    Informations forums :
    Inscription : novembre 2002
    Messages : 5 489
    Points : 14 414
    Points
    14 414

    Par défaut

    je pensais que c'était plutôt stdcall sous Windows et cdecl sous Linux (ou Mac)...c'est le cas pour OpenGL notamment.

    sinon je trouve dommage que Delphi ne propose pas des directives {$STDCALL ON/OFF} ou équivalente pour forcer la convention d'appel d'une série de fonctions.

    Code :
    1
    2
    3
    4
    5
    6
     
    {$IFDEF WINDOWS}
     {$SDTCALL}
    {$ELSE}
     {$CDECL}
    {$ENDIF}
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Produits : UPnP, RemoteOffice, FlashPascal
    Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%

  9. #9
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : février 2012
    Messages : 7
    Points : 0
    Points
    0

    Par défaut

    Coucou a vous!!!

    Désolé de tarder, je fais des essais avec divers solution... mais le problème reste entier.

    Dans le meilleur des cas j'obtiens le même résultat que mon premier soft, soit dans les autres cas... je ne compile même pas.

    je vais voir du coté des codes sources de la dll, si je ne peux pas la refaire en delphi.

    Merci a vous

  10. #10
    Membre Expert Avatar de Dr.Who
    Inscrit en
    septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : septembre 2009
    Messages : 980
    Points : 1 162
    Points
    1 162

    Par défaut

    tu as la source ? poste la qu'on te dise quoi faire
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  11. #11
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : février 2012
    Messages : 7
    Points : 0
    Points
    0

    Par défaut

    Bonjour a vous tous,

    J'ai trouvé un soft qui permet de "convertire" un fichier ".H" en ".pas".
    j'ai donc convertis le fichier ".H" de la dll pour pouvoir l'utiliser dans mon soft, mais cela donne le même résultat.

    c'est bien stdcall qui est utiliser comme déclaration...

    je bute mais ne désespére pas.

    Je met en PJ le fichier ".H" si cala peux aider.

    Merci de votre aide.
    Fichiers attachés Fichiers attachés

  12. #12
    Expert Confirmé Sénior
    Avatar de Paul TOTH
    Homme Profil pro Paul TOTH
    Freelance
    Inscrit en
    novembre 2002
    Messages
    5 489
    Détails du profil
    Informations personnelles :
    Nom : Homme Paul TOTH
    Âge : 45
    Localisation : Réunion

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

    Informations forums :
    Inscription : novembre 2002
    Messages : 5 489
    Points : 14 414
    Points
    14 414

    Par défaut

    je serais curieux de voir ta traduction Delphi car il n'y a pas plus simple comme API, du C et des Integer
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Produits : UPnP, RemoteOffice, FlashPascal
    Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%

  13. #13
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : février 2012
    Messages : 7
    Points : 0
    Points
    0

    Par défaut

    je suis d'accord, ce n'est pas bien compliqué, c'est pour cela que je trouve étrange que mes résultats soient faux....

    voici la conversion :
    Fichiers attachés Fichiers attachés

  14. #14
    Expert Confirmé Sénior
    Avatar de Paul TOTH
    Homme Profil pro Paul TOTH
    Freelance
    Inscrit en
    novembre 2002
    Messages
    5 489
    Détails du profil
    Informations personnelles :
    Nom : Homme Paul TOTH
    Âge : 45
    Localisation : Réunion

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

    Informations forums :
    Inscription : novembre 2002
    Messages : 5 489
    Points : 14 414
    Points
    14 414

    Par défaut

    cette notation me semble erronée
    Code :
    1
    2
     
    ... cdecl  {$IFDEF WIN32} stdcall {$ENDIF}
    cela devrait être
    Code :
    1
    2
     
    ...  {$IFDEF WIN32} stdcall {$ELSE} cdecl {$ENDIF}
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Produits : UPnP, RemoteOffice, FlashPascal
    Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%

  15. #15
    Expert Confirmé Sénior Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    10 025
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 10 025
    Points : 12 830
    Points
    12 830

    Par défaut

    Pour la convention, il y a explicitement des __stdcall, j'aurais tendance à mettre la même chose en Delphi, et comme le fait remarquer Paul, le générateur s'est un peu planté !

    La question sur l'utilisation d'un int du C ou d'un int C++ semble avoir un début de réponse via la directive __cplusplus, si le code est conçu pour être compatible C++ en environnement Win32 (DLL oblige), ça devrait donc être de int 32 bit donc Integer serait approprié !

    Maintenant, si le H est commun à différentes plateformes, ça devient plus compliquer car en C++, la taille du int dépend de l'architecture ciblé, on espérer que le H d'un DLL respecte les conventions Win32 !

    C'est d'ailleurs pour cela que je préfère utiliser des types Windows (WORD, DWORD...) dans les H ou PAS de mes DLL, puisque de toute façon une DLL c'est uniquement pour Windows autant utilisé une convention commune à plusieurs langages, celle de l'OS !

    @Dragnard, As-tu essayé les SmallInt ?
    Est-ce mieux pire en SmallInt qu'en Integer ?
    As-tu essayé le non signé comme Cardinal ou Word



    Cette fonction __dxl_makeword est étrange, deux Word pour un constuire Un ???
    Cette API est étrangement conçue, le type int généralisé sans préoccupation me gêne franchement !
    C'est typiquement le genre de flou artistique qui me font douter de la rigueur des auteurs !

    Code :
    int __stdcall __dxl_makeword( int lowbyte, int highbyte );
    devient

    Code :
    function __dxl_makeword(lowbyte: SmallInt; highbyte: SmallInt ): SmallInt; stdcall;
    Perso, je l'aurais déclaré ainsi en C ou C++ pour GARANTIR le typage

    Code :
    unsigned short int __stdcall dxl_makeword(unsigned char lowbyte, unsigned char highbyte );
    et ainsi en Delphi
    Code :
    function __dxl_makeword(lowbyte: Byte; highbyte: Byte): Word; stdcall;
    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

    Halte à la ségrégation des Cinémas, VO sur Paris, VF en Banlieue, Abonnement résilié !

  16. #16
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : février 2012
    Messages : 7
    Points : 0
    Points
    0

    Par défaut

    Bonjour a vous, et bonne fête de fin d'annee.

    Pour le probleme de dll... vu que j'ai les codes sources de la dll, je vais la reproduire en delphi, ce sera plus simple... je pense.

    merci de votre aide.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •