使用 glutMouseFunc 获取访问冲突读取位置 0x000000b0

Posted

技术标签:

【中文标题】使用 glutMouseFunc 获取访问冲突读取位置 0x000000b0【英文标题】:Get Access violation reading location 0x000000b0 with glutMouseFunc 【发布时间】:2014-02-17 21:56:16 【问题描述】:

我正在使用 glutMouseFunc(mouseFunction);作为回调,但是我在这一行 glutMouseFunc(mouseFunction);

处不断收到访问冲突读取位置 0x000000b0

我没有使用任何 glutInit 函数,因为它们会干扰程序,而且无论如何它们都不是必需的。

有谁知道为什么我在这个回调时收到这个错误?

这是我的初始化函数:

   int Initialize()
   
      /* Bunch of code here that is irrelevant to the problem.......*/
      glutMouseFunc(mouseFunction); // Error occurs here.
   

这是我的鼠标函数:

    void mouseFunction(int button, int state, int x, int y)
      if(button==GLUT_MIDDLE_BUTTON && state==GLUT_DOWN) 
          
               printf("Pressed middle mouse button!");
          
      

我注意到一件事,当我在 Initialize 方法中将 mouseFunction() 作为正常函数调用调用时不会发生错误,但是一旦我尝试将 mouseFunction 与 glutMouseFunc(mouseFunction) 一起使用,就会发生错误所以我相信这更多是 glutMouseFunc 的错误。

【问题讨论】:

我没有使用任何 glutInit 函数,因为它们会干扰程序,而且无论如何它们都不是必需的。 呃,什么! 崩溃时调用堆栈的内容是什么?可能在 GLUT 中,因为您没有费心正确设置它,然后它就会爆炸。 我的意思是 glutCreateWindow 在大多数情况下会干扰,所以我把它排除在外。 干扰是什么意思?没有窗口怎么能有鼠​​标事件呢? 它是通过另一个类在外部完成的。当我放置 glutCreateWindow 时,它会阻止 Window 实际出现,因为该窗口是从其他地方出现的。 【参考方案1】:

我没有使用任何 glutInit 函数,因为它们会干扰程序,而且它们无论如何都不是必需的。

这是你的问题。如果您要使用 GLUT,请正确使用它。

glutInit() 函数必不可少的 - 它所做的部分工作是在 GLUT 中初始化内部状态。正如您所发现的,如果未正确初始化此状态,GLUT 的其他部分(例如鼠标事件处理!)可能无法正常工作。

【讨论】:

好的,但是当我使用带有适当参数的 glutInit() 函数时,我仍然得到相同的结果...【参考方案2】:

鉴于您的 cmets 的其他问题,您的问题很简单,即您在没有 GLUT 窗口的情况下调用 glutMouseFunc。尝试在未正确初始化或未创建 GLUT 窗口的情况下注册 GLUT 事件回调会使您的程序崩溃。

您还说“GLUT 会干扰”您的实际窗口。那么,如果您没有可以实际接收事件以供 GLUT 调度的窗口,您为什么还要尝试注册 GLUT 回调呢?

您应该使用已有窗口的鼠标事件处理。那你用GLUT做什么呢? GLUT 的全部目的是为您创建一个窗口并进行事件管理。如果你不为此使用 GLUT,那么就不要使用 GLUT。

如果是为了茶壶,那么你也可以在没有 GLUT 的情况下拥有它。

【讨论】:

感谢您的回答。这是我得到的最有用的信息,基本上是在陈述显而易见的事情。我会试着用这个走另一条路。再次感谢!

以上是关于使用 glutMouseFunc 获取访问冲突读取位置 0x000000b0的主要内容,如果未能解决你的问题,请参考以下文章

访问冲突读取位置尝试获取系统时间时

使用 glut 函数 glutMouseFunc() 将窗口坐标转换为 3D 世界坐标

使用统一内存时 CUDA 中出现意外的读取访问冲突错误

使用 ReadProcessMemory 获取字符串值的访问冲突

抛出异常:读取访问冲突。 **bp** 为 0xFFFFFFFFFFFFFFFF

将 glutTimerFunc 与 glutMouseFunc 一起使用