Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > Delphi > Langage
Langage Tout ce qui concerne le langage (POO, syntaxe, message d'erreur...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 04/11/2012, 19h05   #1
Dragnard
Invité de passage
 
Homme
Développeur informatique
Inscription : 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.
Dragnard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2012, 19h45   #2
nicolas.dole
Invité de passage
 
Homme Nicolas DOLE
Inscription : 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
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.
nicolas.dole est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/11/2012, 06h54   #3
Dragnard
Invité de passage
 
Homme
Développeur informatique
Inscription : 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
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.
Dragnard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/11/2012, 11h18   #4
ShaiLeTroll
Expert Confirmé Sénior
 
Avatar de ShaiLeTroll
 
Homme
Développeur C++\Delphi
Inscription : juillet 2006
Messages : 9 195
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France

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

Informations forums :
Inscription : juillet 2006
Messages : 9 195
Points : 13 245
Points : 13 245
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é !
ShaiLeTroll est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/11/2012, 07h05   #5
Dragnard
Invité de passage
 
Homme
Développeur informatique
Inscription : 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
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 ?
Dragnard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/11/2012, 12h06   #6
ShaiLeTroll
Expert Confirmé Sénior
 
Avatar de ShaiLeTroll
 
Homme
Développeur C++\Delphi
Inscription : juillet 2006
Messages : 9 195
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France

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

Informations forums :
Inscription : juillet 2006
Messages : 9 195
Points : 13 245
Points : 13 245
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é !
ShaiLeTroll est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/11/2012, 21h41   #7
Dr.Who
Membre Expert
 
Avatar de Dr.Who
 
Inscription : septembre 2009
Messages : 980
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : septembre 2009
Messages : 980
Points : 1 175
Points : 1 175
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!
Dr.Who est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2012, 06h08   #8
Paul TOTH
Expert Confirmé Sénior
 
Avatar de Paul TOTH
 
Homme Paul TOTH
Freelance
Inscription : novembre 2002
Messages : 4 416
Détails du profil
Informations personnelles :
Nom : Homme Paul TOTH
Âge : 43
Localisation : Réunion

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

Informations forums :
Inscription : novembre 2002
Messages : 4 416
Points : 10 801
Points : 10 801
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%
Paul TOTH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2012, 22h04   #9
Dragnard
Invité de passage
 
Homme
Développeur informatique
Inscription : 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
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
Dragnard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2012, 00h12   #10
Dr.Who
Membre Expert
 
Avatar de Dr.Who
 
Inscription : septembre 2009
Messages : 980
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : septembre 2009
Messages : 980
Points : 1 175
Points : 1 175
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!
Dr.Who est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2012, 18h41   #11
Dragnard
Invité de passage
 
Homme
Développeur informatique
Inscription : 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
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
Type de fichier : h dynamixel.h (2,1 Ko, 5 affichages)
Dragnard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2012, 06h03   #12
Paul TOTH
Expert Confirmé Sénior
 
Avatar de Paul TOTH
 
Homme Paul TOTH
Freelance
Inscription : novembre 2002
Messages : 4 416
Détails du profil
Informations personnelles :
Nom : Homme Paul TOTH
Âge : 43
Localisation : Réunion

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

Informations forums :
Inscription : novembre 2002
Messages : 4 416
Points : 10 801
Points : 10 801
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%
Paul TOTH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2012, 06h39   #13
Dragnard
Invité de passage
 
Homme
Développeur informatique
Inscription : 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
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
Type de fichier : pas DYNAMIXEL.PAS (5,5 Ko, 3 affichages)
Dragnard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2012, 08h23   #14
Paul TOTH
Expert Confirmé Sénior
 
Avatar de Paul TOTH
 
Homme Paul TOTH
Freelance
Inscription : novembre 2002
Messages : 4 416
Détails du profil
Informations personnelles :
Nom : Homme Paul TOTH
Âge : 43
Localisation : Réunion

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

Informations forums :
Inscription : novembre 2002
Messages : 4 416
Points : 10 801
Points : 10 801
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%
Paul TOTH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2012, 11h41   #15
ShaiLeTroll
Expert Confirmé Sénior
 
Avatar de ShaiLeTroll
 
Homme
Développeur C++\Delphi
Inscription : juillet 2006
Messages : 9 195
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France

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

Informations forums :
Inscription : juillet 2006
Messages : 9 195
Points : 13 245
Points : 13 245
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é !
ShaiLeTroll est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/12/2012, 22h49   #16
Dragnard
Invité de passage
 
Homme
Développeur informatique
Inscription : 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
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.
Dragnard est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 16h34.


 
 
 
 
Partenaires

Hébergement Web