Utiliser une structure c++ dans _asm{} ? [Résolu]

Signaler
Messages postés
252
Date d'inscription
vendredi 10 juin 2005
Statut
Membre
Dernière intervention
5 septembre 2006
-
Messages postés
252
Date d'inscription
vendredi 10 juin 2005
Statut
Membre
Dernière intervention
5 septembre 2006
-
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

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
#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)
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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);
}
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Juste une question, pourquoi ne pas faire call Affich?
Messages postés
252
Date d'inscription
vendredi 10 juin 2005
Statut
Membre
Dernière intervention
5 septembre 2006
1
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.
Messages postés
252
Date d'inscription
vendredi 10 juin 2005
Statut
Membre
Dernière intervention
5 septembre 2006
1
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 !