begin process at 2008 08 20 19:11:05
1 229 029 membres
388 nouveaux aujourd'hui
14 260 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Stack [ Archives / Aide a la programmation Windows ] (AlexMAN)

Stack le 26/09/2004 21:14:52

AlexMAN
Membre Club
Bonsoir,

Je me pose une kestion :
Si au debut d'une fonction, je fais :

lea edx, [esp - 32]
mov esp, edx
call CreateRectRgn

On est d'accord, la pile est relevée de 16 apres l'appel a l'api. Ma kestion est la suivante : est ke je peux recuperer les parametres passés a la fonction si je fais un mov eax, [esp - 4]...Etc ?

Merci d'avance

++

Re : Stack le 26/09/2004 22:13:43

BruNews
(Admin CS)
bien entendu qu'on peut lire ou affecter [esp-4] etc...

Par contre je ne vois pas bien ou tu vas avec ta suite d'instructions, risque pas d'y avoir grand chose d'interessant sous ESP au retour d'1 API.

ciao...
BruNews, MVP VC++

Re : Stack le 26/09/2004 22:36:48

AlexMAN
Membre Club
jdois passer des parametres a une fonction, je dois ensuite utiliser ces params pour une autre fonction, d'ou ma kestion.
Si tu vois un autre moyen, jsuis preneur.

Merci ++

Re : Stack le 26/09/2004 22:46:38

BruNews
(Admin CS)
alors PUSH les 2 fois, ils seront prets pour le second 'call'.

ciao...
BruNews, MVP VC++

Re : Stack le 26/09/2004 22:51:57

AlexMAN
Membre Club
Enfin jmré ton avis, est ce ke je peux transcrire ca en ayant des params ke sur la pile, pas de variables globales...

if (message == WM_PAINT) {
RECT rectPB;
PAINTSTRUCT ps;
HRGN hrgn;
HDC hdc;
COLORREF hdef = GetSysColor(COLOR_WINDOW);
char buf[64], *c;

GetClientRect(hwnd, &rectPB);
hdc = BeginPaint(hwnd, &ps);
hrgn = CreateRectRgn(rectPB.left, rectPB.top, rectPB.right, rectPB.bottom);
SelectClipRgn(hdc, hrgn);
SetBkMode(hdc, TRANSPARENT);
rectPB.top = (int)SendMessage(hwnd, PBM_GETPOS, 0, 0);
c = bnstrcpy(buf, szstate);
c = bnultoa(rectPB.top, c);
*c++ = '%'; *c = 0;
rectPB.top = 100 - rectPB.top;
FillRect(hdc, &rectPB, GetSysColorBrush(COLOR_HIGHLIGHT));
DrawText(hdc, buf, strlen(buf), &rectPB, DT_VCENTER | DT_CENTER | DT_SINGLELINE);
EndPaint(hwnd, &ps);
DeleteObject(hrgn);
ReleaseDC(hwnd, hdc);
return 0;
}
return CallWindowProc(oldproc, hwnd, message, wparam, lparam);

J'ai essayé plusieurs code, en PUSHant directement la pile pour passer les params, mais nan, ca marche po, ca ménerve pask ca doit pas etre si compliké ke ca, en plus pas de VS.net donc jpeux pas tester en inline...putain de dimanche..

Merci Brunews

++

Re : Stack le 26/09/2004 23:06:03

BruNews
(Admin CS)
A part 'szstate' qui semble etre une chaine globale, pour sur que tout cela se fait sur pile dans l'event WM_PAINT, aucun besoin de variables globales.
Prepare la structure de ta pile sur papier avant pour bien voir combien de place tu auras besoin. Utiliser registres avant tout, ne jamais relire en memoire plus d'1 fois si la valeur ne change pas.
Tres bon exercice.

ciao...
BruNews, MVP VC++

Re : Stack le 26/09/2004 23:12:31

BruNews
(Admin CS)
OHE j'avais pas fait gaffe, y a une couille dans le potage.
A BeginPaint() doit correspondre EndPaint() et NON ReleaseDC().

ciao...
BruNews, MVP VC++

Re : Stack le 26/09/2004 23:16:58

AlexMAN
Membre Club
ok chef, jV mi mettre ce soir, les cours passeront apres...
Merci pour le ReleaseDC() inutile.

Re : Stack le 26/09/2004 23:55:06

AlexMAN
Membre Club
Ca marche !! A moitié, mais ca a le merite ne pas planter... :

PBProc PROC
mov edi, [esp + 4] ;hwnd
mov ecx, [esp + 8] ;message
cmp ecx, WM_PAINT
je onPaint
push [esp + 16]
push [esp + 12]
push ecx
push edi
push oldproc
call CallWindowProc
jmp fin
onPaint:
lea esi, [esp - 152]
mov esp, esi
push esi
push edi
call GetClientRect
lea ecx, [esi + 16]
push ecx
push edi
call BeginPaint
mov [esi + 144], eax
push [esi + 12]
push [esi + 8]
push [esi + 4]
push [esi]
call CreateRectRgn
mov [esi + 148], eax
push eax
push [esi + 144]
call SelectClipRgn
push TRANSPARENT
push [esi + 144]
call SetBkMode
xor ecx, ecx
push ecx
push ecx
push PBM_GETPOS
push edi
call SendMessage
mov ecx, 100
sub ecx, eax
mov [esi + 4], eax
invoke dwtoa, eax, addr buf
invoke MessageBox, 0, addr buf, 0, 0
push COLOR_HIGHLIGHT
call GetSysColorBrush
push eax
push esi
push [esi + 144]
call FillRect
mov ecx, DT_SINGLELINE
or ecx, DT_CENTER
or ecx, DT_VCENTER
push ecx
push esi
push 6
push offset sztest
push [esi + 144]
call DrawText
push [esi + 148]
call DeleteObject
lea ecx, [esi + 16]
push ecx
push edi
call EndPaint
add esp, 152
xor eax, eax
fin:
ret 16
PBProc endp

Voila, bonne nuit, merci

++

Re : Stack le 27/09/2004 00:08:00

BruNews
(Admin CS)
PBProc PROC
mov edi, [esp + 4] ;hwnd

JAMAIS !!! Autres que EAX, ECX et EDX il faut TOUJOURS sauvegarder les registres avant de s'en servir afin de les restituer en sortie. Tu testes cela sur un win2K ou un winbebe et devrait planter.

PBProc PROC
mov ecx, [esp + 8] ;message
mov edx, [esp + 4] ;hwnd
cmp ecx, WM_PAINT
......
allait aussi bien sans toucher a EDI.

ciao...
BruNews, MVP VC++


[Page 1 Page 2 Page 3]
Classé sous : fonction, stack, edx, esp, kestion

Participer à cet échange

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
extraction dinformatio...
Budget : 300€
campagne Adwords
Budget : 5 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS