消息框错误:外部导入不安全

2024-01-12

import Graphics.Win32
import System.Win32.DLL
import Control.Exception (bracket)
import Foreign
import System.Exit
main :: IO ()
main = do
    mainInstance <- getModuleHandle Nothing
    hwnd <- createWindow_ 200 200 wndProc mainInstance
    createButton_ hwnd mainInstance
    messagePump hwnd
wndProc :: HWND -> WindowMessage -> WPARAM -> LPARAM -> IO LRESULT
wndProc hwnd wmsg wParam lParam
    | wmsg == wM_DESTROY = do
        sendMessage hwnd wM_QUIT 1 0
        return 0
    | wmsg == wM_COMMAND && wParam == 1 = do
        messageBox nullPtr "Yahoo!!" "Message box" 0 -- Error! Why? :(
        return 0
    | otherwise = defWindowProc (Just hwnd) wmsg wParam lParam
createWindow_ :: Int -> Int -> WindowClosure -> HINSTANCE -> IO HWND
createWindow_ width height wndProc mainInstance = do
    let winClass = mkClassName "ButtonExampleWindow"
    icon <- loadIcon Nothing iDI_APPLICATION
    cursor <- loadCursor Nothing iDC_ARROW
    bgBrush <- createSolidBrush (rgb 240 240 240)
    registerClass (cS_VREDRAW + cS_HREDRAW, mainInstance, Just icon, Just cursor, Just bgBrush, Nothing, winClass)
    w <- createWindow winClass "Button example" wS_OVERLAPPEDWINDOW Nothing Nothing (Just width) (Just height) Nothing Nothing mainInstance wndProc
    showWindow w sW_SHOWNORMAL
    updateWindow w
    return w
createButton_ :: HWND -> HINSTANCE -> IO ()
createButton_ hwnd mainInstance = do
    hBtn <- createButton "Press me" wS_EX_CLIENTEDGE (bS_PUSHBUTTON + wS_VISIBLE + wS_CHILD) (Just 50) (Just 80) (Just 80) (Just 20) (Just hwnd) (Just (castUINTToPtr 1)) mainInstance
    return ()
messagePump :: HWND -> IO ()
messagePump hwnd = allocaMessage $ \ msg ->
    let pump = do
        getMessage msg (Just hwnd) `catch` \ _ -> exitWith ExitSuccess
        translateMessage msg
        dispatchMessage msg
        pump
    in pump

这是带有按钮的简单 win32 gui 应用程序,但是当我单击按钮时,必须有一个消息框(22 行),但出现错误:

Buttons.exe:时间表:不安全地重新输入。也许是“外国人” 导入不安全”应该是“安全”吗?

我该如何解决它?


正如 Daniel Wagner 评论的那样,这是 Win32 软件包中的一个错误。MessageBoxW必须安全进口,因为它有很多副作用。

The messageBox函数是“不安全”导入的包装器MessageBoxW功能。当一个不安全导入的函数函数被不安全导入时,Haskell 假定该线程在返回之前不会调用任何 Haskell 代码。但是,如果您致电MessageBoxW,Windows 会向您在第 30 行创建的窗口抛出相当多的窗口消息,因此当您处于不安全的外部函数中时,Haskell 代码将会运行。这也是为什么呼吁messageBox将工作until该窗口已创建。

一种可能的解决方法是简单地自行更正该函数。首先,改变

import Graphics.Win32

to

import Graphics.Win32 hiding (messageBox, c_MessageBox)

然后,复制以下定义messageBox and c_MessageBox从模块Graphics.Win32.Misc, with unsafe删除和/或safe added:

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

消息框错误:外部导入不安全 的相关文章

  • Haskell/GHC:使用相同模式匹配多个一元构造函数

    所以我正在尝试定义 TrieSet 数据类型 尽管我知道我不需要 http hackage haskell org package TrieMap module Temp where import Data Map data TrieSet
  • Haskell 中美元符号 ($) 和 id 函数之间有关系吗?

    这几天我正在读一篇评论莫纳德挑战 http mightybyte github io monad challenges 我强烈推荐给像我这样的 Haskell 初学者 我最终得到了这个线程 https news ycombinator co
  • Haskell,optparse-generic 的未命名命令行参数

    我在用着optparse 通用 https hackage haskell org package optparse generic解析名为的程序的命令行参数example 我有一个带有命名字段的数据类型 记录语法 例如 data Exam
  • win32 内容已更改,但除非移动窗口,否则不会显示更新

    我的 win32 GUI 内容每秒都会更改 但除非手动移动窗口 否则不会显示更新 我尝试每秒弹出一个消息框来触发窗口刷新 它成功了 因此 这证明我的内容确实发生了变化 但窗口没有更新 我希望刷新窗口而不是每次都弹出消息框 有没有这样的窗口功
  • 导入 Haskell 模块

    我是哈斯克尔的新手 为什么当我尝试使用时Days from Data Time我收到此错误 Could not find module Data Time It is a member of the hidden package time
  • Haskell 中的前提条件检查有哪些选项

    这是一个简单的问题 我认为答案很复杂 一个非常常见的编程问题是函数返回某些内容 或者前置条件检查失败 在Java中 我会使用一些抛出异常的断言函数IllegalArgumentException在方法的开头 如下所示 method body
  • 如何为强制长度为 2^n 的向量类型定义可用的 Applicative 实例

    对于某些应用程序 我需要长度为 2 n 的向量 为了强制某些操作的长度匹配 我使用 ist 应用实例定义了我的类型 如下所示 LANGUAGE GADTs DataKinds FlexibleInstances FlexibleContex
  • 无点镜头创建不进行类型检查

    在函数中test 我遍历一个列表 从它的成员生成镜头 然后打印一些数据 当我使用有针对性的呼叫风格时 这会起作用 当我使其成为无点时 它无法进行类型检查 为什么会出现这种情况 我该如何解决这个问题 在我看来 GHC 并没有保留排名较高的信息
  • 我应该在 Turtle 或 Foldl 包中使用折叠吗?

    我在使用 Turtle 时遇到了一些困难 直到盯着难以理解的错误消息几分钟后才意识到我使用了错误的fold功能 https hackage haskell org package turtle 1 5 8 docs Turtle Shell
  • 持久 selectList 导致错误“无法将类型‘BaseBackend backend0’与‘SqlBackend’匹配”

    我遇到以下编译错误 Couldn t match type BaseBackend backend0 with SqlBackend arising from a use of runSqlite The type variable bac
  • Haskell:是的,没有类型类。为什么是整数?

    我有一个关于 GHCi 如何假定整数类型的问题 我正在阅读 Learn you a Haskell 是 否类型的课程 如果您想阅读全文 这里有一个链接 http learnyouahaskell com making our own typ
  • 如何在 Haskell 中向右或向左移动列表的 1 个元素?

    嗨 我一直在寻找答案 但找不到 假设我们有一个像这样的列表 1 10 4 5 3 我怎样才能将 5 向左移动 使这个列表变成 1 10 5 4 3 我尝试过了swapElementsAt通过找到该元素的索引 但它看起来非常不足 swapEl
  • Haskell 泛化问题(涉及列表理解)

    假设我想知道a上的所有要点 x y 矩形内的平面has 我可以使用列表推导式来计算 如下所示 let myFun2D x y x lt 0 2 y lt 0 2 现在 如果我想为一个人完成同样的事情 x y z 空间 我可以采取同样的方式并
  • Haskell 中的中缀运算符优先级

    对于以下 Haskell 表达式 返回 a gt gt f 应该读作 返回a gt gt f or 返回 a gt gt f 这里的相关规则是什么 规则始终是函数应用程序的优先级高于任何运算符 因此 return a gt gt f 被解析
  • Haskell 入门

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 几天来 我一直试图理解 Haskell 中的函数式编程范例 我通过阅读教程和观看截屏视频
  • Traversable 类型类的用途

    有人可以向我解释一下类型类的目的是什么吗Traversable 类型类定义是 class Functor t Foldable t gt Traversable t gt where So Traversable is a Functor
  • 为什么 ZipList 不是 List 的默认应用实例

    我目前正在学习 Haskell 中的应用程序 如果我没记错的话 列表有两个不同的应用实例 List and ZipList 第二个被定义为包装列表值的新类型 这ZipList应用实例对我来说似乎更直观 这可能是一个愚蠢的问题 但有具体原因吗
  • 如何通过“cabal build”或“stack build”构建带有图标的项目

    我想构建一个带有图标的可执行文件 通过谷歌搜索 我发现这里的说明 https wiki haskell org Setting an executable icon 但它只能通过编译源文件来工作ghc 如果我想构建一个具有可执行文件的项目c
  • 管道:多个流消费者

    我编写了一个程序来计算语料库中 NGram 的频率 我已经有一个函数 它消耗一串令牌并生成一个订单的 NGram ngram Monad m gt Int gt Conduit t m t trigrams ngram 3 countFre
  • ST monad 是如何工作的?

    我知道 ST monad 有点像 IO 的弟弟 而 IO 又是添加了状态 monadRealWorld魔法 我可以想象状态 也可以想象 RealWorld 以某种方式放入 IO 中 但每次我写一个类型签名ST the sST monad 的

随机推荐

  • 将 Firefox 切换为使用与 windows.host 文件中不同的 DNS

    例如 我在不同的服务器上有一个开发站点 但我正在尝试从实时站点复制内容 因此将实时站点放在 IE 中而将开发站点放在 FF 中会很方便 我尝试了 FoxyProxy 但似乎无法让它工作 我用它来用 localserver 覆盖系统的 DNS
  • Hibernate的batch_size最佳值

    谁能建议我如何选择最有价值的hibernate jdbc batch size 如果内存和CPU没有问题 可以使用500这样的值 EDIT In 本章 http docs jboss org hibernate orm 4 0 devgui
  • 根据具有特定顺序的向量对数据框行进行排序

    有没有一种更简单的方法来确保数据帧的行根据 目标 向量进行排序 就像我在下面的简短示例中实现的那样 df lt data frame name letters 1 4 value c rep TRUE 2 rep FALSE 2 df na
  • 带有 AbstractClass 通知程序的 MultiProvider

    我正在尝试为 Google 和 Facebook 登录创建一个单一界面 我的SignInProvider好像 abstract class SignInProvider with ChangeNotifier bool get isSign
  • 没有名为 future 的模块

    我正在 python 中运行一个电报机器人 并且在 raspbian pi3 上使用 python3 6 以下是我的进口 from future import absolute import division print function
  • 用边框半径隐藏的溢出在图像上显示奇怪的灰色边框

    我有一个圆形 div 它包含一个图像和另外两个 div 问题是该 div 周围显示灰色边框 所有浏览器 chrome 和 firefox 均存在此问题 我尝试过添加浏览器 css vendor prefixes 掩码 但没有结果 我不能使用
  • 我应该如何“取消”ConcurrentDictionary 中的 AddOrUpdate?

    我已阅读 MSDN 文档并这个博客 http blogs msdn com b pfxteam archive 2010 01 08 9945809 aspx我需要以下逻辑 For a ConcurrentDictionary
  • Optaplanner 中可空的链式规划变量

    因此 我正在研究对过度约束的路由问题进行建模 其中并非所有任务都必须在该特定规划问题中进行 相反 目标是最大化该规划问题中的任务 我想这应该很容易通过允许计划变量可为空来实现 但似乎 Optaplanner不允许在链式计划变量上执行此操作
  • 在矩形内绘制线宽 matplotlib

    我在使用 Patches 在 matplotlib 中绘制矩形时遇到问题 什么时候linewidth提供给patches Rectangle 边框绘制在矩形的外部 这是一个例子 import matplotlib pyplot as plt
  • 使用单个 SQL 查询构建层次结构树

    我有一个SQL表具有以下结构 id int par int relational to id name varchar Column par包含对id or NULL如果没有参考 此表旨在构建一个层次树 然后 给定数据 id par nam
  • 如何将 TextView 添加到 GridView 布局中的 ImageView 中?

    我需要一个 GridView 但在每个网格中 其上方 内部都会有一个 ImageView 和 TextView 它就像每个网格中的项目图像 以及图像上的项目名称 我正在尝试 public View getView int position
  • 添加后如何在 Android 中实现下拉导航操作栏?

    通过遵循本指南 http wptrafficanalyzer in blog adding drop down navigation to action bar in android http wptrafficanalyzer in bl
  • 将 java String[] 设置为 postgres 准备好的语句时出错

    我正在尝试将字符串数组插入 Postgres 中 我从 Postgres 收到无效类型错误 public static void main String args throws SQLException String skus 0514 0
  • 从 ipython 导入

    如果我将 IDLE 与 python 2 7 一起使用 import cv import cv2 它有效 但如果我使用 ipython 笔记本 它给了我错误 ImportError Traceback 最近调用 最后 在 gt 1份导入简历
  • numPy 中的意外特征向量

    我见过this https stackoverflow com questions 13739186 compute eigenvector using a dominant eigenvalue问题 这与我尝试使用 numPy 计算 Py
  • 将新节点添加到链表的新方法

    void addNewNode struct node head int n struct node temp struct node malloc sizeof struct node temp gt data n temp gt lin
  • 单例bean和原型bean有什么区别?

    我是春天的新手 我读到了这篇文章 基本上 bean 具有定义其在应用程序中存在的范围 Singleton 意味着每个 Spring IOC 容器对单个对象实例的单个 bean 定义 原型 意味着任意数量的对象实例的单个 bean 定义 那么
  • Postman 上的授权类型 Bearer Token

    我正在尝试使用 Postman 测试一些端点 所有端点都需要一个可以通过登录获取的令牌 所以我这样做了 请求 1 登录成功后 我可以从响应中访问令牌 然后将该令牌存储在全局变量中 let token pm response json loc
  • 旧版应用程序上的 Windows GUI 自动化

    我正在尝试自动化一个名为的旧 Windows 应用程序FacTel5 http www movistar es empresas ayuda factel abierto empresas 我已经能够自动化登录部分 但下一个表单是一个类似项
  • 消息框错误:外部导入不安全

    import Graphics Win32 import System Win32 DLL import Control Exception bracket import Foreign import System Exit main IO