При попытке вызвать нестатическую функцию возникает ошибка нарушения доступа.
мой .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.
Я пытаюсь реализовать simconnect.h
oo. 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
}
Надеюсь, я дал достаточно информации.