从D-to-C回调访问D对象时出现访问冲突错误

时间:2015-04-19 12:23:58

标签: d glfw derelict3

我最近开始将我的脚趾浸入DerelictGLFW。我有两个类,其中一个是Window类,另一个是InputHandler类(窗口事件的事件管理器)。在我的光标位置回调中,我使用窗口用户指针并尝试设置位置,但是在尝试设置回调和GLFW之外的任何值时,我立即收到访问冲突错误。 GLFW已初始化,不会报告任何错误。谢谢你的时间。

Class Window
{
    private:
        double cursorX;

    ...other stuffs...

    @property
    void cursorX(double x) nothrow
    {
        cursorX = x;
    }
}

extern(C) void mousePosCallback(GLFWwindow* window, double x, double y)
{
    Window* _window = window.userPointer 
    //userPointer is a static function that gets the window user pointer
    //and casts it to a Window*

    _window.cursorX = x;
}

static Window* userPointer(GLFWwindow* window)
{
    return cast(Window*) glfwGetWindowUserPointer(window);
}

编辑:

为回调添加了extern(C),错误仍然存​​在。

在进入回调后立即更正""在尝试在回调和GLFW之外设置任何值时立即#34;

在问题

中添加了userPointer功能

2 个答案:

答案 0 :(得分:1)

必须在extern(C)块中声明mousePosCallback。这是为了使调用约定匹配。

extern (C) void mousePosCallback(GLFWwindow* window, double x, double y)
{
    Window* _window = window.userPointer 
    //userPointer is a static function that gets the window user pointer
    //and casts it to a Window*

    _window.cursorX = x;
}

答案 1 :(得分:0)

我似乎发现了错误的来源。在窗口初始化期间,我尝试使用this设置用户指针。我不确定为什么,但是将它移动到一个不是从构造函数调用的不同函数似乎可以解决问题。问题解决了,但是有人能帮助我理解为什么吗?这对我来说似乎很奇怪。