当我尝试调用非静态函数时,我遇到了访问冲突错误。
我的.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
}
我希望我提供了足够的信息。
答案 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
吗?