c ++从静态函数调用非静态函数

时间:2011-10-03 21:27:46

标签: c++ windows

当我尝试调用非静态函数时,我遇到了访问冲突错误。

我的.h文件看起来像这样。

class World
{
public:
    World();
    virtual ~World();
    static void CALLBACK DispatchCallback(
        SIMCONNECT_RECV *pData,
        DWORD cbData,
        void *pContext
    );
    void Process(SIMCONNECT_RECV *pData, DWORD cbData);
    virtual void frameEvent();
    virtual void init();
};

现在在.cpp文件中的init()函数我调用一个函数将数据返回给我的回调函数。

SimConnect_CallDispatch(hSimConnect, DispatchCallback, NULL);

将数据发送到DisPatchCallback函数。

在此函数中,以下代码位于:

void CALLBACK World::DispatchCallback(
    SIMCONNECT_RECV *pData,
    DWORD cbData,
    void *pContext)
{
    World *pThis = reinterpret_cast<World*>(pContext);
    pThis->Process(pData, cbData);
}

此函数是一个静态函数,它创建一个World对象来调用Process函数。

这有效,但它在想要访问frameEvent函数的行上断开。

void World::Process(SIMCONNECT_RECV *pData, DWORD cbData)
{
    HRESULT hr;

    switch(pData->dwID)
    {
    case SIMCONNECT_RECV_ID_EVENT_FRAME:
        frameEvent(); //it breaks here frameEvent is a non static function
        break;
    }
}
  

访问冲突读取位置0x00000000。

有人能指出我正确的方向来解决这个问题。?

如果您想知道我正在为Microsoft Flight Simulator X编写插件。

我正试图以oo方式实施simconnect.h。 Msdn展示了我正在尝试实施的一个例子。

class CName
{
    void Dispatch();
    static void DispatchCallback(
        SIMCONNECT_RECV *pData,
        DWORD cbData,
        void *pContext
    );
    void Process(SIMCONNECT_RECV *pData, DWORD cbData);

    HANDLE hSimConnect; // use SimConnect_Open to set this value.
};

void CName::Dispatch()
{
    ::SimConnect_Dispatch(hSimConnect, &CName;::DispatchCallback, this);
}

// static function
void CName::DispatchCallback(
    SIMCONNECT_RECV *pData,
    DWORD cbData,
    void *pContext)
{
    CName *pThis = reinterpret_cast<CName*>(pContext);
    pThis->Process(pData, cbData);
}

void CName::Process(SIMCONNECT_RECV *pData, DWORD cbData)
{
    // do processing of SimConnect data
}

我希望我提供了足够的信息。

3 个答案:

答案 0 :(得分:8)

您将NULL作为上下文参数传递给SimConnect_CallDispatch,因此您的回调无法知道调用World的{​​{1}}对象 - 怎么可能如果你不告诉它?将调用更改为传递Process作为上下文参数,如示例所示:

this

答案 1 :(得分:2)

它因为this为NULL而中断。

检查代码的这一部分:

World *pThis = reinterpret_cast<World*>(pContext);
pThis->Process(pData, cbData);

如果reinterpret_cast 失败 获得NULL - 它返回NULL,并且您不会检查它。

答案 2 :(得分:2)

您的使用:

SimConnect_CallDispatch(hSimConnect, DispatchCallback, NULL);

似乎非常可疑。调用该函数时NULL参数的含义是什么?那是pContext吗?