Récupérer un pointeur envoyé à une DLL

Résolu
JSilvere Messages postés 161 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 11 février 2013 - 19 mai 2011 à 10:04
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 21 mai 2011 à 14:13
Bonjour,

Je suis en train de créer un programme utilisant une DLL développée en C++...

Cette DLL me sert à me connecter à un automate. J'arrive à commander les fonction "connecter","déconnecter" sans sousils.

Je planche sur la fonction "lister" qui fonctionne de la sorte:
-J’envoie un pointeur donnant la commande : LIST
-La DLL communique et me renvoi un long "d'état" 0 qui signifie qu'elle à bien effectué l'action demandée...

Mon problème : Je ne parvient pas à récupérer la liste qu'elle est censée me renvoyer... Il est possible que cette liste soit accessible par le pointeur "LIST" que je lui ai envoyée...

Savez-vous comment je peu récupérer mon pointeur?

Merci d'avence pour vos réflèxions sur ce sujet
_______________________________________
Consommons autrement => enercoop

11 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
19 mai 2011 à 12:57
Salut

Ce pointer désigne quoi ? Une String ?

<lien intéressant> sur le stockage des string sous VB6
http://msdn.microsoft.com/en-us/library/ms811463

Le pointeur désigne l'adresse mémoire où est stockée le début de la chaine, mais les 4 premiers octets fournissent la longueur de la chaine, suivi de la chaine elle même.
Donc, il faut d'abord lire cette longueur, puis la donnée.

CopyMemory est la fonction qui te permettra d'accéder aux emplacements mémoire.
Exemple d'utilisation à coller dans un nouveau projet VB6 :
Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Private Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long
'

Private Sub Form_Load()

    Dim maChaine    As String
    Dim lLongueur   As Long
    Dim lPointeur   As Long
    Dim sChaineLue  As String
    
    ' La chaine à chercher
    maChaine =  "Super, Codes-Sources !"
    
    ' Recherche :
    ' Le pointeur de cette chaine = l'adresse de la structure BSTR
    lPointeur = StrPtr(maChaine)
    ' Longueur
    lLongueur = lstrlenW(lPointeur)
    ' Prépare la chaine de réception
    sChaineLue = String$(lLongueur, "*")
    CopyMemory ByVal StrPtr(sChaineLue), ByVal lPointeur, lLongueur * 2 ' x2 car UniCode
    
    ' Vérif
    If StrComp(sChaineLue, maChaine) =  0 Then
        MsgBox "Test réussi"
    Else
        MsgBox "Jack est bête"
    End If

End Sub

Précaution :
Les erreurs de manipulations d'adresse mémoire pouvant donner des crash, je te conseille vivement de sauvegarder ton appli avant de la tester

Vala
Jack, =fr MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
3
lesdis Messages postés 403 Date d'inscription mercredi 19 avril 2006 Statut Membre Dernière intervention 7 août 2020
19 mai 2011 à 11:52
Bonjour,

Ton pointeur est un pointeur de quel type?
Peux t'on avoir le prototype de la fonction appelée?

Les pointeurs n'existe pas a proprement parlé en VB, mais il existe des moyens pour travailler avec :

- L'emploi du mot clé Byref dans la déclaration de fonction.
- L'emploi de la classe System.Runtime.InteropServices.Marshall
- Les pointeurs en .net sont stocké sous la forme de IntPtr.

Bonne Prog
0
JSilvere Messages postés 161 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 11 février 2013
19 mai 2011 à 12:33
Pour envoyer la commande "LIST", j’envoie directement un string comprenant "LIST"...

Alors, malheureusement, je n'ai pas vraiment de détail en ce qui concerne les fonctions contenus dans la DLL, j’avance donc à taton avec de temps en temps une réponse d'un programmeur Irlandais travaillant dans l'entreprise ayant conçu la DLL...

-Pour l'emploi de Byref, je pensais que l'on ne pouvais pas appeler une fonction d'une DLL avec Byref, mais seulement avec Byval, peut tu m'en dire un peu plus la dessus?

-Je travail en VB6, et j'utilise une fonction me permettant (pour communiquer avec la DLL) de transformer un string en Ptr

ce qui m'intrigue, c'est que apparemment (je suis novice en programmation) le pointeur que j’envoie pour lancer ma commande peu me revenir en étant modifié, contenant certainement ce que je recherche, ou plutôt l'adresse d'ou est situé ce que je recherche....


_______________________________________
Consommons autrement => enercoop
0
JSilvere Messages postés 161 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 11 février 2013
19 mai 2011 à 14:25
Ok merci bien, ça me permet de mieux visualiser ce qu'est un pointeur

Voici comment j'ai déclaré la fonction à qui j’envoie la commande "LIST"...

Public Declare Function FxpCommand Lib "FxServe.dll" Alias "?FxpCommand@@YGHPBDPAPAEPAHPAUHWND__@@@Z" (ByVal pRequest As String, ByVal pDataptr As Long, ByVal pDataSize As Long, ByVal h As Long) As Long


