Messagebox (niveau débutant)

Résolu
Ulala2 Messages postés 86 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 10 décembre 2006 - 15 juil. 2006 à 16:45
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 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

7 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
16 juil. 2006 à 00:09
ret  0
puisque tu ne prends pas de param donc rien à dépiler.

ciao...
BruNews, MVP VC++
3
Ulala2 Messages postés 86 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 10 décembre 2006
16 juil. 2006 à 12:26
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.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
16 juil. 2006 à 20:14
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++
0
Ulala2 Messages postés 86 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 10 décembre 2006
16 juil. 2006 à 21:15
merveilleux.

yk.
0

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

Posez votre question
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 3
17 juil. 2006 à 16:47
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
0
Ulala2 Messages postés 86 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 10 décembre 2006
17 juil. 2006 à 16:52
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.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
17 juil. 2006 à 17:14
DLL POUR VB/VBA (9)
http://www.vbfrance.com/code.aspx?id=18494

ciao...
BruNews, MVP VC++
0
Rejoignez-nous