Messagebox (niveau débutant) [Résolu]

Messages postés
86
Date d'inscription
lundi 27 janvier 2003
Dernière intervention
10 décembre 2006
- - Dernière réponse : BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
- 17 juil. 2006 à 17:14
Bonjour,

je suis en train de créer une dll que je vais invoquer en vb6.

Tout marche très bien, sauf pour la fonction messagebox dont n'arrive pas à récuperer la valeur de retour qui semble se trouver dans eax.

Voila la partie intéressante, il y a d'autres fonctions mais tout le reste va bien :

.586
.model flat, stdcall
option casemap :none
option prologue:none
option epilogue:none

include C:\masm32\include\windows.inc
include C:\masm32\include\kernel32.inc
include C:\Masm32\include\user32.inc



includelib C:\masm32\lib\kernel32.lib
includelib C:\masm32\lib\user32.lib



.data



szDlgTitle    db "Titre de la messagebox",0
szMsg         db "Texte de la messagebox",0

.code



ALIGN 4



LibMain PROC parameter1:DWORD, parameter2:DWORD, parameter3:DWORD
   mov      eax, 1
   ret      12
LibMain ENDP



 msg1 PROC
   xor eax, eax
   push MB_ICONHAND or MB_OKCANCEL
   push offset szDlgTitle
   push offset szMsg
   push 0
   call MessageBox
;return value: in EAX resides a value
;indicating which button was clicked on
   
   ret  8 ; cest ici que ca doit pser probleme
msg1 ENDP

end LibMain
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
3
Merci
ret  0
puisque tu ne prends pas de param donc rien à dépiler.

ciao...
BruNews, MVP VC++

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de BruNews
Messages postés
86
Date d'inscription
lundi 27 janvier 2003
Dernière intervention
10 décembre 2006
0
Merci
Bonjour,

ca marche très bien.

Pourrais-tu me dire comment puis-je savoir ce que je dois retourner avec RET ?

Car par exmple, j'ai une fonction addition dont le ret prend 8 en argument :

myAdd PROC
   mov   eax, [esp+8]
   add   eax, [esp+4]
   ret   8
myAdd ENDP

elle prend 2 paramètre (byval a et byval b que j'initialise depuis VB6) et renvoie la somme.

merci d'avance.

yk.
Commenter la réponse de Ulala2
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
0
Merci
Si l'appelant empile 8 octets (les 2 params) donc ret 8.
'ret' ne veut pas dire 'ce que tu vas retourner' mais retour chez l'appelant dont l'adresse est dans EIP en [ESP] au moment de l'entrée dans le bloc fonction, la valeur derrière 'ret' est le nbr d'octets à dépiler, c'est-à-dire de combien remonter ESP après que EIP aura été POPé (implicite).

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
86
Date d'inscription
lundi 27 janvier 2003
Dernière intervention
10 décembre 2006
0
Merci
merveilleux.

yk.
Commenter la réponse de Ulala2
Messages postés
202
Date d'inscription
mardi 17 mai 2005
Dernière intervention
29 septembre 2008
0
Merci
Bonjour Ulala2,

En dépilant les paramètres dans la routine appelée, tu réalise le stdcall comme fonctionnent les API windows. C'est la routine appelée qui fait le ménage.
Dans le cas ou c'est l'appelant qui effectue ce travail après le call (avec un add esp,xxxx) c'est la convention C.
Le plus important est de se rappeler qu'en entrée de la routine appelée, esp pointe sur l'adresse de retour (eip). Quand tu atteindra le ret dans la routine, il faudra que esp pointe bien vers l'adresse de retour (sinon plantage quasi assuré - sauf si...). Après tu peux dépiler le nombre d'octets correspondant au nombre de paramètres empilés (4 octets par dword empilé). Ce peut être différent si tu veux garder des choses sur la pile mais attention si tu réutilises la routine
Commenter la réponse de cs_Nasman
Messages postés
86
Date d'inscription
lundi 27 janvier 2003
Dernière intervention
10 décembre 2006
0
Merci
Merci pour ces précisions.
cela fonctionne bien.

comment puis-je faire pour retourner une string ?
j'ai essayé de stocker le pointeur et le nombre de caractères dans les registres mais rien à faire.
Commenter la réponse de Ulala2
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
0
Merci
DLL POUR VB/VBA (9)
http://www.vbfrance.com/code.aspx?id=18494

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.