Convertir fonction DLL en Delphi

Résolu
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 - 11 août 2006 à 10:58
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre 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

7 réponses

cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
16 août 2006 à 10:23
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
3
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
11 août 2006 à 12:21
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.
0
jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 1 septembre 2006
11 août 2006 à 13:22
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
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
11 août 2006 à 14:21
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 1 septembre 2006
11 août 2006 à 14:26
En théorie, je suis d'accord mais nous ne connaissons pas le fonctionnement de la fonction csp2GetCodeType.

j!nH
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
11 août 2006 à 17:00
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)
0
cs_shining Messages postés 304 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 10 mars 2012
11 août 2006 à 21:03
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 !!!

@+
0
Rejoignez-nous