begin process at 2012 02 16 10:20:18
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Exécution

 > APPELER UNE FONCTION DEPUIS SON ADRESSE

APPELER UNE FONCTION DEPUIS SON ADRESSE


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :8 768 / 802

Auteur : EBArtSoft

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (25)
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

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture COLOR PICKER
Source avec Zip Source avec une capture SAVEPICTURE() AU FORMAT PNG, JPG, TIF ETC...
Source avec Zip Source avec une capture SAUVEGARDER UNE IMAGE EN PNG
Source avec Zip Source avec une capture VB6 ADDIN - FAITES DISPARAITRE LES MSGBOX D'ERREUR IDE
Source avec Zip Source avec une capture MONITEUR CPU

 Sources de la même categorie

Source avec Zip CALCULATRICE par TPB
Source avec Zip Source .NET (Dotnet) PIERRE PAPIER CISEAUX par Ultrabytes
Source avec Zip Source avec une capture UN PATCH EN VB (V3) par PhoenixBytes
Source avec Zip Source .NET (Dotnet) [VB.NET 2008] EXECUTION MULTITHREAD DE PLUSIEURS FONCTION À ... par ShadowTzu
Source avec Zip Source avec une capture MULTITHREADING ACTIVEX par Philippe734

 Sources en rapport avec celle ci

Source .NET (Dotnet) CLASSE .NET DE LECTURE/ÉCRITURE DANS LA BASE DE REGISTRE par NikatorS
Source avec Zip APPEL DE POINTEUR DE FONCTIONS - API SANS LES DECLARER par Renfield
Source avec Zip APPELER DES POINTEURS DE FONCTIONS DEPUIS VB par ShareVB
MANIP' WINDOWS par Xentor
Source avec Zip UTILISER LA FONCTION LINE POUR EFFECTUER DES FONCTION AGORIT... par flagyg

Commentaires et avis

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+

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

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

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

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

on fait pareil !

@+

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

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

@+

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!

++

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 ?

@+

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

++

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

@+

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


++

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

@+

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 ?

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"

Commentaire de draluorg le 15/10/2006 19:29:07

Salut,

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

++

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

++

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.

@+

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.

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.

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.

@+

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

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

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

Commentaire de Renfield le 25/11/2009 17:04:47 administrateur CS

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

Commentaire de EBArtSoft le 25/11/2009 18:21:46 administrateur CS

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

 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 d'une DLL cryptée avec clé dans un Dongle [ par Feanor06 ] Bonjour, Alors voici le contexte : 1/ J'ai un programme principal en VB (car bcp d'IHM...) qui fait appel à une DLL (en C++) de traitement mathématiq appel de fonction stocké dans des modules [ par JSilvere ] Bonjour, Je suis en train de créer un programme assé long et qui fais appel plusieurs fois aux mêmes fonction, avec quelques variables qui diffèrent VB.NET et l'appel des fonction [ par abdobergach ] bonjour jé créé une fonction dans un module la voila [color=blue]Public Sub AddNumbers(ByVal num1 As Integer) Dim answer As Integer 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


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,201 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales