Trouver une ressource (Nouvelle version du moteur, plus rapide & pertinent, essayez le !)
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
|
|
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
|
|
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++
|
|
|
Classé sous : fonction, stack, edx, esp, kestion
|
CalendriCode
| | | L | M | M | J | V | S | D |
| | | | | 1 | 2 | 3 |
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
|
Téléchargements
Logiciels à télécharger sur le même thème :
|