Es-ce qu'a partir de ca vous pouvez savoir si il est possible ou non de récupérer un pointeur qui me permettrais de récupérer la liste des fichier présent sur la carte de mon automate?


_______________________________________
Consommons autrement => enercoop
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
19 mai 2011 à 17:11
Bah tout dépend du contenu de cette fonction.
Apparemment, elle renvoie un Long : Est-ce le pointeur ?
Si le pointeur est renvoyé par pDataptr, il faut que la variable soit déclarée ByRef.
Tout dépend donc de ta fonction C++.
0
JSilvere Messages postés 161 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 11 février 2013
19 mai 2011 à 22:40
En fait le long qu'elle me renvoi est un nombre, que je transmet à une autre fonction qui me renvoi un string avec le message correspondant au nombre
ex: 604=connexion timeout ; 0=" " soit que la fonction à réussi sa tache...

J'ai testé de déclarer Pdataptr en byref et le pdataptr une fois la fonction executé, pdataptr reste "LIST" ...

Je vais faire plus de tests demain matin, en tout cas merci bien pour ce dialogue, il m'as permis de mieux situer les choses


_______________________________________
Consommons autrement => enercoop
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
19 mai 2011 à 23:44
Je n'ai pas compris grand chose à tes explications.
Je crois avoir compris que la DLL est de toi, donc tu dois bien savoir où se trouve l'info qui représente ta chaine de retour, non ?
Qui dit chaine de retour, dit déclaration en ByRef : Tu lui fournis une variable vide et il te la remplira avec l'adresse de la chaine - c'est comme ça que je l'ai compris.
0
JSilvere Messages postés 161 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 11 février 2013
20 mai 2011 à 08:54
En fait, la DLL n'est pas de moi, et c'est là la difficulté des choses.

Donc je fais des essai pour tenter de comprendre comment elle fonctionne.

La Dll contient deux fonctions différentes : La première qui me sert à me connecter à l'automate, me déconnecter, faire la liste des fichier présents etc...
Cette fonction me renvoi un long.

Ce long est un message d'état, que j'envoi à la seconde fonction. Cette seconde fonction me traduit le Long en une phrase expliquant l'état de la commande que j'ai envoyé à la première fonction.

Mon but est de récupérer un pointeur lors de la commande "LIST" envoyé à la première fonction, sachant que ce pointeur n'est pas le Long Renvoyé par cette fonction...



_______________________________________
Consommons autrement => enercoop
0
JSilvere Messages postés 161 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 11 février 2013
20 mai 2011 à 09:13
Suite aux échanges sur ce poste, j'ai effectué différents essai.

Tout d'abord j'ai déclaré la fonction de la DLL en ByRef afin de lui permettre de modifier le string (qui commande la fonction :"OPEN" pour connecter, "QUIT" pour fermer la connexion, "LIST" pour obtenir la liste de fichier (c'est cette commande que j’essaie de faire fonctionner))
que je lui envoi.

Voici comment est déclaré la fonction :
Public Declare Function FxpCommand Lib "FxServe.dll" Alias "?FxpCommand@@YGHPBDPAPAEPAHPAUHWND__@@@Z" (ByRef pRequest As String, ByVal pDataptr As Long, ByVal pDataSize As Long, ByVal h As Long) As Long

Voici comment j’envoie la commande "LIST" :
Request =  "LIST"

retour = FxpCommand(ByVal (Request), ByVal StrToPtr(Dataptr), ByVal StrToPtr(0), 0)


retour est le long d'"etat" de la fonction que je récupère, il indique 0 lors de l'exécution, ce qui signifie que la fonction à bien fonctionné...

Je ne peu pas mettre "ByRef (Request)" , VB le refuse...

Request doit être un string et non un pointeur sinon le long "retour" prend la valeur numérique correspondant au message "commande not implanted"...

Une fois la fonction exécutée, Request à toujours la valeur "LIST", la fonction ne l'a pas modifié...

Voila ou j'en suis, je suis ouvert à toute réflexions de votre part, moi je suis un peu à cours d’imagination sur ce coup la.

_______________________________________
Consommons autrement => enercoop
0
JSilvere Messages postés 161 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 11 février 2013
20 mai 2011 à 09:22
Je viens de tester d'envoyer un pointeur pDataptr contenant le pointeur correspondant au long "0" et j'affiche dans un label le retour de ce pointeur.

Ce label m'écrit "??" serai-je sur la bonne piste?

Savez vous comment sous VB6 je peu traduire ce pointeur en String?


_______________________________________
Consommons autrement => enercoop
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
21 mai 2011 à 14:13
"Request à toujours la valeur "LIST""
Oui, normal puisque tu l'as passé ByVal.
ByVal contredit le ByRef de la définition. C'est autorisé, mais il y a de bonnes raisons pour l'utiliser, notamment lorsqu'on veut passer une constante.

Si pDataptr est le pointeur de la chaine renvoyée, il te suffit de lui fournir une variable de type Long que la DLL remplira.

"Savez vous comment sous VB6 je peu traduire ce pointeur en String"
Je t'ai donné un code entier pour le faire !
0
Rejoignez-nous