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

WinDev Discussion :

problème utilisation API et Pointeur


Sujet :

WinDev

  1. #1
    Nouveau membre du Club
    problème utilisation API et Pointeur
    Bonjour je travail actuellement au branchement d'un lecteur RFID a une interface Windev
    Pour cela je passe par l'API fourni par le revendeur qui est en C
    J'arrive a brancher l'API mais j'éprouve des difficulté pour l'appel de certaine fonction surtout celle utilisant des pointeur.
    j'ai donc une fonction definis comme suis par l'API

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    int CV_SetRemoteIPPort(unsigned char *ip, int port)


    malgré la documentation je n'arrive pas a faire passer d'adresse IP en utilisant les fonction API de Windev
    typiquement :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    sChaîne est une chaîne sur 100
    sChaîne = "192.168.1.100"
    Struct est une structure
    aChaîne est un entier
    FIN
    UneStruct est une Struct
    UneStruct:aChaîne = &sChaîne
    API("CVAPIV01_DESFire", "CV_SetRemoteIPPort", &UneStruct,2000)



    pour vérifier j'utilise la fonction CV_GetIP définis comme suis:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    int CV_GetIP(int DeviceAddress, unsigned char* IP)


    avec le code suivant

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    IP est une chaîne sur 100
    StructIP est une structure
    monIP est un entier
    FIN
    structIP est une StructIP
    structIP :monIP = &IP
    API("CVAPIV01_DESFire", "CV_GetIP",0,&structIP ) 
     
    Info("structchaine:"+ChaîneRécupère(structIP :monIP ,crAdresseASCIIZ))



    Malheureusement je ne récupère rien je ne suis pas sure de bien comprend comment remplacer l'utilisation des pointeur dans l'API avec Windev

    Si quelqu'un connais une solution ?

    Merci

  2. #2
    Membre confirmé
    Bonjour,

    Il y a une page dédiée à la conversion des types C

    http://doc.pcsoft.fr/fr-FR/?1514020&...nversion_types

    Dans votre cas je pense que ceci doit fonctionner

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    ls_Ip est une chaine = "192.168.1.100"
     
    API("CVAPIV01_DESFire", "CV_SetRemoteIPPort", &ls_Ip,2000)


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ls_Ip est une chaine
     
    API("CVAPIV01_DESFire", "CV_GetIP",0,&ls_Ip )
     
    info(ls_Ip)


    Si ça ne fonctionne pas passez par des tableaux d'entier sur 1 octets sans signe et envoyez l'adresse du tableau.

    Cordialement

    Madsl@nD

  3. #3
    Nouveau membre du Club
    Merci madsland

    Bon je commence a débloquer certaines situations dont celle présentée.
    c’était une erreur de ma part en effet dans la doc est précisé que cette fonction n'est accessible que part RS232
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Description Get IP address with RS232 communication type
    alors que je suis en UDP enfin bref. j'ai réussi a faire fonctionner une autre fonction définis comme suit:
    Code c# :Sélectionner tout -Visualiser dans une fenêtre à part
    int CV_GetVersionAPI( char *VersionAPI )


    par le code Windev
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //int CV_GetVersionAPI( char *VersionAPI )
    //OK
    VersionAPI est un tableau de 64 entier sans signe sur 1 octet
    apistatus est une entier
    apistatus = API(sDllname,"CV_GetVersionAPI",&VersionAPI)
     
    SAI_Texte1 = SAI_Texte1+RC+"api status"+apistatus
    SAI_Texte1 =SAI_Texte1+RC+"ipget:"+ChaîneRécupère(&VersionAPI,crAdresseASCIIZ)


    j'avais bien trouver le tableau de conversion des types C mais je ne suis pas sur de bien comprendre les passage par référence ou par pointeur dans la fonction API(...) de Windev
    typiquement

    sur une fonction comme la suivante,
    Code c# :Sélectionner tout -Visualiser dans une fenêtre à part
    int CV_GetSerialNum (int DeviceAddress, int &CurrentAddress, char *SerialNum)


    je ne comprend pas qu'elles équivalences faire pour les symboles & et *
    j'aurais écris :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tabCurrentAdd est un tableau de entier sur 1
    tabSzSerialnum est un tableau de 9 entier sans signe sur 1 octet
    nSserialnumber est une entier
    nSserialnumber = API(sDllname,"CV_GetSerialNum",0,tabCurrentAdd,&tabSzSerialnum)


    Malheureusement j'ai l'erreur suivante
    Le paramètre n°4 n'est pas d'un type valide pour AppelDLL().

    Je suis partie du code exemple en c# fournis :
    Code c# :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
    private void btnGetSerialNumber_Click(object sender, EventArgs e)
            {
                int[] CurrentAdd = new int[1];
                byte[] SerialNUM = new byte[9];
                for (int i = 0; i < 9; i++)
                    SerialNUM[i] = 0x00;
                String aSN = "";
                if (0 == CV_GetSerialNum(0, CurrentAdd, SerialNUM))
                {
                    SerialNUM[8] = 0x00;
                    if (SerialNUM[0] == 0xFF)
                        aSN = "FFFFFFFF";
                    else
                    {
                        for (int i = 0; i < 64; i++)
                        {
                            if (0 == SerialNUM[i])
                                break;
                            else aSN += Convert.ToString(Convert.ToChar(SerialNUM[i]));
                        }
                    }
                    tbSerial.Text = aSN;
                }
            }


    si une petite idée ?
    Merci

  4. #4
    Membre confirmé
    Bonjour,

    Avez-vous essayé cela ?

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tabCurrentAdd est un tableau de 1 entier sur 1 octet
    tabSzSerialnum est un tableau de 9 entier sur 1 octet
    nSserialnumber est une entier
    nSserialnumber = API(sDllname,"CV_GetSerialNum",0,&tabCurrentAdd,&tabSzSerialnum)


    Cordialement

    Madsl@nD

  5. #5
    Nouveau membre du Club
    Citation Envoyé par madsland Voir le message
    Bonjour,

    Avez-vous essayé cela ?

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tabCurrentAdd est un tableau de 1 entier sur 1 octet
    tabSzSerialnum est un tableau de 9 entier sur 1 octet
    nSserialnumber est une entier
    nSserialnumber = API(sDllname,"CV_GetSerialNum",0,&tabCurrentAdd,&tabSzSerialnum)


    Cordialement

    Madsl@nD
    Apres un test rapide, cela ne fonctionne pas. Mon tableau "tabSzSerialnum" reste vide, et lors du debug j'ai un api() = -1 sans autres indications

  6. #6
    Expert éminent
    Pour ton tabSzSerialnum, j'aurais laissé un chaine et ton CurrentAdd, j'aurais dit un entier sans signe, vu que c'est censé être une adresse.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sSerialNum est chaine fixe sur 8
    nCurrentAdd est un entier sans signe sur 1 octet
    nSserialnumber est une entier
    nSserialnumber = API(sDllname,"CV_GetSerialNum",0,&nCurrentAdd ,&sSerialNum)


    A tester...

    Autre piste :vérifie le dimensionnement de tes entiers (sans signe, 1, 2 ou 4 octets)...
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Make it real not fantasy.

  7. #7
    Membre confirmé
    Je ne sais pas si c'est le problème mais déjà il y a une erreur dans ce que j'ai écrit.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    tabCurrentAdd est un tableau de 1 entier


    il faut enlever 'sur 1 octet' puisque c'est un int.

    à tester ...

  8. #8
    Nouveau membre du Club
    Merci pour toute votre aide , je progresse a grand pas.
    Du coup en plongeant dans le code exemple en C il semblerais que je doive d'abord appeler la fonction
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    int CV_SetRemoteIPPort(unsigned char *ip, int port)

    Pour que les autre fonctions sachent vers quoi communiquer.

    J'avais une erreur sur l'appel a API() de Windev a l'appel de CV_GetSerialNum mais le voila résolus.
    du coup je pense avoir résolu le problème en corrigeant mon appel a la fonction CV_SetRemoteIPPort

    j'ai donc un retour qui fonctionne avec le code suivant

    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
    25
    26
    27
    28
    sDllname est une chaîne = "CVAPIV01_DESFire"
    nInfodll est un entier
    nInfodll = ChargeDLL(sDllname)
     
    //CV_SetCommunicationType
    nComType est un entier
    nType est un entier // Type C :INT
    nComType=API(sDllname,"CV_SetCommunicationType",2)
    SAI_Texte1 = SAI_Texte1+RC+"setcomtype"+nComType
    nType=API(sDllname,"CV_GetCommunicationType")
    SAI_Texte1 = SAI_Texte1+RC+"getCommType"+nType
    nStatus est un entier
    nStatus = API(sDllname,"CV_UDPRun",2000)
    SAI_Texte1 = SAI_Texte1+RC+"udprun"+nStatus
     
    sIpset est une chaîne ASCIIZ sur 20
    sIpset = "192.168.1.100"
    nStatussetip est une entier
    nStatussetip = API(sDllname,"CV_SetRemoteIPPort",&sIpset,2000) //Mon problème était ICI
    SI nStatussetip = 0 ALORS
    	Info("connection ok")
    FIN
    tabCurrentAdd est un tableau de 1 entier sur 1 octet
    tabSzSerialnum est un tableau de 9 entier sur 1 octet
    nSserialnumber est une entier
    nSserialnumber = API(sDllname,"CV_GetSerialNum",0,&tabCurrentAdd,&tabSzSerialnum)
    SAI_Texte1 = SAI_Texte1+RC+"serialnum status"+nSserialnumber
    SAI_Texte1 =SAI_Texte1+RC+"serialnumber:"+ChaîneRécupère(&tabSzSerialnum,crAdresseASCIIZ)


    j'ai tester vos solution elle fonctionne aussi (Merci beaucoup )
    Juste une question annexe, quand tu me demande de vérifier le dimensionnement de mes entiers je ne comprend pas ce que je doit faire.

    autre chose je ne comprend pas encore très bien les équivalence Windev et C mais ça va venir. M'enfin si vous avez des exemple pour bien comprendre ou des lien utiles je prend.

    Merci encore pour le coup de pouce

    Je continue l'exploration des différentes fonctions en espérant ne pas rencontrer trop de problème.

    Cordialement

###raw>template_hook.ano_emploi###