Récupérer la valeur que me réenvoi ma fonction

Résolu
Messages postés
161
Date d'inscription
lundi 28 février 2011
Statut
Membre
Dernière intervention
11 février 2013
-
Messages postés
161
Date d'inscription
lundi 28 février 2011
Statut
Membre
Dernière intervention
11 février 2013
-
Bonjours, je débute en programmation, et je déclare une fonction qui me réenvoi un long, mais je n'arrive pas à récupérer ce long pour pouvoir l'exploiter...

Si quelqu'un à un petit exemple de code afin de récupérer le long fournis par cette fonction :
public declare function exemple()As long

21 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Salut

Tout simplement
Dim monResultat As Long
monResultat = exemple

et bien sûr, dans ta fonction, il faudra fournir la valeur
exemple = 4012

Vala
Jack, 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)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Oui, les String sont gérées indirectement par VB.
Comme l'indique le nom de tes 2 premiers paramètres, pRequest et pDataptr, il doit falloir fournir les pointeurs vers ces chaines et pas les chaines elles-mêmes.

Essaye ce genre de format :
Dans la déclaration, tu laisses ByVal devant ces paramètres et pour fournir les valeurs :
monResultat = FxpCommand(ByVal StrToPtr(maChaine), ...

+ tu ajoutes ceci :
Dans la déclaration de ta page de code :
Private Declare Sub CopyMemory_Long Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Long, _
                                                                          ByVal hpvSource As Long, _
                                                                          ByVal cbCopy As Long)

et ajoute cette fonction interne à ton code :
Private Function StrToPtr(ByRef Chaine As String) As Long
    ' Remplace la fonction StrPtr (interdite pour Net)
    ' Voir explications    http://www.romanpress.com/Articles/Strings_R/Strings.htm
    Dim Resultat As Long
    CopyMemory_Long Resultat, ByVal VarPtr(Chaine), 4
    StrToPtr = Resultat
