API Sesam-VITALE [Résolu]

MURAP 4 Messages postés vendredi 24 décembre 2004Date d'inscription 19 juin 2007 Dernière intervention - 18 juin 2007 à 12:53 - Dernière réponse : MURAP 4 Messages postés vendredi 24 décembre 2004Date d'inscription 19 juin 2007 Dernière intervention
- 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
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
WhiteHippo 1270 Messages postés samedi 14 août 2004Date d'inscription 5 avril 2012 Dernière intervention - 18 juin 2007 à 19:07
3
Merci
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

Merci WhiteHippo 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 73 internautes ce mois-ci

Commenter la réponse de WhiteHippo
MURAP 4 Messages postés vendredi 24 décembre 2004Date d'inscription 19 juin 2007 Dernière intervention - 19 juin 2007 à 09:09
0
Merci
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
Commenter la réponse de MURAP

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.