cs_nitrique
Messages postés344Date d'inscriptionjeudi 1 mai 2003StatutMembreDernière intervention 4 avril 2011
-
11 août 2006 à 10:58
cs_nitrique
Messages postés344Date d'inscriptionjeudi 1 mai 2003StatutMembreDerniè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);
cs_nitrique
Messages postés344Date d'inscriptionjeudi 1 mai 2003StatutMembreDernière intervention 4 avril 20111 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);
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201333 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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 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 !!!