Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

APPELER UNE FONCTION DEPUIS SON ADRESSE


Information sur la source

Catégorie :Exécution Classé sous : fonction, pointeur, appel, call, api Niveau : Débutant Date de création : 07/09/2006 Vu / téléchargé: 6 828 / 710

Note :
9,29 / 10 - par 7 personnes
9,29 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (23)
Ajouter un commentaire et/ou une note


Description

Cliquez pour voir la capture en taille normale
Voila je crois que le titre par de lui même...

Cette methode contrairement aux autres disponibles sur le site permet de definir les parametres de maniere tres simple et sans aucune dependances externe. Neanmoins elle est moins rapide qu'un simple "declare" et ne permet pas d'utiliser des structure directement. Cela dit elle est tres souple et tres simple.
 

Conclusion

Pour tout les amateurs de vb je ne dirais qu'une chose : "A télécharger d'urgence !"

@+
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de MadM@tt le 08/09/2006 01:27:45

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+

signaler à un administrateur
Commentaire de Renfield le 08/09/2006 07:40:42 administrateur CS

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

signaler à un administrateur
Commentaire de Warning le 12/09/2006 03:11:48 administrateur CS

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 ;)

signaler à un administrateur
Commentaire de draluorg le 17/09/2006 22:19:07

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
++

signaler à un administrateur
Commentaire de EBArtSoft le 17/09/2006 22:24:22 administrateur CS

on fait pareil !

@+

signaler à un administrateur
Commentaire de draluorg le 17/09/2006 22:37:08

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
++

signaler à un administrateur
Commentaire de EBArtSoft le 17/09/2006 23:00:03 administrateur CS

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

@+

signaler à un administrateur
Commentaire de draluorg le 17/09/2006 23:24:21

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!

++

signaler à un administrateur
Commentaire de EBArtSoft le 19/09/2006 01:07:52 administrateur CS

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 ?

@+

signaler à un administrateur
Commentaire de draluorg le 19/09/2006 01:19:29

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

++

signaler à un administrateur
Commentaire de EBArtSoft le 19/09/2006 01:42:32 administrateur CS

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

@+

signaler à un administrateur
Commentaire de draluorg le 19/09/2006 21:14:09

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


++

signaler à un administrateur
Commentaire de EBArtSoft le 19/09/2006 22:36:35 administrateur CS

oui pourquoi pas... bonne idée autant macher le travail jusqu'au bout je le rajouterai dans la mise à jour ;)

merci

@+

signaler à un administrateur
Commentaire de santiago69 le 15/10/2006 19:20:36

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 ?

signaler à un administrateur
Commentaire de santiago69 le 15/10/2006 19:27:33

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"

signaler à un administrateur
Commentaire de draluorg le 15/10/2006 19:29:07

Salut,

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

++

signaler à un administrateur
Commentaire de draluorg le 15/10/2006 19:34:35

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

++

signaler à un administrateur
Commentaire de EBArtSoft le 15/10/2006 19:42:40 administrateur CS

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.

@+

signaler à un administrateur
Commentaire de santiago69 le 15/10/2006 19:50:13

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.

signaler à un administrateur
Commentaire de santiago69 le 15/10/2006 19:52:19

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.

signaler à un administrateur
Commentaire de EBArtSoft le 15/10/2006 21:28:44 administrateur CS

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.

@+

signaler à un administrateur
Commentaire de Tropic le 08/02/2007 16:52:29

Bonjour

Ma question est, peut-on appeler une fonction dans un autre progamme
du style
MyFunction2.Create "MonProjet.EXE::Mafonction",vbLong,vbLong

signaler à un administrateur
Commentaire de EBArtSoft le 08/02/2007 17:13:13 administrateur CS

Tropic> non ce n'est pas encore implementé.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Pointeur pour connaitre la fonction qui appel??? [ par Philipin ] Lorsqu'une fonction peut-être appelée depuis n'importe où dans un programme, est-il possible de savoir qui a appelé cette fonction. (Comme le menu "Vi Pointeur pour connaitre la fonction qui appel??? [ par Philipin ] Lorsqu'une fonction peut-être appelée depuis n'importe où dans un programme, est-il possible de savoir qui a appelé cette fonction. (Comme le menu "Vi Pointeur sur fonction the return :) [ par Fulgy ] Rebonjour! J'ai posté tout à l'heure une question sur les pointeurs sur fonction en VB6 à laquelle je me suis moi même répondu pensant avoir trouvé la appel de fonction par call [ par geobasic ] Existe-t'il  un moyen de savoir si dans un fonction l'appel a été réalisé sous la forme "valeur_retour = MaFonction" ou "Call MaFonction", et ce direc Compter les appel à une fonction API [ par kthm ] Je souhaite vérifier l'utiulisation d'une fonction API par un programme. Comment faire? Par exemple : un programme fait appel une fonction API, u Pointeur sur fonction [ par Fulgy ] Bonjour à tous, je souhaiterais savoir s'il y a en VB6 un équivalent aux pointeurs sur fonctions du C? Merci d'avance. Appel de fonction dans DLL [ par Danette ] Bonjour,J'ai une DLL qui s'appelle TCDSEAR.DLL qui est référencée au niveau de mon PC (avec regsvr32) et dans mon appli le code suivant:Public TCD As RTC api refer call [ par gros_landais ] Bonjour,Dans le cadre d'un projet je dois finir un softphone qui a été créer avec l'API RTC de microsoft.Ce softphone permet de faire des transfert d' Appel de fonction VBA [ par justin92330 ] Bonjour,Voila je travaille sous excel dans visual basic editor,J'avais un prg qui fonctionnait sous VB6.0 mais la il bug lors de l'appel d'une fonctio Appel d'une fonction avec plusieurs variables [ par midoparis ] Bonjour !Je suis en train de faire un UserForm avec des listbox et un bouton.Lorsque l'utilisateur aura sélectionné les éléments dans les listbox, il


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version


LG KP501

Entre 9€ et 159€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,530 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.