End Function
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
J'en oublie toujours un bout, désolé :
Dans la déclaration de ta fonction, il faut remplacer String par Long pour les 2 premiers paramètres (le langage C ne connaissant pas les String, mais les adresses mémoires où se trouvent les chaines (pointeur)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
NB : ta déclaration de fonction n'est pas correcte : Supprime le mot Declare
Ce mot n'existe que dans les déclarations de fonctions issues des ressources externes comme les DLL.
Public Function Exemple() As Long
Messages postés
161
Date d'inscription
lundi 28 février 2011
Statut
Membre
Dernière intervention
11 février 2013

Merci bien
Messages postés
161
Date d'inscription
lundi 28 février 2011
Statut
Membre
Dernière intervention
11 février 2013

oui... en fait ma fonction est dans une dll..., ca change tout non?
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Ok, alors laisse le Declare.

Le Public n'est nécessaire que si la déclaration doit être accessible depuis une autre page de code que celle dans laquelle est est déclarée, par exemple si tu déclares la fonction dans un module et que tu veux l'utiliser dans le code d'une forme
.
Il faudrait connaitre la manière dont tu as créé la fonction dans ta DLL pour savoir si l'appel est complet (pas de paramètres à fournir ?).
Messages postés
161
Date d'inscription
lundi 28 février 2011
Statut
Membre
Dernière intervention
11 février 2013

Si j'ai 4 paramètres à fournir et je les fournis bien(je pense), le problème est que je n'arrive pas à récupérer le long qu'elle me renvoi donc je ne sais pas vraiment si elle fonctionne ^^

(J'ai un fichier .h qui me permet de savoir comment la déclarer)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
NB again : prend bien soin de nommer ta fonction de manière qu'il n'y ait pas d'ambigüité avec un mot réservé du langage.

Au fait, si, il manque un bout : Il faut lui dire comment s'appelle le fichier DLL et où il se trouve
Public Declare Function Exemple Lib "maDLL.dll" () As Long

ou (pas recommandé)
Public Declare Function Exemple Lib "c:\mon répertoire\maDLL.dll" () As Long
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Si tu dois forunir des paramètres à la DLL, il faut inclure la déclaration des noms et types de chaque paramètre, exemple
Public Declare Function Exemple Lib "maDLL.dll" (ByRef Param1 As Long, ByRef Param2 As Long) As Long
Il faut, bien entendu, respecter scrupuleusement le format que tu as utilisé dans la fonction source.

As-tu des String à fournir ou uniquement des chiffres ?
Messages postés
161
Date d'inscription
lundi 28 février 2011
Statut
Membre
Dernière intervention
11 février 2013

Voici comment je l'ai déclaré :
Option Explicit

Public pRequest As String
Public pDataptr As String


Public Declare Function FxpCommand Lib "C:\Program Files\Cscape\FxServe.dll" Alias "?FxpCommand@@YGHPBDPAPAEPAHPAUHWND__@@@Z" (ByVal pRequest As String, ByVal pDataptr As String, ByVal pDataSise As Long, ByVal h As Long) As Long


et comment je l'appel :
Private Sub Command1_Click()
Dim retour As Long


pRequest = "open"
pDataptr = "Name:Default1|USB-to-Serial Port Driver (COM3)|Timeout:1000"


Call FxpCommand(pRequest, pDataptr, 0, 0)

retour = FxpCommand
Label1.Caption = retour

End Sub


Déja ca ne fait pas complètement planter VB, c'est donc que je l'appele bien ^^

Par conte depuis que j'ai ajouté le long retour = FxpCommand ca plante "l'argument FxpCommand n'est pas facultatif"
Messages postés
161
Date d'inscription
lundi 28 février 2011
Statut
Membre
Dernière intervention
11 février 2013

Ok je met en application ^^

Par conte il me dit qu'il y as une erreur au niveau de CopyMemory_Long : procédure sub ou fonction non définie
Messages postés
161
Date d'inscription
lundi 28 février 2011
Statut
Membre
Dernière intervention
11 février 2013

Désolé lol je vien de me rendre conte du pourquoi du comment lol je l'ai déclaré en privé dans mon module de déclaration ^^
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Si tu as bien mis cette déclaration dans la partie Declarations de la même page de code que celle dans laquelle tu as placé la fonction StrToPtr, ça devrait marcher.
Sinon, ajoute Public devant cette déclaration pour qu'elle soit accessible de n'importe où dans le code
Messages postés
161
Date d'inscription
lundi 28 février 2011
Statut
Membre
Dernière intervention
11 février 2013

Ça fonctionne , c'est super, ca fais un bon bout de temps que j'essaie de faire fonctionner cette Dll, c'est génial

Dit moi, si je rencontre d'autres problèmes avec cette Dll dans un avenir proche, es-ce-que si je poste à la suite de ces messages tu recevra un e-mail te demandant de lire ma nouvelle question???
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Content que tu aies trouvé ta soluce.
Non, je ne me fais pas alerter; ma boîte aux lettres est déjà bien assez sollicitée comme ça.
Non, repose une nouvelle question en donnant le max de détail et de précision (sans oublier le genre de détail que tu t'adresses à une DLL par exemple, lol).
Pas sûr que tu trouves de l'aide aussi rapidement qu'aujourd'hui où le forum s'est transformé en chat, mais si ta question est précise, tu trouveras une bonne âme pour te répondre.
Messages postés
161
Date d'inscription
lundi 28 février 2011
Statut
Membre
Dernière intervention
11 février 2013

Ok ba en tout cas je te remercie bien pour ton aide d'aujourd'hui, tu m'a enlevé un tronc du pied ^^
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Bienvenu
Messages postés
161
Date d'inscription
lundi 28 février 2011
Statut
Membre
Dernière intervention
11 février 2013

Hey, on ne sais jamais si tu repassais dans le coin, j'ai une HWND à entrer dans la fonction de ma dll, aurais tu une fonction miracle comme l'autre qui transformais un string en pointeur, il me faudrais transformer un long en HWND...
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Es-tu sûr que ta fonction requiert le pointeur du handle et pas le handle lui même ?
Voir
Dim pHandle As Long
pHandle = VarPtr(maVariableLong)


PS : je passais vraiment par hasard. Si tu as de nouvelles questions, repose un nouveau post en mettant bien toutes les explications (ou lien vers précédente discution)