Процесс не хочет уходить

Тема в разделе "WASM.ASSEMBLER", создана пользователем Rito, 12 июл 2008.

  1. Rito

    Rito New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    59
    Есть такая проблема
    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include 'include\win32a.inc'
    5.  
    6. section '.data' data readable writeable
    7.  
    8. msg MSG <>
    9. hwnd    dd  0
    10.  
    11. ProcesName  db  'PROGRAMM',0
    12. WindowName  db  'PROGRAMM',0
    13.  
    14.     width   dd  800
    15.     height  dd  600
    16.     hinstance   dd  0
    17.     invoke  GetModuleHandle,NULL
    18.     mov [hinstance],eax
    19.  
    20.     wcl     WNDCLASSEX  <>
    21.     dwExStyle   dd      0
    22.     dwStyle     dd      0
    23.     WindowRect  RECT        <>
    24.  
    25. section '.code' code readable executable
    26.  
    27.  start:
    28.  
    29.     call    InitWindow
    30.  
    31.   msg_loop:
    32.     invoke  PeekMessage,msg, NULL, 0, 0, PM_REMOVE
    33.     cmp eax,1
    34.     jnz msg_certainFunc
    35.         cmp [msg.message],WM_QUIT
    36.         jz  end_loop
    37.         invoke  TranslateMessage,msg
    38.         invoke  DispatchMessage,msg
    39.     jmp msg_loop
    40.   msg_certainFunc:
    41.     jmp msg_loop
    42.  
    43.   end_loop:
    44.     invoke  ExitProcess,0
    45.  
    46.  
    47. proc InitWindow
    48.  
    49.     push    ebx esi edi
    50.    
    51.     mov     [WindowRect.left],0
    52.     mov     [WindowRect.right],width
    53.     mov     [WindowRect.top],0
    54.     mov     [WindowRect.bottom],height
    55.  
    56.     mov     [wcl.hInstance],hinstance
    57.     mov     [wcl.lpszClassName],ProcesName                     
    58.     mov     [wcl.lpfnWndProc],WindowFunc
    59.     mov     [wcl.style],CS_HREDRAW or CS_VREDRAW
    60.     mov     [wcl.cbSize],sizeof.WNDCLASSEX
    61.     invoke      LoadIcon,NULL,IDI_APPLICATION
    62.     mov     [wcl.hIcon],eax
    63.     invoke      LoadIcon,NULL,IDI_WINLOGO
    64.     mov     [wcl.hIconSm],eax
    65.     invoke      LoadCursor,NULL,IDC_ARROW                  
    66.     mov     [wcl.hCursor],eax
    67.     mov     [wcl.lpszMenuName],NULL                        
    68.     mov     [wcl.cbClsExtra],0                             
    69.     mov     [wcl.cbWndExtra],0
    70.     invoke      GetStockObject,WHITE_BRUSH
    71.     mov     [wcl.hbrBackground],eax
    72.  
    73.     invoke      RegisterClassEx,wcl
    74.  
    75.     invoke      CreateWindowEx, WS_EX_APPWINDOW or WS_EX_WINDOWEDGE,ProcesName,WindowName,\
    76.                     WS_OVERLAPPEDWINDOW or WS_CLIPSIBLINGS or WS_CLIPCHILDREN,0,0,800,600,0,0,[hinstance],0
    77.  
    78.     mov     [hwnd],eax
    79.  
    80.     invoke      ShowWindow,eax,SW_SHOW
    81.  
    82.     pop edi esi ebx
    83.     ret
    84.  
    85. endp
    86.  
    87. proc    WindowFunc  hwnd,msg,wparam,lparam
    88.  
    89.     push    ebx esi edi
    90.  
    91.     cmp [msg],WM_DESTROY
    92.     je  .wmdestroy
    93.  
    94.     .defwndproc:
    95.     invoke  DefWindowProc,[hwnd],[msg],[wparam],[lparam]
    96.     jmp .finish
    97.  
    98.     .wmdestroy:
    99.     xor eax,eax
    100.    
    101. .finish:
    102.     pop edi esi ebx
    103.     ret
    104.    
    105. endp
    Эта программа не хочет завершаться. Т.е. окно закрывается, а сам процесс так и висит в диспетчере задач. Из за чего может быть такое?
    Заранее спасибо
     
  2. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    а обработку сообщений после CreateWindowEx кто будет делать?
    читаем туторы Iczelion'а
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Rito
    А отладчик для кого придумали, заливай модуль.
     
  4. Rito

    Rito New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    59
    RamMerLabs
    Имеешь ввиду процедуру для обработки сообщений? Так она же есть внизу самом
    proc WindowFunc hwnd,msg,wparam,lparam

    Clerk
    Я смотрел в Оле. Обработка wmdestroy проходит нормально, но после этого при выходе я потерялся где то в недрах windows. И даже на бряках установленных на главном цикле не брякнулся. И есно никакого ExitProcess не происходит
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Rito
    Может дело и не в этом, но cmp eax,1 это не (совсем) верно, нужно делать test eax,eax + jz ..., поскольку для bool в общем случае определено только значение false = 0, а true != 0 и вообще говоря не обязано всегда быть = 1
     
  6. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    та чо тут говорить когда цикла сообщений нет =/

    GetMessage
    TranslateMessage
    DispatchMessage
     
  7. Rito

    Rito New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    59
    leo
    Дело не в этом. Попробовал test. Всё равно процесс продолжает висеть

    2FED
    PeekMessage
    TranslateMessage
    DispatchMessage
    Это уже не считается циклом сообщений?
     
  8. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Извеняюсь, привык что цикл в конце "WinMain"
     
  9. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    А почему собственно Peek? почему не GetMes.. Peek ведь сразу возвращает значение, я думаю тут это не надо. может так будет работать

    Код (Text):
    1. cmp [msg],WM_DESTROY
    2.     invoke  PostQuitMessage,0
    Код (Text):
    1.  msg_loop:
    2.     invoke  GetMessage,msg, 0, 0, 0
    3.     test    eax,eax
    4.     jz  end_loop
    5.         invoke  TranslateMessage,msg
    6.         invoke  DispatchMessage,msg
    7.  
    8.     jmp msg_loop
    9.  
    10.   end_loop:
    11.     invoke  ExitProcess,0
     
  10. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Rito
    Нажатие на кнопку закрытия окна посылает этому окну сообщение WM_DESTROY. Оно не посылает потоку сообщение WM_QUIT - хотя бы потому, что окон может быть много, и закрытие далеко не каждого окна должно приводить к завершению приложения. Поэтому обработчик оконных сообщений для главного окна (случай, когда как раз и должно получиться завершение приложения) самостоятельно посылает потоку WM_QUIT. Для этого существует функция PostQuitMessage, вызов которой нужно явным образом прописать в ответ на WM_DESTROY для главного окна.
     
  11. Rito

    Rito New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    59
    Хе, про PostQuitMessage совершенно забыл. Всё теперь отлично всё.
    Благодарю всех за помощь