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 d'une DLL externe : type de paramètre à passer [WD14]


Sujet :

WinDev

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 21
    Par défaut Appel d'une DLL externe : type de paramètre à passer
    Bonjour à tous,

    Afin d'établir une connexion depuis Windev avec un automate je dois faire appel à une DLL externe depuis Windev mais ça coince au niveau des paramètres à passer à la fonction MBTConnect dont voici le prototype :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    LONG MBTConnect(
    IN LPCTSTR szHostAddress, /* remplacé par un entier système (censé remplacer les pointeurs)  et une chaîne (2ème essai)*/
     
    IN WORD port, // remplacé par un entier sur deux octets
    IN BOOL useTCPorUDP, //remplacé par un booléen
    IN DWORD requestTimeout,//remplacé par un entier
    OUT HANDLE *hSocket);//remplacé par un entier système
    A l' exécution l'appel de la DLL déclenche une erreur fatale sûrement due à un mauvais typage des paramètres mais je ne sais dire le(s)quel(s).

    Merci d'avance

  2. #2
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 125
    Par défaut
    Je dirais qu'il faut écrire quelque chose du genre :

    s
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    zHostAddress est une chaine fixe sur 100    // essentiel pour que ca corresponde au C */
     
    LONG MBTConnect(
    IN LPCTSTR szHostAddress, /* ecrire : &szHostAddress*/
     
    IN WORD port, // remplacé par un entier sur deux octets : Ok
    IN BOOL useTCPorUDP, // remplacé par un booléen : Si ca ne fonctionne pas, utilise un entier
    IN DWORD requestTimeout,//remplacé par un entier : Ok
    OUT HANDLE *hSocket);//remplacé par un entier système : il faut plus d'information sur la spec pour connaitre le type Handle et savoir s'il faut au préalable allouer l'espace nécessaire ou si un simple entier suffit

    Bob.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 21
    Par défaut
    Merci Bob de ta réponse. Je tente ça dès demain. Concernant le handle il est précisé qu'il se rapporte à la connexion établie. Son type ne semble pas explicitement indiqué (p.13) http://www.wago.com/wagoweb/document...2/m931200e.pdf.

  4. #4
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 125
    Par défaut
    Oups, je corrige une petite erreur, il faut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    zHostAddress est une chaine sur 100
    Sans le mot "fixe"

    Bob.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 21
    Par défaut
    Alors je viens de tester la solution proposée et effectivement ça marche ! C'est le cas également avec une chaîne fixe.
    Cependant je bute maintenant sur la déconnexion.
    Je suppose que la handle crée lors de l'appel de la fonction MBTConnect doit être passé en paramètre d'entrée de la fonction MBTDisconnect.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    LONG MBTDisconnect(
    IN HANDLE hSocket);
    J'ai donc déclaré hsocket en tant que variable globale à ma fenêtre pour le passer à la fonction MBTDisconnect mais le code d'erreur renvoyé indique un handle non valide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Disconnect est un entier
    Disconnect=API("MBT.DLL","MBTDisconnect",&hsocket)
    Info(Disconnect)
    Faut-il procéder autrement ?

  6. #6
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 125
    Par défaut
    Le code est presque bon, il ne faut juste pas mettre l'esperluette "&" dans l'appel à disconnect.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Disconnect=API("MBT.DLL","MBTDisconnect",hsocket)
    Par contre, pour que ça fonctionne, je pense que pour la connexion il faudrait utiliser "&hsocket" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MBTConnect (&szHostAddress, port, requestTimeout, &hSocket)
    Bob.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 21
    Par défaut
    J'ai récupéré le contenu de pReadbuffer avec comme courant d'entrée 4,2mA, 5mA, 16mA et 20mA. Le décodage de l'information supposerait de connaître le système de numération utilisé : ça semble içi plutôt aléatoire, quoiqu'il y ait une ressemblance avec certains symboles utilisés dans Word.
    L'exploitation des données telles quelles me semble vraiment compliquée.
    Images attachées Images attachées  

  8. #8
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 125
    Par défaut
    Citation Envoyé par naspen Voir le message
    J'ai récupéré le contenu de pReadbuffer avec comme courant d'entrée 4,2mA, 5mA, 16mA et 20mA. Le décodage de l'information supposerait de connaître le système de numération utilisé : ça semble içi plutôt aléatoire, quoiqu'il y ait une ressemblance avec certains symboles utilisés dans Word.
    L'exploitation des données telles quelles me semble vraiment compliquée.
    En fait c'est je pense, relativement simple. Par contre je ne pensais pas qu'il convertirais en ASCII pour affichage. As-tu bien utilisé le code que je proposais avec le type Buffer ?

    Si oui, essaie les différentes solutions suivantes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    trace(ASC(pReadBuffer[[1]]), ASC(pReadBuffer[[2]]))
    trace(numeriqueverschaine("d", pReadBuffer[[1]]), numeriqueverschaine("d", pReadBuffer[[2]])
    trace(numeriqueverschaine("x", pReadBuffer[[1]]), numeriqueverschaine("x", pReadBuffer[[2]])
    Pour valider les résultat il faut aussi que tu ais une idée des plages de valeur attendue ?

    Bob.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 21
    Par défaut
    Oui le type buffer sur 2 a bien été utilisé. La plage de valeurs attendue s'étend de 0 à 65535.
    Ce serait vraiment surprenant que les données envoyées soient converties en ASCII.
    Week-End oblige je vais devoir attendre lundi avant d'essayer ta solution.

    Merci encore pour ton aide ô combien précieuse

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 21
    Par défaut
    Je viens de tester et une fois encore tu as tapé dans le mille !
    Après décodage pReadBuffer[1] et pReadBuffer[2] contiennent les 2 octets indiquant la valeur de mon entrée analogique. En appliquant un décalage de 7 bits à pReadBuffer[1] qui est l'octet de poids fort et en l'ajoutant à pRreadBuffer[2] je retrouve la valeur de mon entrée analogique avec une plage de variation de 0 à 65535.

    Vraiment....Merci pour ton aide!

  11. #11
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 125
    Par défaut
    Citation Envoyé par naspen Voir le message
    Je viens de tester et une fois encore tu as tapé dans le mille !
    Après décodage pReadBuffer[1] et pReadBuffer[2] contiennent les 2 octets indiquant la valeur de mon entrée analogique. En appliquant un décalage de 7 bits à pReadBuffer[1] qui est l'octet de poids fort et en l'ajoutant à pRreadBuffer[2] je retrouve la valeur de mon entrée analogique avec une plage de variation de 0 à 65535.

    Vraiment....Merci pour ton aide!
    Vraiment, pas de quoi, c'est toujours un plaisir.

    Pense à marquer le sujet "Résolu"

    Bob

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/02/2014, 09h53
  2. Réponses: 2
    Dernier message: 23/02/2010, 18h31
  3. [WD14] Type Variant dans l'appel d'une DLL
    Par GuiGui46 dans le forum WinDev
    Réponses: 3
    Dernier message: 11/06/2009, 14h08
  4. Réponses: 1
    Dernier message: 11/04/2007, 11h45
  5. Appel aux fonctions d'une DLL externe ??
    Par Fbartolo dans le forum Access
    Réponses: 7
    Dernier message: 21/11/2005, 17h54

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