IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

SESAME VITALE - Lecture


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 72
    Points : 52
    Points
    52
    Par défaut SESAME VITALE - Lecture
    (re)Bonjour,

    J'ai finalement résolu la grande majorité de ms défauts avec cet API, j'arrive à gérer les fonctions principales sauf la lecture...

    Je suis au même point que cette personne :

    http://www.developpez.net/forums/d11...e/#post6287607
    (sous Java mais l'intitulé est le même)

    ET j'ai la même erreur à savoir une erreur qui indique un défaut dans les paramètres
    Logiquement l'erreur est sur l'une de ses 2 valeurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var pcDataOut: Pchar; //Zone de mémoire restituant les données lues dans la carte Vitale sur l'assuré et ses bénéficiaires. ==> char * (passée par adresse => adresse non nulle)
    var puiLgDataOut: Integer; //puiLgDataOut : taille allouée en entrée à DataOut / taille occupée par les données restituées. ==> unsigned int * (Valeur non nulle passée par adresse => adresse non nulle)
    mais je ne vois pas comment déclaré cela autrement (je suppose que mon erreur est clairement dans mon type de déclaration de ces variables...)

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Je pense que ça doit s'utiliser à peu près comme suit, compte tenu de la déclaration de la fonction ;
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    unsigned short Lec_LectureVitale ( unsigned short usNoSession,
    unsigned short usNoSessionCPS,
    char * pcDataOut,
    unsigned int * puiLgDataOut,
    unsigned short * pusCodeErreur );
    à traduire en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function Lec_LectureVitale( usNoSession: Word; usNoSessionCPS: Word; pcDataOut: PChar; var puiLgDataOut: Cardinal; var pusCodeErreur: Word) : Word;
    pour l'utiliser sur le modèle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var
      Buffer: PChar;
      ByteRead: Cardinal;
      NoSession, NoSessionCPS, ErrCode, RetCode: Word;
     
    begin
      GetMem(Buffer, 100*1024);
      NoSession := 1;
      NoSessionCPS := 1;
      RetCode := Lec_LectureVitale( NoSession, NoSessionCPS, Buffer, ByteRead, ErrCode); 
      //...
      FreeMem(Buffer);
    end;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 72
    Points : 52
    Points
    52
    Par défaut
    Effectivement, cela fonctionne presque comme il faut !

    Sur ton code, il manque juste de pré-remplir la valeur suivante
    avant d’exécuter la fonction.

    Par contre, question bête, comment je réutilise le contenu de ma valeur Buffer (car là elle est rempli de signe chinois ! [je vais aller jeter un coup d'oeil dans les FAQ au cas où j'y trouve la réponse mais si quelqu'un passe par là...])

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2012
    Messages : 92
    Points : 159
    Points
    159
    Par défaut
    ton buffer est remplie de caractère chinois parce que la zone mémoire allouée est plus grande que la donnée mise à l'intérieure
    ta variable ByteRead qui est passée en paramètre à ta fonction Lec_LectureVitale doit contenir normalement la longueur exacte de ton buffer a la sortie de la fonction.
    ensuite il faut que tu ne prennes dans ton buffer les valeurs jusqu'à la valeur ByteRead

    tu peux aussi pour éviter les caractères chinois, faire un zeromemory de ton buffer, aprés avoir fait ton getmem, pour initialiser ton buffer avec "rien" dedans

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 72
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par jeromelef2 Voir le message
    ton buffer est remplie de caractère chinois parce que la zone mémoire allouée est plus grande que la donnée mise à l'intérieure
    ta variable ByteRead qui est passée en paramètre à ta fonction Lec_LectureVitale doit contenir normalement la longueur exacte de ton buffer a la sortie de la fonction.
    ensuite il faut que tu ne prennes dans ton buffer les valeurs jusqu'à la valeur ByteRead

    tu peux aussi pour éviter les caractères chinois, faire un zeromemory de ton buffer, aprés avoir fait ton getmem, pour initialiser ton buffer avec "rien" dedans
    Alors j'ai essayer les choses suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GetMem(Buffer, 100*1024);
    ZeroMemory(@Buffer[0], sizeof(Buffer));
    ==> Cela ne change rien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //REmplacer par (NEW) GetMem(Buffer, 100*1024);
    New(Buffer);
    ==> Cela est pire

    Je vois pas trop comment lire mon buffer de 0 à ByteRead, j'ai essayer avec Buffer[0] et cela indique un caractère chinois donc c'est pas bon mais je suppose que l'idée est à creuser en ce sens ?

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Citation Envoyé par popeyes Voir le message
    ==> Cela ne change rien
    Ce qui est parfaitement normal. SizeOf retourne une constante à la compilation. Buffer est un pointeur, SizeOf renvoie 4.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var
      buffer :array[1..100*1024] of char;
    begin
      ZeroMemory(@Buffer[1], sizeof(Buffer));
    end;
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Len := 100*1024;
    GetMem(Buffer, Len);
    ZeroMemory(Buffer, Len);
    ou plus simplement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AllocMem(Buffer, 100*1024); //AllocMem équivaut à GetMem suivi de ZeroMemory

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 72
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AllocMem(Buffer, 100*1024); //AllocMem équivaut à GetMem suivi de ZeroMemory
    J'ai un type incompatible en tentant de l'utiliser, les autres solutions génèrent soit un type incompatible soit une erreur en exécution...
    J'ai tenté en utilisant ReallocMem (je n'ai pas d'erreur à la compilation) mais j'ai une erreur en exécution...

  8. #8
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Oui, bon... Buffer := AllocMem(100*1024);

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 72
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Oui, bon... Buffer := AllocMem(100*1024);
    Effectivement, j'avais pas essayé cette écriture mais j'ai toujours des caractères chinois

    On est bien d 'accord que je laisse ma variable Buffer déclaré en tant que Pchar ?

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    char * en C++ = PAnsiChar en Delphi

    PAnsiChar = PChar sous Delphi 3 à 2007
    PAnsiChar uniquement sous Dephi 2009 .. XE?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 72
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    char * en C++ = PAnsiChar en Delphi

    PAnsiChar = PChar sous Delphi 3 à 2007
    PAnsiChar uniquement sous Dephi 2009 .. XE?



    SUPER !

    Merci à tous, ça marche parfaitement comme il faut (en effet, il suffisait de passer en PAnsiChar !)

    En tout cas, c'est sympa de m'avoir bien dépanné sur ce coup là, ça fait bien longtemsp que j'avais pas réutiliser Delphi alors je patauge un peu !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. API Sesam Vitale pour une application web
    Par cedricgirard dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 10/03/2018, 16h58
  2. [Généralités] SESAM-VITALE - Télétransmission
    Par Bapt's dans le forum WinDev
    Réponses: 2
    Dernier message: 11/02/2014, 19h12
  3. [WD17] W18 Carte Sesam Vitale
    Par thierrybatlle dans le forum WinDev
    Réponses: 3
    Dernier message: 18/03/2013, 17h46
  4. api sesam vitale
    Par max_31 dans le forum Débuter
    Réponses: 5
    Dernier message: 29/05/2012, 10h10
  5. API Sesam VITALE
    Par ipholed dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 24/01/2011, 13h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo