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

Ulala2 86 Messages postés lundi 27 janvier 2003Date d'inscription 10 décembre 2006 Dernière intervention - 15 juil. 2006 à 16:45 - Dernière réponse : BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention
- 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 

7 réponses

Répondre au sujet
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 16 juil. 2006 à 00:09
+3
Utile
ret  0
puisque tu ne prends pas de param donc rien à dépiler.

ciao...
BruNews, MVP VC++
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de BruNews
Ulala2 86 Messages postés lundi 27 janvier 2003Date d'inscription 10 décembre 2006 Dernière intervention - 16 juil. 2006 à 12:26
0
Utile
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
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 16 juil. 2006 à 20:14
0
Utile
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
Ulala2 86 Messages postés lundi 27 janvier 2003Date d'inscription 10 décembre 2006 Dernière intervention - 16 juil. 2006 à 21:15
0
Utile
merveilleux.

yk.
Commenter la réponse de Ulala2
cs_Nasman 202 Messages postés mardi 17 mai 2005Date d'inscription 29 septembre 2008 Dernière intervention - 17 juil. 2006 à 16:47
0
Utile
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
Ulala2 86 Messages postés lundi 27 janvier 2003Date d'inscription 10 décembre 2006 Dernière intervention - 17 juil. 2006 à 16:52
0
Utile
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
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 17 juil. 2006 à 17:14
0
Utile
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.