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

Windows Forms Discussion :

[C#] Encore moi et mes API


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 52
    Par défaut [C#] Encore moi et mes API
    Re !

    J'ai toujours en encore des problèmes avec ces API. Je m'explique :

    Dans mon programme tout d'abord, j'initialise les bibliothèques que j'utilise avec une API
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [DllImport("ssvw32.dll")]
         public static extern int SSV_InitLIB();
    jusque là ca va.

    Ensuite j'initialise une session en mémoire pour y stocker des données via une autre API :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [DllImport("sgdw32.dll")]
    public static extern int SGD_ReserverSession(int Taille,	out int NumeroSession);
    je l'appelle de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    retour = SGD_ReserverSession(taille, out NumeroSession);
    if (retour != 0)
    MessageBox.Show("Erreur de création de session : " + retour.ToString());
    Ici aussi tout se passe bien. Je récupère en sortie la session de numéro '1'.

    Je lis ensuite des données contenues sur une carte via une autre API : Toujours pas de problème. Les données sont bien copiées en mémoire.

    MAIS je m'arrive pas a les extraire en variables managées !!!

    je fais appel a cette API :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [DllImport("sgdw32.dll")]
    public static extern int SGD_LireChamp(int NumeroSession,int IdGroupe, int OccurenceGroupe, int NumeroChamp, out string ValeurChamp, out int TailleMax);
    et l'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    retour = SGD_LireChamp(NumeroSession, 1, 1, 6, out VChamp, out TailleMax);
    J'ai donc deux paramètres en sortie.
    Je récupère sans problemes le 'int' (comme plus haut avec la méthode reserversession) mais impossible de récupérer la chaine de caractères !! J'ai un plantage du genre : "La référence d'objet n'est pas définie a une instance etc etc etc".
    Pourtant mes varaibles sont bien déclarer, j'ai déjà vérifier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    string VChamp = null;
    int TailleMax = 31;
    J'ai essayer d'initialiser VChamp a une autre valeur.
    j'ai meme essayer de marshaller le tout mais.... que dalle !!

    HELP MEEEEEEE !!!!!!!!!!!!

  2. #2
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Par défaut
    Enlève le out sur le paramètre string. Les strings (entre autres) sont des types références contrairement au int par exemple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [DllImport("sgdw32.dll")]
    public static extern int SGD_LireChamp(int NumeroSession,int IdGroupe, int OccurenceGroupe, int NumeroChamp, string ValeurChamp, out int TailleMax);

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 52
    Par défaut
    En effet ! Merci de ta réponse, je n'ai plus d'erreur... enfin presque :-/
    Maintenant c'est mon API qui m'envoie une erreur.
    Il me dis : pointeur null (valeurchamp ou taillemax)
    J'ai donc changer celà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    string VChamp = "";
    int TailleMax = 31;
    Et là, magie ! plus d'erreur !!

    ...
    Mais la variable VChamp reste désesperement vide... Alors que mes données sont en mémoire, car taillemax me revient lui avec une taille changée a 8 (ce qui correspont bien au nombre de lettres du nom de la personne inscrite dans la carte).

  4. #4
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Par défaut
    mmmh..
    C'est normal, car une fois que la valeur d'un string est fixée (c'est le cas car tu fais Vchamp = ""), elle ne change plus.

    Je vois éventuellement deux solutions

    - Utiliser StringBuilder. Je te conseille celle ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    using System.Text
    [DllImport("sgdw32.dll")]
    public static extern int SGD_LireChamp(int NumeroSession,int IdGroupe, int OccurenceGroupe, int NumeroChamp, StringBuilder ValeurChamp, out int TailleMax);
     
    // Initialisation
    int TailleMax = 31
    StringBuilder VChamp = new StringBuilder(TailleMax);
    // Appelle ta fonction
    // Utilise VChamp.ToString() pour avoir la chaine de caractère retournée
    - Remettre le paramètre Vchamp à out et penser à initialiser VChamp avec une autre valeur que null. ("" conviendra).

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 52
    Par défaut
    Re !

    J'avais déjà essayé ta seconde solution... mais la première a propos du stringbuilder... que dire ... ELLE EST PARFAITE !!!

    Merci beaucoup !! Ca a l'air de tourner parfaitement !!

    En plus je viens d'apprendre pleins de choses

    Merci encore !!

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2006
    Messages : 23
    Par défaut Même pb pourtant avec StringBuilder
    Bonjour,

    Je suis confronté au même problème !

    L'appel de la fonction me retourne bien 0 mais la variable passée en paramètre reste désespérement vide !
    Qd j'utilise la fonction SGD_LireChampFichier je récupère bien des données dans le fichier destination.

    Ce qui est étonnant c'est que j'utilise pourtant un StringBuilder.

    J'ai tout essayé mais là je ne vois plus quoi faire.

    Ca serait vraiement sympa et ça m'aiderait énormément si tu pouvais me dire ce qui semble incorrecte dans mon code
    voir mieux renvoyer un bout de code similaire mais qui marche.

    Voici mon code : je ne vois pas ce qui est incorrecte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    [DllImport("sgdw32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
            private static extern ushort SGD_LireChamp(
                    ushort NumeroSession,
                    ushort IdGroupe,
                    ushort OccurrenceGroupe,
                    ushort NumeroChamp,
                    StringBuilder ValeurChamp,
                    out int TailleMax
                );
     
                SSV_InitLIB();
                SSV_InitTrace("ssv.log", "ab", 0, 'Z');
                string nomRessourcePS = "CPS";
                string nomRessourceLecteur = "Log_SV";
                string codePorteurPS = "1234";
     
                ushort session;
                SGD_ReserverSession(4000, out session);
                SIS_LireCartePS(nomRessourcePS, nomRessourceLecteur, codePorteurPS, session);
                int taille;
                StringBuilder valeurChamp = new StringBuilder(31);
                SGD_LireChamp(session, 1, 1, 6, valeurChamp, out taille);
                Console.Out.WriteLine("val = {0}", valeurChamp.ToString());
                SGD_LireChampFichier(session, 1, 1, 6, "dump.txt");
    val=
    et dans dump.txt : Luc

  7. #7
    Nouveau candidat au Club
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2
    Par défaut Problème d'affichage des valeurs
    Bonjour je suis moi aussi sur cette API ,mon souci c'est que j'ai testé mon code j'ai aucune erreur,mais losque je veux lire une carte CPS de test rien ne s'affiche.
    j'ai testé avec le meme code aucun resultat.j'utilise le lecteur twin 30 SAGEM MONETEL.
    aidez moi svp!

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2006
    Messages : 23
    Par défaut
    Bonjour,
    De mon coté, j'ai mis de côté le développement de lecture carte CPS Vitale.
    Car j'avais pas mal de problèmes concernant les valeurs qui sont retournées sous forme de paramètres en arguments (ex. out ou ref).

    Ton problème vient peut-être de l'environnement mal initialisé cad que les fichiers nécessaires au GALSW32 doivent être copiés dans les bons répertoires (Windows, programme Files, etc.) CF la documentation PDF (2.3.2. bibliothèques, fichiers de définition, de données et de test).

    Ensuite valider avec le programme de test fourni : testal32.exe

    Bon courage et tient nous au courant...

  9. #9
    Nouveau candidat au Club
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2
    Par défaut Salut
    Merci kfx_2000!
    Merci pour ta réponse je vais revoir ça et je te tiens au courant dès que je m'ensors! par contre avec le logiciel test cps la carte est bien lu donc c'est surement une mauvaise manipupulation sur mes fichiers!
    a bientot!

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

Discussions similaires

  1. Euro ? laisse moi gérer mes décimales
    Par Fanows dans le forum IHM
    Réponses: 2
    Dernier message: 27/05/2008, 12h25
  2. c'est encore moi, et ça ne marche toujours pas!
    Par mastertoche dans le forum JBuilder
    Réponses: 1
    Dernier message: 06/09/2006, 14h09
  3. [maven 2] plugin ejb. . . (encore moi. . .)
    Par Lynk HIROSUE dans le forum Maven
    Réponses: 15
    Dernier message: 08/08/2006, 11h45

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