P2441M 2023-01-28 13:48 采纳率: 16.7%
浏览 36
已结题

Python 中 ctypes 模块报错

我尝试使用ctypes模块做一个对glfw3的封装,在这个过程中,我遇到了一些问题。

glfwSetMonitorCallback这个函数似乎难以封装,它接受一个回调函数作为参数,又返回一个回调函数表示上一次设置的回调函数。而且这个回调函数的类型GLFWmonitorfun中还学要接收一个指针参数GLFWmonitor *monitor

typedef void (* GLFWmonitorfun)(GLFWmonitor* monitor, int event);
// ...
GLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun callback);

我在对GLFWmonitorfun的封装如下:

GLFWmonitorfun = CFUNCTYPE(None, POINTER(GLFWmonitor), c_int)

我的思路是,在封装的函数内再加一层函数对指针进行处理:

def glfwSetMonitorCallback(callback):
    def cb(monitor, event):
        if monitor:
            callback(monitor.contents, event)
        else:
            callback(None, event)

    glfw3.glfwSetMonitorCallback.argtypes = [GLFWmonitorfun]
    glfw3.glfwSetMonitorCallback.restype = GLFWmonitorfun

    last_callback = glfw3.glfwSetMonitorCallback(GLFWmonitorfun(cb))

    def last_cb(monitor, event):
        last_callback(byref(monitor), event)

    return last_cb

我的main.py文件内容如下:

from pyglfw3 import *


def cb(monitor, event):
    print(monitor, event)


glfwInit()
m = glfwGetPrimaryMonitor()
glfwSetMonitorCallback(cb)        # 第一次先设置回调
glfwSetMonitorCallback(cb)(m, 0)  # 第二次按理来说应该返回第一次设置的回调

但是不出所料地,报错了:

Traceback (most recent call last):
  File "C:\Users\Lenovo\code\Python\opengl_learning\main.py", line 11, in <module>
    glfwSetMonitorCallback(cb)(m, 0)
  File "C:\Users\Lenovo\code\Python\opengl_learning\pyglfw3.py", line 500, in last_cb
    last_callback(byref(monitor), event)
OSError: exception: access violation reading 0xFFFFFFE1C76012D0

经过调试,我能确保glfwGetPrimaryMonitor函数返回的值无误,是一个完整的GLFWmonitor对象,保险起见,还是把定义写出来吧:

def glfwGetPrimaryMonitor():
    glfw3.glfwGetPrimaryMonitor.restype = POINTER(GLFWmonitor)
    monitor = glfw3.glfwGetPrimaryMonitor()
    if monitor:
        return monitor.contents
    return None

求各位帮忙看一下,到底错在哪儿了呀??!!

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-01-28 16:16
    关注
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月28日
  • 创建了问题 1月28日

悬赏问题

  • ¥15 C++ 句柄后台鼠标拖动如何实现
  • ¥15 有人会SIRIUS 5.8.0这个软件吗
  • ¥30 comsol仿真等离激元
  • ¥15 静电纺丝煅烧后如何得到柔性纤维
  • ¥15 (标签-react native|关键词-镜像源)
  • ¥100 照片生成3D人脸视频
  • ¥15 伪装视频时长问题修改MP4的时长问题,
  • ¥15 JETSON NANO
  • ¥15 VS开发qt时如何在paintgl函数中用pushbutton控制切换纹理
  • ¥20 关于 openpyxl 处理excel文件地问题