Еще раз здравствуйте. Помогите найти ошибку, вроде GWL_USERDATA записываю правильно, а толку нет... Хелп плиз... Код (Text): load_user_data: pusha invoke SetLastError, 0 invoke GetWindowLong,[hwnd],GWL_USERDATA or eax, eax jz defwndproc mov [button_memory], eax cld mov esi, eax;[button_memory] lea edi, [button_data] mov ecx, len_btn_data rep movsb mov eax, [button_memory] mov edx, [eax+CREATESTRUCT.lpszClass] invoke MessageBox, 0, edx, 0, 0 popa ret save_user_data: pusha cld lea esi, [button_data] mov edi, [button_memory] mov ecx, len_btn_data rep movsb invoke SetLastError, 0 mov eax, [button_memory] invoke SetWindowLong, [hwnd], GWL_USERDATA, eax or eax, eax jz error_wnd_long popa ret ps синтакс fasm
ну по идеи button_memory это dword, а вот в него простым опкодом mov заброшено значение которое мне вернула VirtualAlloc. Я проверял вызовы WinApi и все зовершаються без ошибок. SetWindowLong должна запомнить dword, что скорей всего и происходит нормально, а вот блоки связанные с копированием button_data в button_memory и обратно у меня честно вызывают сомнения, так как я слабо представляю как в стеке распологаються переменные после locals Код (Text): proc ButtonProc hwnd, wmsg, wparam, lparam locals button_memory dd ? label button_data lpcs CREATESTRUCT border_pen dd ? dot_pen dd ? sizeof_text dd ? text_buffer dd ? len_btn_data = $ - button_data ps PAINTSTRUCT endl
значит у тебя в юзердата записан адрес первого байта участка памяти, выделенного VirtualAlloc. И что ты там хочешь увидеть, по этому адресу? Проверял на совпадение значений от VirtualAlloc и значения полученного через юзердата? Может причина в том, что получаешь адрес памяти, а ждешь содержимое памяти, расположенное по этому адресу?