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

WinDev Discussion :

Appel de fonctions dans une DLL [WD15]


Sujet :

WinDev

  1. #1
    Membre actif Avatar de thierrybatlle
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Tarn (Midi Pyrénées)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 618
    Points : 222
    Points
    222
    Par défaut Appel de fonctions dans une DLL
    Bonjour,

    Je dois utiliser une DLL et je n'arrive pas à utiliser les fonctions API de Windev.

    Voici la documentation de la fonction :
    Fonction d'information sur la Dll
    int Get_Identity(char *reponse);
    retour = compte-rendu d'exécution (0 exécution correcte)
    reponse = pointeur sur chaine de caractères destinée à recevoir les données d'identité de la Dll


    Voici comment je l'utilise :
    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
     
    nInst est un entier
    nAdresse est un entier système
    sResultat est une chaîne
     
    nInst = ChargeDLL("MI_F3010.dll" )
    SI nInst = 0 ALORS
    	Erreur(ErreurInfo())
    SINON
    	Info("DLL OK")
            API("MI_F3010.dll", "Init_DLL","",0)
    	API("MI_F3010.dll","Get_Identity",&nAdresse)
    	sResultat = ChaîneRécupère(nAdresse,crAdresseASCIIZ)
    	DéchargeDLL(nInst)
    FIN
    J'ai la fonction "Init_DLL" qui fonctionne parfaitement le code de retour correspond bien à la documentation fournie. Idem pour la fonction "Get_Identity" elle fonctionne pas de code d'erreur.

    Mon erreur vient au moment où je veux récupérer le résultat avec chaineRécupère.

    Si quelqu'un a des pistes ou une solution ?

    Merci bien.

  2. #2
    Membre confirmé
    Profil pro
    Freelance
    Inscrit en
    Avril 2003
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Avril 2003
    Messages : 393
    Points : 492
    Points
    492
    Par défaut
    Bonjour,

    sResultat est toujours vide ?

    Vince

  3. #3
    Membre actif Avatar de thierrybatlle
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Tarn (Midi Pyrénées)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 618
    Points : 222
    Points
    222
    Par défaut
    sResultat ne m'affiche rien car l'application plante à ce moment là, dès l'exécution de ChaîneRécupère.

  4. #4
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    Lorsque le prototype en C est "int Get_Identity(char *reponse);", c'est que l'API attend une zone mémoire déjà allouée pour la remplir. Le problème est le suivant : quelle taille donner à la zone mémoire ? La documentation de l'API indique-t-elle une taille minimale de la chaîne à passer en paramètre ?

    Sinon le code WLangage qui devrait fonctionner c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sResultat est une chaine ASCIIZ sur 100 // ou plus si nécessaire
    API("MI_F3010.dll","Get_Identity",&sResultat)

  5. #5
    Membre actif Avatar de thierrybatlle
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Tarn (Midi Pyrénées)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 618
    Points : 222
    Points
    222
    Par défaut
    Merci,

    j'utilise maintenant le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    szSResultat est une chaîne ASCIIZ sur 1024
    API("MI_F3010.dll","Get_Identity",&nAdresse)
    szSResultat = ChaîneRécupère(nAdresse,crAdresseUNICODE)
    Le seul problème est que je récupère <EOT> et non pas la chaine :
    "MI_F3010.DLL béta ......."

    Merci.

  6. #6
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    C'est quoi "nAdresse" dans votre dernier code ?
    Pourquoi passer l'adresse d'une adresse à l'API ?

    Si la chaîne à récupérer est de l'ANSI, le code que j'ai fourni dans mon premier message devrait fonctionner. Il ne fonctionne pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    sResultat est une chaine ASCIIZ sur 100 // ou plus si nécessaire
    API("MI_F3010.dll","Get_Identity",&sResultat)
    Si la chaîne à récupérer est de l'UNICODE, il suffit de "réinterpréter" le contenu de la chaîne en UNICODE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    sResultat est une chaine ASCIIZ sur 100 // ou plus si nécessaire
    API("MI_F3010.dll","Get_Identity",&sResultat)
    sUNICODE est une chaine UNICODE = ChaîneRécupère(&s,crAdresseUNICODE)

  7. #7
    Membre actif Avatar de thierrybatlle
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Tarn (Midi Pyrénées)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 618
    Points : 222
    Points
    222
    Par défaut
    Merci bien,

    Cela fonctionne, mais pas avec chaineRécupère car il ne prend en paramètre qu'un entier.

    Par contre en faisant comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
           szSResultat est une chaîne ASCIIZ sur 100
           API("MI_F3010.dll","Get_Identity",&szSResultat)
           Trace(szSResultat)
    J'ai directement la valeur dans ma variable szSResultat.

    Bonne continuation à tous.

  8. #8
    Membre expérimenté Avatar de klbsjpolp
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 065
    Points : 1 322
    Points
    1 322
    Par défaut
    Est-ce que la discussion est ?
    «Un problème bien défini est un problème à moitié résolu.»

  9. #9
    Membre actif Avatar de thierrybatlle
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Tarn (Midi Pyrénées)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 618
    Points : 222
    Points
    222
    Par défaut
    Rebonjour,

    J'ai une autre question.
    voici la documentation de la fonction à exécuter :
    Chaque fonction d'accès aux registres ouvre la ligne de communication selon les paramètres implicites initialisés par
    l'utilisation des fonctions de configuration du type Set_Interface_...()
    Après exécution de la fonction la ligne de communication est refermée.
    Chaque registre est une unité de 4 octets pouvant être atteint sous forme d'1 seul "int" ou de 4 "char" successifs.

    int Lecture_registre(int numero_de_registre, int nombre_de_registres, int *ptr);
    retour = compte-rendu d'exécution (0 exécution correcte)
    numero_de_registre = numéro du 1er registre à lire
    nombre_de_registres = nombre de registres successifs à lire
    ptr = pointe sur un tableau d'entiers (4 octets) pouvant contenir au moins nombre de registres éléments
    Ma question est :
    Comment lire les données en retour qui est un tableau d'entier ?
    De quel type doit mon pointeur sur l'adresse *ptr ?

    Merci.

  10. #10
    Membre expérimenté Avatar de klbsjpolp
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 065
    Points : 1 322
    Points
    1 322
    Par défaut
    Ta variable ptr semble être un tableau de int de dimension nombre_de_registres.
    «Un problème bien défini est un problème à moitié résolu.»

  11. #11
    Membre actif Avatar de thierrybatlle
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Tarn (Midi Pyrénées)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 618
    Points : 222
    Points
    222
    Par défaut
    Bonjour,

    J'ai bien compris le principe de la fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    API("MI_F3010.dll", "Lecture_registre",121,1,MaVariable)
    - 121 correspond au numéro de registre à lire. Avec l'exemple il y des données en hexa dans ce numéro de registre.
    - 1 le nombre de registre à lire. L'application exemple utilise 1 par défaut.
    - MaVariable si je la type en entier la valeur de retour est -1 si je met "une chaine ASCIIZ sur 100" ou un "buffer sur 100" la valeur de retour est ÿÿÿÿ

    Alors ma question est comment je dois typer ma variable ?

    La documentation de la fonction est dans un post au dessus.

    Merci bien.

  12. #12
    Membre expérimenté Avatar de klbsjpolp
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 065
    Points : 1 322
    Points
    1 322
    Par défaut
    Citation Envoyé par klbsjpolp Voir le message
    Ta variable ptr semble être un tableau de int de dimension nombre_de_registres.
    «Un problème bien défini est un problème à moitié résolu.»

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/09/2012, 10h12
  2. Type d'argument pour appel de fonction dans une DLL
    Par Lio590 dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 06/07/2011, 16h28
  3. Appel de fonction dans une DLL
    Par vtk37 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 30/04/2009, 08h58
  4. probleme appel de fonction dans une DLL
    Par sylvain.cool dans le forum C++
    Réponses: 12
    Dernier message: 19/06/2008, 17h00
  5. [ARM] Appel d'une fonction dans une dll
    Par mosfet dans le forum Autres architectures
    Réponses: 3
    Dernier message: 28/03/2007, 08h15

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