APPELER UNE FONCTION DEPUIS SON ADRESSE

MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 - 8 sept. 2006 à 01:27
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 - 25 nov. 2009 à 18:21
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/39481-appeler-une-fonction-depuis-son-adresse

cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
25 nov. 2009 à 18:21
Oui je l'ai corrigé depuis la beta de windows vista, mais j'ai jamais mis a jour la fiche.
Ce code date quand meme de 2006 ;)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
25 nov. 2009 à 17:04
Gaffe au DEP, EBArtSoft...
pas bon d'executer des données, Windows aime plus ça :/

demande un bout de mémoire avec un flag PAGE_EXECUTE_READWRITE et zou :o
tout le monde il est content ^^
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
8 févr. 2007 à 17:13
Tropic> non ce n'est pas encore implementé.
cs_Tropic Messages postés 90 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 1 février 2011
8 févr. 2007 à 16:52
Bonjour

Ma question est, peut-on appeler une fonction dans un autre progamme
du style
MyFunction2.Create "MonProjet.EXE::Mafonction",vbLong,vbLong
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
15 oct. 2006 à 21:28
santiago69> "Module1::Additionner" ne peut pas fonctionner car VB va chercher un fichier qui s'appelle "Module1.dll" hors je suppose qu'il n'y en a aucun sur ton pc. Cette methode ne s'utilise que lorsque l'on veux employer une fonction d'une dll externe.

@+
cs_santiago69 Messages postés 91 Date d'inscription jeudi 18 novembre 2004 Statut Membre Dernière intervention 17 décembre 2008
15 oct. 2006 à 19:52
Merci draluorg et EB,
EB felicitation pour cette classe.
Je trouve ca un peu con de noter quand on comprend rien, mais je trouve ca trop utile. Je viens de mettre 10.
cs_santiago69 Messages postés 91 Date d'inscription jeudi 18 novembre 2004 Statut Membre Dernière intervention 17 décembre 2008
15 oct. 2006 à 19:50
Effectivement, ca marche aussi bien en vbVDouble qu'en vbDouble.

Ce qui pose probleme, c'est uniquement le ByVal.

Par contre, je confirme que "Module1::Additionner" ne marche pas tandis que "AddressOf Additionner" marche.
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
15 oct. 2006 à 19:42
1- Effectivement c'est vbVDouble et pas vbDouble (mais les deux constantes sont identique donc rien a craindre de ce coté la)

2- Il faut declarer les arguments en ByVal et pas en ByRef l'omission du By... sous entend un ByRef donc erreur lors du passage des arguments la fonction attend un pointeur et tu lui sers une valeur d'ou le crash

3- Il faut reinitialiser l'objet CDelegate à chaque changement de fonction soit faire un Set MyDelegate nothing puis Set MyDelegate New CDelegate

avec tout ça ça devrait aller.

@+
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
15 oct. 2006 à 19:34
oup's j'avais pas vu le dernier message...

LoadLibrary est un api et doit donc etre declaré, mais de toutes facons ici il n'a aucun interet c'est juste dans le cas ou tu fais appel a une fonction contenue dans une dll qui n'est pas encore chargée

++
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
15 oct. 2006 à 19:29
Salut,

Essais en mettant vbVDouble a la place de VbDouble....

++
cs_santiago69 Messages postés 91 Date d'inscription jeudi 18 novembre 2004 Statut Membre Dernière intervention 17 décembre 2008
15 oct. 2006 à 19:27
J'ai essaye en remplacant
AddressOf Additionner
par
"Module1::Additionner"


Et la il bloque a la ligne 126 de ton module :
Err.Raise vbObjectError


J'ai essaye d'ajouter la ligne de draluorg :
If Not (Module) Then Module = LoadLibrary(Args(0)) 'Added by draluorg


Et il me sors :
"Procedure Sub ou Fonction non definie" sur "LoadLibrary"
cs_santiago69 Messages postés 91 Date d'inscription jeudi 18 novembre 2004 Statut Membre Dernière intervention 17 décembre 2008
15 oct. 2006 à 19:20
Salut EB,

Autant te dire tout de suite, j'y comprend rien, mais alors rien du tout ! Bon je vais essaye de pas te faire perdre ton temps alors pour l'instant j'essaye juste de faire marcher ta classe.

J'ai pris l'exemple le plus con du monde : un formulaire.
On rempli 2 cases avec des nombres et y'a 2 boutons : additionner et multiplier. Et j'essaie de faire apparaitre le resultat dans une troisieme case.

Le code du formulaire est :
'=================================================================
Private Operation As New CDelegate

Private Sub Command1_Click()
Operation.Create AddressOf Additionner, vbVDouble, vbDouble, vbDouble
Text3.Text = Operation(CDbl(Text1.Text), CDbl(Text2.Text))
End Sub

Private Sub Command2_Click()
Operation.Create AddressOf Multiplier, vbVDouble, vbDouble, vbDouble
Text3.Text = Operation(CDbl(Text1.Text), CDbl(Text2.Text))
End Sub
'=================================================================

