Convertir fonction DLL en Delphi [Résolu]

Messages postés
346
Date d'inscription
jeudi 1 mai 2003
Dernière intervention
4 avril 2011
- - Dernière réponse : cs_nitrique
Messages postés
346
Date d'inscription
jeudi 1 mai 2003
Dernière intervention
4 avril 2011
- 16 août 2006 à 10:23
Bonjour à tous,

J'ai une DLL qui possède cette fonction selon la doc:
NoMangle long DLL_IMPORT_EXPORT csp2GetCodeType(unsigned char

CodeId, char *CodeType, long nMaxLength)
Elle est censée remplir CodeType depuis CodeId en le transformant un peu...Je la déclare en Delphi comme ça:
  function csp2GetCodeType(CodeId: Char; var CodeType: Char; nMaxLength: Integer): Integer; stdcall; external NomDLL;

Ensuite, je l'apelle comme ça:
var  tampon,tampon2: array[0..512] of Char;
...
    csp2GetCodeType(tampon[1],tampon2[1],30);
    Memo1.Lines.Add('Packet: '+tampon+' => CodeType:'+tampon2);

Ou est le problème ?

http://www.gentag.fr
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
Messages postés
346
Date d'inscription
jeudi 1 mai 2003
Dernière intervention
4 avril 2011
3
Merci
Bonjour à tous et merci pour vos nombreuses réponses,

J'ai essayé vos diverses méthodes sans succès, la seule manière de faire fonctionner cette fonction que j'ai trouvé est:
APPEL:
function csp2GetCodeType(CodeId: Integer; CodeType: PChar; nMaxLength: Integer): Integer; stdcall; external NomDLL;
UTILISATION:
csp2GetCodeType(Integer(Pointer(tampon[1])),tampon2,30); // Indice 1 car comme ça dans l'exemple en C

EXEMPLE C:
char Packet[64],aBuffer[256];
csp2GetCodeType((long)Packet[1],aBuffer,30);

http://www.gentag.fr

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 97 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_nitrique
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
0
Merci
Salut Nitrique,

Je serais plutôt tenté d'écrire :
function csp2GetCodeType(CodeId: Char; CodeType: PChar; nMaxLength: Integer): Integer; stdcall; external NomDLL;

Auquel cas, l'appel s'écrirait ainsi :
var  tampon,tampon2: array[0..512] of Char;
...
    csp2GetCodeType(tampon[1],tampon2,30);
    Memo1.Lines.Add('Packet: ' + tampon + ' => CodeType:' + tampon2);

Là où j'ai un doute, c'est sur la convention d'appel par défaut en C. A vérifier si ça correspond au StdCall du Pascal...

May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Commenter la réponse de cs_Delphiprog
Messages postés
215
Date d'inscription
mardi 29 juillet 2003
Dernière intervention
1 septembre 2006
0
Merci
Cela peut être du cdecl en convention également.

A vérifier également si ta fonction se charge elle-même d'allouer la mémoire pour le PChar.

j!nH
Commenter la réponse de jinh68
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
0
Merci
Extrait de l'aide en ligne au sujet des conventions d'appel :
"La convention d'appel par défaut register est la plus efficace car elle évite la création d'un cadre de pile. (Les méthodes d'accès aux propriétés publiées doivent utiliser register.) La convention cdecl est utile pour les appels de fonctions à partir de bibliothèques partagées écrites en C ou en C++, alors que stdcall et safecall sont conservées habituellement pour les appels à du code externe. Sous Windows, les API du système d'exploitation sont stdcall et safecall. Les autres systèmes d'exploitation utilisent généralement cdecl. (Notez que stdcall est plus efficace que cdecl.)"

Jinh68  a écrit  : "A vérifier également si ta fonction se charge elle-même d'allouer la mémoire pour le PChar." 
PChar est un pointeur qui pointe sur une adresse mémoire ou ne pointe sur rien (nil).
Quand on transmet un pointeur en argument, ce n'est jamais à l'appelé d'allouer la mémoire qui va avec mais à l'appelant. Cependant, si c'est la fonction appelée qui renvoie un pointeur, c'est l'inverse. En résumé, c'est à celui qui fournit le pointeur de se charger des allocations de mémoire.

May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Commenter la réponse de cs_Delphiprog
Messages postés
215
Date d'inscription
mardi 29 juillet 2003
Dernière intervention
1 septembre 2006
0
Merci
En théorie, je suis d'accord mais nous ne connaissons pas le fonctionnement de la fonction csp2GetCodeType.

j!nH
Commenter la réponse de jinh68
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
9 mars 2018
0
Merci
Unit CSP2API;

{.$DEFINE USECDECL}



Interface

function csp2GetCodeType(CodeId: byte;
var CodeType: PChar; nMaxLength: Integer): Integer;
{$IFDEF USECDECL} cdecl {$ELSE
} stdcall
{$ENDIF};

Implementation

const
   CSP2_DLL = 'csp2.dll';

function csp2GetCodeType; external CSP2_DLL name 'csp2GetCodeType@3';

end.





<hr size="2" width="100%" />
Croc (click me)
Commenter la réponse de f0xi
Messages postés
329
Date d'inscription
lundi 30 décembre 2002
Dernière intervention
10 mars 2012
0
Merci
Salut,

DelphiProg à dit :
******
"Je serais plutôt tenté d'écrire :
function csp2GetCodeType(CodeId: Char; CodeType: PChar; nMaxLength: Integer): Integer; stdcall; external NomDLL;

Auquel cas, l'appel s'écrirait ainsi :
var tampon,tampon2: array[0..512] of Char;
...
csp2GetCodeType(tampon[1],tampon2,30);
Memo1.Lines.Add('Packet: ' + tampon + ' => CodeType:' + tampon2);

Là où j'ai un doute, c'est sur la convention d'appel par défaut en C. A vérifier si ça correspond au StdCall du Pascal..."
*****

je suis d'accord avec ça sauf pour CodeId qui doit être en Byte(enfin en respectant la déclaration "C"),
csp2GetCodeType(tampon[1],tampon2,30); <== attention le tampon commence à l'index '0', donc StrToInt('0x' + tampon[0]) serait plus judicieux !!!, et pareil pour tampon2 il vaut mieux mettre tampon2[0].

maintenant pour CodeType : PChar dans certains cas on peut l'ecrire aussi
var CodeType; notamment dans le cas d'un tableau non typé, tout dépend comment le programme "C" gère cette variable !!!

@+
Commenter la réponse de cs_shining

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.