GWL_USERDATA - Что-то я не пойму

Тема в разделе "WASM.BEGINNERS", создана пользователем dgs, 3 фев 2011.

  1. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    Еще раз здравствуйте. Помогите найти ошибку, вроде GWL_USERDATA записываю правильно, а толку нет... Хелп плиз...
    Код (Text):
    1.         load_user_data:
    2.                 pusha
    3.                 invoke  SetLastError, 0
    4.                 invoke  GetWindowLong,[hwnd],GWL_USERDATA
    5.                 or      eax, eax
    6.                 jz      defwndproc
    7.                 mov     [button_memory], eax
    8.  
    9.                 cld
    10.                 mov     esi, eax;[button_memory]
    11.                 lea     edi, [button_data]
    12.                 mov     ecx, len_btn_data
    13.                 rep     movsb
    14.  
    15.                 mov     eax, [button_memory]
    16.                 mov     edx, [eax+CREATESTRUCT.lpszClass]
    17.                 invoke  MessageBox, 0, edx, 0, 0
    18.                 popa
    19.                 ret
    20.  
    21.         save_user_data:
    22.                 pusha
    23.                 cld
    24.                 lea     esi, [button_data]        
    25.                 mov     edi, [button_memory]    
    26.                 mov     ecx, len_btn_data        
    27.                 rep     movsb
    28.  
    29.                 invoke  SetLastError, 0
    30.                 mov     eax, [button_memory]
    31.                 invoke  SetWindowLong, [hwnd], GWL_USERDATA, eax
    32.                 or      eax, eax
    33.                 jz      error_wnd_long
    34.                 popa
    35.                 ret
    ps синтакс fasm
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    lea eax,[button_memory] ?
    invoke SetWindowLong, [hwnd], GWL_USERDATA, eax
     
  3. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    мимо
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    на прием тоже менял?
     
  5. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    ну по идеи button_memory это dword, а вот в него простым опкодом mov заброшено значение которое мне вернула VirtualAlloc. Я проверял вызовы WinApi и все зовершаються без ошибок. SetWindowLong должна запомнить dword, что скорей всего и происходит нормально, а вот блоки связанные с копированием button_data в button_memory и обратно у меня честно вызывают сомнения, так как я слабо представляю как в стеке распологаються переменные после locals

    Код (Text):
    1. proc ButtonProc hwnd, wmsg, wparam, lparam
    2.      locals
    3.         button_memory      dd ?
    4.         label button_data
    5.               lpcs               CREATESTRUCT
    6.               border_pen         dd ?
    7.               dot_pen            dd ?
    8.               sizeof_text        dd ?
    9.               text_buffer        dd ?
    10.         len_btn_data = $ - button_data
    11.         ps           PAINTSTRUCT
    12.      endl
     
  6. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    значит у тебя в юзердата записан адрес первого байта участка памяти, выделенного VirtualAlloc. И что ты там хочешь увидеть, по этому адресу? Проверял на совпадение значений от VirtualAlloc и значения полученного через юзердата?
    Может причина в том, что получаешь адрес памяти, а ждешь содержимое памяти, расположенное по этому адресу?
     
  7. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    в точку... Спасибо, буду медитировать...