i want to retrieve text from edit box using GlobalAlloc for buffer, but it seems i've some pb with memory :
invoke SendMessageA, hEdit, WM_GETTEXTLENGTH, 0, 0
add eax,1 ;because WM_GETTEXTLENGTH doesn't include null character.
mov Length,eax
invoke GlobalAlloc, GMEM_FIXED, Length
mov pMem,eax
invoke SendMessageA, hEdit, WM_GETTEXT, Length, pMem
invoke MessageBoxA, 0, , 0, 0
but in result, i've not my text in my messagebox
I've tried with in SendMessage but don't work.
what is the problem?:confused:
Try doing it this way:
invoke GetWindowTextLength,hEdit
inc eax
mov ,eax
invoke SysAllocStringByteLen,0,Length
mov ,eax
invoke GetWindowText,hEdit,hMem$,Length
invoke SysAllocStringByteLen,0,Length
invoke MessageBox,hWin,addr hMem$,0,MB_OK
Hope this works for you.....
thanks for your help :)
I've found the problem :
your way work as my code.
here is my dialog proc :
DialProc proc hwnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
LOCAL hEdit:DWORD
mov eax,uMsg
cmp eax,WM_INITDIALOG
jz Ini
cmp eax,WM_COMMAND
jz @here
mov eax,0
ret
Ini :
invoke GetDlgItem, hwnd, 101
mov hEdit,eax
ret
@here :
invoke SendMessageA, hEdit, WM_GETTEXTLENGTH, 0, 0
.
.
.
DialProc endp
In fact, the problem is on WM_INITDIALOG, GetDlgItem get my hEdit handle BUT when execution arrive @here, hEdit have another value !!
so, i must declare hEdit in my .DATA section or (it work also)
i must put the GetDlgItem just before SendMessageA.
It seems that LOCAL hEdit:DWORD don't preserve value through the execution of the DialProc. (i was thinking the meaning of LOCAL was to declare variables inside the PROC)
Is it normal? i mean : why hEdit value are overwritten??
LOCAL does define variables for use 'just inside the proc,' but perhaps that doesn't mean what you think it means.
They are defined EACH TIME THE PROC RUNS. IE, call the proc the first time, put '2' in some LOCAL var. Do some other work, then call the same proc, read the value of the same var.
You have a 1 in 4294967295 chance of getting 2 back.
Why? LOCALS are made on the stack, a fresh set gets made every time you call the proc (yes, even if you call the proc from itself). They have an indeterminate initial value.
If you want to keep a value for a proc each time the proc runs, you need a GLOBAL variable, something in the .data area. Then your technique of caching dialog child handles will work just fine.