Faire fonctionner une API dans une DLL

VBREP Messages postés 69 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 4 mars 2007 - 21 avril 2005 à 16:38
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 - 21 avril 2005 à 17:23
salut à tous
j'ai mis api SetTimer dans 1 class pour faire un dll

lors de la compilation : erreur de compilation " utilisation incorrecte de l'operateur AddressOf"

ce que j'ai ou que l'on ma presenter

Il faut faire un wrapper pour AddressOf, car tu ne peux pas l'utiliser directement dans un appel d'API, qui attend un Long.

' Fonction : GetFuncAdr
' Auteur : Christophe RENAUD
' Objet : Retourne l'adresse d'une fonction. En effet, le mot-clé 'AddressOf' ne peut être utilisé directement
' Arguments : ByVal Adr As Long : Adresse de la fonction
' Retour : Long : L'adresse de la fonction
'
Private Function GetFuncAdr(ByVal Adr As Long) As Long
' C'est idiot mais totalement indispensable
GetFuncAdr = Adr
End Function

Et tu t'en sert comme cela :
SetTimer(..., ..., ..., GetFuncAdr(AddressOf Le nom de ta fonction))

Il n'y a pas de fonction plus con de GetFuncAdr, mais la syntaxe de AddressOf la rend obligatoire : Ceci est du au fait que, en VB, AddressOf est un opérateur et non pas une fonction (pas de parenthèses). Et une API ne peut recevoir un Opérateur en tant que argument.

essai

SetTimer Form1.hwnd, 5 , 1000 , addressof NomduSub = erreur
SetTimer Form1.hwnd, 5 , 1000 , adr NomduSub = erreur
SetTimer Form1.hwnd, 5 , 1000 , GetFuncAdr NomduSub = erreur

SetTimer(Form1.Hwnd, 5 , 1000, GetFuncAdr(AddressOf LeNomDeTaSub))

SetTimer Form1.hwnd, 5, 1000, GetFuncAdr(AddressOf NomDu Sub) =
erreur de compilation "Utilisation de l'operateur AddressOf"

et si
SetTimer (Form1.hwnd, 5, 1000, GetFuncAdr(AddressOf NomDu Sub)) erreur de compilation "Attendu"

rien de tous ce que vous avez lu jusque la ne fonctione

merci d'avance de votre aide

5 réponses

Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
21 avril 2005 à 16:59
dans un module

Public Declare
Function SetTimer
Lib
"user32" (
ByVal hwnd
As
Long,
ByVal nIDEvent
As
Long,
ByVal uElapse
As
Long,
ByVal lpTimerFunc
As
Long)
As
Long


Public Declare
Function KillTimer
Lib
"user32" (
ByVal hwnd
As
Long,
ByVal nIDEvent
As
Long)
As
Long


Public Sub TimerProc(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long)
'ton programme

End Sub



dans la Forme

Private
Sub Form_Load()

SetTimer Me.hwnd, 0, 1000, AddressOf TimerProc
End
Sub

Private Sub Form_Unload(Cancel As Integer)

KillTimer Me.hwnd, 0

End Sub

Daniel
0
VBREP Messages postés 69 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 4 mars 2007
21 avril 2005 à 17:05
1 MODULE N'EST PAS 1 DLL
MERCI QUAND MEME
MAIS PAS BON
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
21 avril 2005 à 17:10
n'empêche que tu dois le mettre en Public.
que tu peux faire appel à AdressOf directement.
que dans "AddressOf NomDu Sub" c'est pas très bon non plus.
et faut pas oublier le KillTimer à la fin.

Daniel
0
VBREP Messages postés 69 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 4 mars 2007
21 avril 2005 à 17:16
IL FAUT QUE SETTIMER SOIT DANS LA CLASS DU DLL ET PAS DANS L'APPLI
SINON AUCUN INTERET A FAIRE UN DLL
0

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

Posez votre question
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
21 avril 2005 à 17:23
Pas besoin de t'énerver VBREP !



Ce que veux sûrement dire Gobillot, c'est que pour utiliser AddressOf,
il faut que la fonction soit dans une zone de mémoire non modifiable,
et donc, elle ne peux pas se situer dans un module de classe vu que
celui-ci peut être instancié, et donc, les adresses des fonctions sont
variables.



Donc, il faut mettre ta fonction dans un module classique, et y faire
appel à partir du module de classe de ta dll (le module classique étant
dans le projet de ta dll bien entendu !).

DarK Sidious

Un API Viewer (pour le VB, VB.NET, C, C# et Delphi) : www.ProgOtoP.com/popapi/
0
Rejoignez-nous