Une mémoire "read"

Signaler
Messages postés
2
Date d'inscription
samedi 12 juillet 2003
Statut
Membre
Dernière intervention
4 novembre 2005
-
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
Bonsoir,

Je suis débutant et j'ai recopié un programme test.

Je parviens à l'assembler, puis à créer un .exe ;

quend je lance l'exe j'obtiens la boîte de dialogue suivante :



Erreur d'application

L'instruction à "0x82adb00" emploie l'adresse mémoire "0x82a2db00". La mémoire ne peut pas être "read".



----------------------------------------------------------
Le programme qui bug :



.386

.model flat,stdcall

option casemap:none



WinMain proto :DWORD,:DWORD,:DWORD,:DWORD



include \masm32\include\windows.inc

include \masm32\include\user32.inc

includelib \masm32\lib\user32.lib

include \masm32\include\kernel32.inc

includelib \masm32\lib\kernel32.lib



.DATA

ClassName db "SimpleWinClass",0

AppName db "Notre première fenêtre",0

OurText db "L'assembleur Win32 est vraiment génial !",0



.DATA

hInstance HINSTANCE ?

CommandLine LPSTR ?



.CODE

start:

invoke GetModuleHandle,NULL

mov hInstance,eax

invoke GetCommandLine

mov CommandLine,eax

invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT

invoke ExitProcess,eax



WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD

LOCAL wc:WNDCLASSEX

LOCAL msg:MSG

LOCAL hwnd:HWND

mov wc.cbSize,SIZEOF WNDCLASSEX

mov wc.style,CS_HREDRAW or CS_VREDRAW

mov wc.cbClsExtra,NULL

mov wc.cbWndExtra,NULL

push hInst

pop wc.hInstance

mov wc.hbrBackground,COLOR_WINDOW+1

mov wc.lpszMenuName,NULL

mov wc.lpszClassName,OFFSET ClassName

invoke LoadIcon,NULL,IDI_EXCLAMATION

mov wc.hIcon,eax

mov wc.hIconSm,eax

invoke LoadCursor,NULL,IDC_HAND

mov wc.hCursor,eax

invoke RegisterClassEx,addr wc

invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\

CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInst,NULL

mov hwnd,eax

invoke ShowWindow,hwnd,SW_SHOWNORMAL

invoke UpdateWindow,hwnd

.WHILE TRUE

invoke GetMessage,ADDR msg,NULL,0,0

.BREAK .IF(!eax)

invoke TranslateMessage,ADDR msg

invoke DispatchMessage,ADDR msg

.ENDW

mov eax,msg.wParam

ret

WinMain endp



WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM,lParam:LPARAM

LOCAL hdc:HDC

LOCAL ps:PAINTSTRUCT

LOCAL rect:RECT

.IF uMsg == WM_DESTROY

invoke PostQuitMessage,NULL

.ELSEIF uMsg == WM_PAINT

invoke BeginPaint,hWnd,ADDR ps

mov hdc,eax

invoke GetClientRect,hWnd,ADDR rect

invoke DrawText,hdc,ADDR OurText,-1,ADDR rect,DT_SINGLELINE or DT_CENTER or DT_VCENTER

invoke EndPaint,hWnd,ADDR ps

.ELSE

invoke DefWindowProc,hWnd,uMsg,wParam,lParam

ret

.ENDIF

xor eax, eax

ret



WndProc endp

end start

-----------------------------------------------



Merci de me donner vos lumières.

2 réponses

Messages postés
2
Date d'inscription
samedi 12 juillet 2003
Statut
Membre
Dernière intervention
4 novembre 2005

Ben !!!! J'ai trouvé !

Pour info :

ligne 14 : après le second DATA, il faut mettre un point d'interrogation (constantes non déterminées ...)

j'ai oublié la ligne : mov wc.lpfnWndProc, OFFSET WndProc

à inséreer dans WinMain après mov wc.style



Bonne soirée.
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Je répète:
WinMain n'a rien à faire dans un prog ASM, tu empiles 4 pseudo params inutilement.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++