cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 8 févr. 2007 à 17:13
Tropic> non ce n'est pas encore implementé.
cs_Tropic
Messages postés90Date d'inscriptionlundi 16 décembre 2002StatutMembreDerniè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és4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 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és91Date d'inscriptionjeudi 18 novembre 2004StatutMembreDernière intervention17 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és91Date d'inscriptionjeudi 18 novembre 2004StatutMembreDernière intervention17 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és4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 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és625Date d'inscriptionvendredi 23 avril 2004StatutMembreDernière intervention25 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és625Date d'inscriptionvendredi 23 avril 2004StatutMembreDernière intervention25 novembre 2010 15 oct. 2006 à 19:29
Salut,
Essais en mettant vbVDouble a la place de VbDouble....
++
cs_santiago69
Messages postés91Date d'inscriptionjeudi 18 novembre 2004StatutMembreDernière intervention17 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és91Date d'inscriptionjeudi 18 novembre 2004StatutMembreDernière intervention17 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és4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 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és625Date d'inscriptionvendredi 23 avril 2004StatutMembreDernière intervention25 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és4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 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és625Date d'inscriptionvendredi 23 avril 2004StatutMembreDernière intervention25 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és4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 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 :
draluorg
Messages postés625Date d'inscriptionvendredi 23 avril 2004StatutMembreDernière intervention25 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és4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 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és625Date d'inscriptionvendredi 23 avril 2004StatutMembreDernière intervention25 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és4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 17 sept. 2006 à 22:24
on fait pareil !
@+
draluorg
Messages postés625Date d'inscriptionvendredi 23 avril 2004StatutMembreDernière intervention25 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és516Date d'inscriptionsamedi 3 février 2001StatutMembreDernière intervention24 octobre 20062 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és2167Date d'inscriptionmardi 11 novembre 2003StatutMembreDernière intervention16 juillet 20091 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.
25 nov. 2009 à 18:21
Ce code date quand meme de 2006 ;)
25 nov. 2009 à 17:04
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 ^^
8 févr. 2007 à 17:13
8 févr. 2007 à 16:52
Ma question est, peut-on appeler une fonction dans un autre progamme
du style
MyFunction2.Create "MonProjet.EXE::Mafonction",vbLong,vbLong
15 oct. 2006 à 21:28
@+
15 oct. 2006 à 19:52
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.
15 oct. 2006 à 19:50
Ce qui pose probleme, c'est uniquement le ByVal.
Par contre, je confirme que "Module1::Additionner" ne marche pas tandis que "AddressOf Additionner" marche.
15 oct. 2006 à 19:42
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.
@+
15 oct. 2006 à 19:34
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
++
15 oct. 2006 à 19:29
Essais en mettant vbVDouble a la place de VbDouble....
++
15 oct. 2006 à 19:27
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"
15 oct. 2006 à 19:20
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 ?
19 sept. 2006 à 22:36
merci
@+
19 sept. 2006 à 21:14
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
++
19 sept. 2006 à 01:42
@+
19 sept. 2006 à 01:19
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
++
19 sept. 2006 à 01:07
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 ?
@+
17 sept. 2006 à 23:24
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!
++
17 sept. 2006 à 23:00
A la creation :
Private MyFunction2 As New CDelegate
MyFunction2.Create AddressOf NoParam, vbEmpty
Lors de l'appel :
MyFunction2.Default.Invoke
@+
17 sept. 2006 à 22:37
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
++
17 sept. 2006 à 22:24
@+
17 sept. 2006 à 22:19
Source tres interessante en effet, mais j'ai une question a 2 cents...
Comment kon fai pour un sub ?
Merci d'avance
++
12 sept. 2006 à 03:11
8 sept. 2006 à 07:40
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
8 sept. 2006 à 01:27
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+