Et j'ai un petit module a cote qui dit :
'=================================================================
Function Additionner(Val1 As Double, Val2 As Double) As Double
Additionner = Val1 + Val2
End Function

Function Multiplier(Val1 As Double, Val2 As Double) As Double
Multiplier = Val1 * Val2
End Function
'=================================================================

J'execute, je rentre deux valeurs, je lance l'addition et la je crash VB :o(
J'ai le probleme aussi bien en mode execution qu'en mode compile.
J'ai essaye d'executer pas a pas, tout va bien jusqu'a ce qu'il arrive a la ligne
Additionner = Val1 + Val2
Et la soit j'appuie sur F8 et il crash soit il suffit que je passe la souris sur Val1 ou Val2 (pour voir leur valeur) et il crash aussi.

As tu la moindre idee de ce qui peut poser probleme ?
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
19 sept. 2006 à 22:36
oui pourquoi pas... bonne idée autant macher le travail jusqu'au bout je le rajouterai dans la mise à jour ;)

merci

@+
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
19 sept. 2006 à 21:14
Ok lol

Petite suggestion, car je viens de rencontrer le probleme, si le module n'est pas deja charger..

Remplacer:

If Module Then
Address = GetProcAddress(Module, Args(1))
Else
Err.Raise vbObjectError
Exit Sub
End If


par:

If Not(Module) then Module = LoadLibrary(Args(0))

If Module Then
Address = GetProcAddress(Module, Args(1))
Else
Err.Raise vbObjectError
Exit Sub
End If


++
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
19 sept. 2006 à 01:42
lol t'inquiete pas a 1h41 un lundi soir mon temps n'est pas compté ;) et puis pour dire la verité... ça me fait gagner des points alors que demander de plus :p

@+
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
19 sept. 2006 à 01:19
Ah ok je me disais bien que tu pensais que c'etait pour un sub "local" (de mon prog)

En fait je parle bien d'un sub api.(RtlSetProcessIsCritical)

J'ai essaye avec des tas d'autres api et aucun problemes, mais celui la ne fonctionne pas :( (il fonctionne bien si je le declare normalement)
C'est un api un peu ambigu, tres peu d'info sur le net :/

Merci pour ta reponse et desole de t'avoir fait perdre du temps

++
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
19 sept. 2006 à 01:07
en fait si tu veux appeler une fonction de TON prog tu envoi l'adresse de la fonction ex :

Public Test()
MsgNox "Hello"
End Sub

MyFunction2.Create AddressOf Test, vbEmpty

si tu veux appeler eun fonction d'une dlll alors tu envoi le nom de module et de fonction :

MyFunction2.Create "Madll.dll::Mafonction",vbempty

ok ?

@+
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
17 sept. 2006 à 23:24
Ok merci, je vais tester ca, meme si je comprends pas trop le AddressOf NoParam...
Je le mets ou alors le nom du module et du sub ?
Je me sens c** parfois c'est grav lol

Sinon pour le reste ca marche impec et c'est vraiment facile d'utilisation bravo!

++
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
17 sept. 2006 à 23:00
Draluorg> en effet c'est un cas particulier mais il suffit juste de modifier un peu la syntaxe comme ceci :

A la creation :
Private MyFunction2 As New CDelegate
MyFunction2.Create AddressOf NoParam, vbEmpty

Lors de l'appel :
MyFunction2.Default.Invoke

@+
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
17 sept. 2006 à 22:37
Merci pour cette reponse si rapide ^^

En effet ca marche pour un sub sorry, mais apparement pas si c'est un sub qui ne prend aucun parametre et ne renvoi rien...(bon ils sont rare j'admets!) mais fallait que je tombe dessus evidement...

Encore merci
++
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
17 sept. 2006 à 22:24
on fait pareil !

@+
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
17 sept. 2006 à 22:19
Salut a tous,

Source tres interessante en effet, mais j'ai une question a 2 cents...
Comment kon fai pour un sub ?

Merci d'avance
++
cs_Warning Messages postés 516 Date d'inscription samedi 3 février 2001 Statut Membre Dernière intervention 24 octobre 2006 2
12 sept. 2006 à 03:11
Je cherchais ça justement quand je voulais faire du hooking rien qu'avec un module de classe (ce que tu as fait juste avant), c'est super utile mais à un niveau assez avancé. thks Eb ;)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
8 sept. 2006 à 07:40
c'est assez utile, en fait...
tu peux par exemple paramétrer quelque chose, et simplement fournir un pointeur différent selon ce que tu souhaites faire
appeler une dll dynamiquement sans faire de Declare
executer des bouts d'ASM directement intégrés à VB
etc, etc
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
8 sept. 2006 à 01:27
Salut EB,

Je vois que tes sources frolent à chaque fois les limites de VB, et ça me permet d'apprendre plein de truc, par contre sur celle la j'ai beau cherché (et j'ai regardé ton code mais ça ne m'a pas spécialement plus aidé), je n'ai toujours pas compris à quoi servait ta source (eh oui le commentaire con ^^ il est pour moi lol)
Alors comme je suis du genre curieux, jvoulais savoir si tu pouvais me donner un peu plus d'infos si t'a le temps stp.

Merci ;) a+