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

Résolu
JSilvere Messages postés 161 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 11 février 2013 - 30 mars 2011 à 11:46
JSilvere Messages postés 161 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 11 février 2013 - 30 mars 2011 à 17:26
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

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
30 mars 2011 à 11:54
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)
3
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
30 mars 2011 à 12:25
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
3
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
30 mars 2011 à 12:28
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)
3
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
30 mars 2011 à 11:56
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
0

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

Posez votre question
JSilvere Messages postés 161 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 11 février 2013
30 mars 2011 à 11:56
Merci bien
0
JSilvere Messages postés 161 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 11 février 2013
30 mars 2011 à 11:59
oui... en fait ma fonction est dans une dll..., ca change tout non?
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
30 mars 2011 à 12:04
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 ?).
0
JSilvere Messages postés 161 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 11 février 2013
30 mars 2011 à 12:07
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)
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
30 mars 2011 à 12:10
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
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
30 mars 2011 à 12:14
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 ?
0
JSilvere Messages postés 161 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 11 février 2013
30 mars 2011 à 12:16
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"
0
JSilvere Messages postés 161 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 11 février 2013
30 mars 2011 à 12:38
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
0
JSilvere Messages postés 161 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 11 février 2013
30 mars 2011 à 12:40
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 ^^
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
30 mars 2011 à 12:41
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
0
JSilvere Messages postés 161 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 11 février 2013
30 mars 2011 à 12:45
Ç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???
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
30 mars 2011 à 12:49
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.
0
JSilvere Messages postés 161 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 11 février 2013
30 mars 2011 à 12:53
Ok ba en tout cas je te remercie bien pour ton aide d'aujourd'hui, tu m'a enlevé un tronc du pied ^^
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
30 mars 2011 à 13:03
Bienvenu
0
JSilvere Messages postés 161 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 11 février 2013
30 mars 2011 à 15:43
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...
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
30 mars 2011 à 17:16
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)
0
Rejoignez-nous