MURAP
Messages postés4Date d'inscriptionvendredi 24 décembre 2004StatutMembreDernière intervention19 juin 2007
-
18 juin 2007 à 12:53
MURAP
Messages postés4Date d'inscriptionvendredi 24 décembre 2004StatutMembreDernière intervention19 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 :
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
WhiteHippo
Messages postés1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 20123 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
MURAP
Messages postés4Date d'inscriptionvendredi 24 décembre 2004StatutMembreDernière intervention19 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;