Convertir fonction DLL en Delphi [Résolu]

Signaler
Messages postés
344
Date d'inscription
jeudi 1 mai 2003
Statut
Membre
Dernière intervention
4 avril 2011
-
Messages postés
344
Date d'inscription
jeudi 1 mai 2003
Statut
Membre
Dernière intervention
4 avril 2011
-
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

Messages postés
344
Date d'inscription
jeudi 1 mai 2003
Statut
Membre
Dernière intervention
4 avril 2011
1
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
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
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.
Messages postés
215
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
1 septembre 2006

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
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
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.
Messages postés
215
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
1 septembre 2006

En théorie, je suis d'accord mais nous ne connaissons pas le fonctionnement de la fonction csp2GetCodeType.

j!nH
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
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)
Messages postés
304
Date d'inscription
lundi 30 décembre 2002
Statut
Membre
Dernière intervention
10 mars 2012

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 !!!

@+