Проблема при вызове GetOpenFileName

Тема в разделе "WASM.WIN32", создана пользователем _220, 29 май 2008.

  1. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    Собственно проблема такая, после вызова все работает нормально (как и сам вызов вроде), но после закрытия главного окна процесс остается висеть и работать. Совершенно точно установил, что без вызова GetOpenFileName прога завершается нормально.

    .data
    filterstr db "All Files",0,"*.*",0
    db "Text Files",0,"*.txt",0,0
    buffer db MAXSIZE dup(0)
    ofn OPENFILENAME <>
    .....................

    в WM_CREATE написано

    mov ofn.lStructSize,SIZEOF ofn
    m2m ofn.hWndOwner, hWin
    m2m ofn.hInstance, hInstance
    mov ofn.Flags,OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or\
    OFN_EXPLORER or OFN_HIDEREADONLY
    mov ofn.lpstrFilter, offset filterstr
    mov ofn.lpstrFile, offset buffer
    mov ofn.nMaxFile, MAXSIZE
    .................................
    .if uMsg == WM_COMMAND
    mov eax, wParam
    .if ax == 1000
    invoke GetOpenFileName, addr ofn

    После этого прога (процесс) убивается только диспетчером задач (окно закрывается нормально). Кажется я когда-то сталкивался с чем-то подобным, но не помню как решил проблему.
     
  2. jhons

    jhons New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2007
    Сообщения:
    26
    не думаю что после именно этого ... чесно. посмотри .. сей пример точно не "висит" после.
    посмотри что в посткуите окна родителя делается .. на всяк случай.
     
  3. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    Да, пример не висит однако. А что должно в посткуите делаться? Сложилось впечатление, что окно уничтожается, а цикл обработки ссобщений продожает крутиться...
    в общем вот цикл

    StartLoop:
    xor eax,eax
    invoke GetMessage,ADDR msg,eax,eax,eax
    test eax,eax
    jz ExitLoop
    invoke TranslateMessage, ADDR msg
    invoke DispatchMessage, ADDR msg
    jmp StartLoop
    ExitLoop:

    а вот сообщения
    .....................................
    .elseif uMsg == WM_CLOSE
    invoke DestroyWindow, HwndRichEdit
    invoke DestroyWindow, hWnd
    .elseif uMsg == WM_DESTROY
    invoke PostQuitMessage,NULL
    .else
    invoke DefWindowProc,hWin,uMsg,wParam,lParam
    ret
    .endif
    xor eax,eax
    ret

    Ума не приложу, от чего это может быть
     
  4. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    Аа, все понял. Трабл был в том, что я не вызывал ExitProcess.
     
  5. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    _220 А вот такой проблемы в Win98 у тебя не было бы
    Я давно пишу
    Код (Text):
    1. mov edi,offset msg
    2. message_loop: push ebx  
    3.     push ebx
    4.     push ebx
    5.     push edi
    6.     call _imp__GetMessageA@16  
    7.     xchg eax,ecx
    8.     jecxz short exit_msg_loop
    9.         push edi
    10.         call _imp__TranslateMessage@4
    11.     push edi
    12.     call _imp__DispatchMessageA@4    
    13.     jmp short message_loop
    14. exit_msg_loop: ret
    И все прекрасно работает если нет GetOpenFileName или GetSaveFileName
     
  6. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    GetOpenFileName создаёт для своих целей несколько дополнительных потоков и не прибивает их при завершении. ret из главного потока выходит в kernel32, где делается ExitThread. Если поток один, то ExitThread из него приводит к завершению процесса; в противном случае продолжают крутиться остальные потоки (фактически они ничего не делают, но система об этом не знает). Так что тут нужно делать явный вызов ExitProcess, да...
    P.S. При завершении через ret есть одна тонкость - под 9x при таком способе нельзя разрушать регистр ebp (под NT можно).