Utiliser une structure c++ dans _asm{} ?

Résolu
Zootella Messages postés 252 Date d'inscription vendredi 10 juin 2005 Statut Membre Dernière intervention 5 septembre 2006 - 9 juil. 2005 à 02:13
Zootella Messages postés 252 Date d'inscription vendredi 10 juin 2005 Statut Membre Dernière intervention 5 septembre 2006 - 9 juil. 2005 à 17:21
Hello,



Voilà j'esseye d'utiliser une structure faite en c++ dans _asm{} :



struct test

{

char * a;

char * b;

}



test p;



p.a = "test1";

p.b = "test2";



_asm

{

mov eax, dword ptr [0x10001030]

push p

call eax

}



10001030 est l'adresse d'une fonction c++ qui affiche p.a et p.b dans une MessageBox.:



Affich(test p)

{

MessageBox(0, p.a, p.b, 0);

}



Ca fonctionne à moitié : le titre de la MessageBox est "test1" et le contenu aussi..



Donc j'imagine que le "push p" ne met pas la structure p sur la pile mais p.a.



Donc comment envoyer la structure et non p.a ?

5 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
9 juil. 2005 à 14:24
#include <windows.h>

typedef struct _test
{
char * a;
char * b;
} test;


void __stdcall Affich(test* p)
{
MessageBox(0, p->a, p->b, 0);
}

int main()
{
test p;
p.a = "test1";
p.b = "test2";

_asm
{
lea eax, p
push eax
call Affich
}
}


Tu peux aussi faire
push p.a
push p.b
call ...

moi si je mets juste push p, ca me met une erreur d'esp à l'exécution (il doit pusher en effet seulement le premier champ)
Si tu peux modifier ta dll, je pense que tu as intérêt à passer par adresse, c'est toi qui voit
Si tu veux utiliser offset p, tu dois mettre p en varaible globale (il sera dans le segment de données, toi tu le mets en local, donc sur la pile)
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
9 juil. 2005 à 09:02
Autant passer la structure par adresse, tu es sur de ce qui se passe au moins:

struct test
{
char * a;
char * b;
}

test p;

p.a = "test1";
p.b = "test2";

_asm
{
mov eax, dword ptr [0x10001030]
push offset p
call eax
}

10001030 est l'adresse d'une fonction c++ qui affiche p.a et p.b dans une MessageBox.:

Affich(test* p)
{
MessageBox(0, p->a, p->b, 0);
}
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
9 juil. 2005 à 09:09
Juste une question, pourquoi ne pas faire call Affich?
0
Zootella Messages postés 252 Date d'inscription vendredi 10 juin 2005 Statut Membre Dernière intervention 5 septembre 2006
9 juil. 2005 à 14:14
Si je mets "offset" j'obtiens une erreur : error C2415: improper operand type.



"

Juste une question, pourquoi ne pas faire call Affich?"



Parceque la fonction Affich est dans une dll chargé en mémoire.
0

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

Posez votre question
Zootella Messages postés 252 Date d'inscription vendredi 10 juin 2005 Statut Membre Dernière intervention 5 septembre 2006
9 juil. 2005 à 17:21
Si je met p en variable globale ça marche éfféctivement sans 'offset' même !



"

Tu peux aussi faire

push p.a

push p.b

call ...

"



Oui mais alors l'utilité de la structure est perdue



Donc voilà probléme résolu, merci !
0
Rejoignez-nous