Как прокомментировал Дэниел Вагнер, это ошибка в пакете Win32.MessageBoxW
необходимо безопасно импортировать из-за множества побочных эффектов.
Функция messageBox
является оберткой для импортируемой функции «небезопасно» MessageBoxW
.Когда небезопасно импортированная функция функции импортируется небезопасно, Haskell предполагает, что поток не будет вызывать какой-либо код Haskell, пока не вернется.Однако, если вы вызовете MessageBoxW
, Windows выдаст довольно много оконных сообщений в окно, которое вы создали в строке 30, поэтому код на Haskell будет выполняться, пока вы находитесь в небезопасной внешней функции.Это также причина, по которой вызовы messageBox
будут работать до тех пор, пока это окно не будет создано.
Возможный обходной путь - просто исправить функцию самостоятельно.Сначала измените
import Graphics.Win32
на
import Graphics.Win32 hiding (messageBox, c_MessageBox)
Затем скопируйте определения messageBox
и c_MessageBox
из модуля Graphics.Win32.Misc
, удалив unsafe
и / илиsafe
добавлено:
messageBox :: HWND -> String -> String -> MBStyle -> IO MBStatus
messageBox wnd text caption style =
withTString text $ \ c_text ->
withTString caption $ \ c_caption ->
failIfZero "MessageBox" $ c_MessageBox wnd c_text c_caption style
foreign import stdcall safe "windows.h MessageBoxW"
c_MessageBox :: HWND -> LPCTSTR -> LPCTSTR -> MBStyle -> IO MBStatus