API Sesam-VITALE

Résolu
MURAP Messages postés 4 Date d'inscription vendredi 24 décembre 2004 Statut Membre Dernière intervention 19 juin 2007 - 18 juin 2007 à 12:53
MURAP Messages postés 4 Date d'inscription vendredi 24 décembre 2004 Statut Membre Dernière intervention 19 juin 2007 - 19 juin 2007 à 09:09
Bonjour à toutes et à tous,
Je rencontre quelques problèmes pour la lecture des API Sesam-VITALE avec DELPHI.En effet, je dois uti<?xml:namespace prefix st1 ns "urn:schemas-microsoft-com:office:smarttags" /??><st1:personname>lise</st1:personname>r la fonction suivante dans la DLL sgdw32.dll



<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>

 







Unsigned short SGD_LireChamp (









   unsigned short    NumeroSession,









   unsigned short    IdGroupe,









   unsigned short    OccurenceGroupe,









   unsigned short    NumeroChamp,









   char*             ValeurChamp,









   size_t*           TailleMax);








 





Pour cela, j’ai déclaré ma fonction comme suit:





function SGD_LireChamp(
   NumSession : Word;
   IdGroupe:Word;
   OccGroupeCourant:Word;
   NumChamp : Word;
   Var ValeurChamp : PChar;
   var TailleMax:LongWord
): Word; stdcall;external 'sgdw32.dll' name 'SGD_LireChamp';



 




Et je l’appelle dans mon programme de la façon suivante :






ResFunc:=SGD_LireChamp(NSession,IdtGrp,OccGrp,1,ValChamp,Taille);







Les variables NSession, IdtGrp et OccGrp ayant été préalablement chargées.



 




Après exécution de la fonction , ma variable ValChamp (qui est un PChar initialisé à ‘Nil’) doit normalement être chargée ce qui n’est pas le cas.


Au contraire, l’évaluateur d’expression ne me donne plus aucun renseignement (alors qu’il indiquait ‘Nil’ avant) et tout appel à cette variable me plante le programme.



 




Pour <st1:personname>information</st1:personname>, voici le résultat du mode « trace » lors de l’appel de cette fonction





SGD_LireChamp : numeroSession 1, idGroupe 3600, occurrenceGroupe = 1, numeroChamp = 1







{ Zone::rechercherChamp : identifiant 3600, occurrenceGroupe 1, numero = 1








  { Zone::positionnerDebut








  }








  cr 0x0000, donnees 0x0036868C, longueur = 4






}



 




Par avance, merci de votre aide

2 réponses

WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
18 juin 2007 à 19:07
Bonsoir

Il me semble qu'il faut fournir une zone allouée, vu que la fonction attend également la taille maximum de ton buffer. Il faudrait écrire quelquechose du style :

TailleMax := 1024 ; // ou plus, ou moins, regarde dans l'aide de ton API.
ValChamp := StrAlloc(TailleMax); // Allocation du buffer de réception
FillChar(ValChamp^,TailleMax,#0); // Initialisation du buffer de réception
try
  ResFunc:=SGD_LireChamp(NSession,IdtGrp,OccGrp,1,ValChamp,Taille);<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??>

  // ...
finally
  StrDispose(ValChamp);
end;

Cordialement.
<hr />"L'imagination est plus importante que le savoir." Albert Einstein
3
MURAP Messages postés 4 Date d'inscription vendredi 24 décembre 2004 Statut Membre Dernière intervention 19 juin 2007
19 juin 2007 à 09:09
OK Merci de ta réponse

Finallement et pour information, j'ai utilisé une autre méthode
j'ai enlevé le mot clé VAR dans ma déclaration de fonction et j'ai modifié mon code comme suit:

  ValChamp : PChar;
  ValChampTmp : array [Word] of char;

  ResFunc:=SGD_LireChamp(NSession,IdtGrp,OccGrp,1,@ValChampTmp,Taille);
  ValChamp:=@ValChampTmp[0];

Et ça fonctionne
0
Rejoignez-nous