Ich erlebe eine Zugriffsverletzung Fehler, wenn ich versuche, nicht statische Funktion aufrufen.
meine .h
Datei sieht wie folgt aus.
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();
};
Nun rufe ich in meiner .cpp-Datei in der init()-Funktion eine Funktion auf, die Daten an meine Callback-Funktion zurückgibt.
SimConnect_CallDispatch(hSimConnect, DispatchCallback, NULL);
Der sendet Daten an den DisPatchCallback
Funktion.
In dieser Funktion befindet sich der folgende Code:
void CALLBACK World::DispatchCallback(
SIMCONNECT_RECV *pData,
DWORD cbData,
void *pContext)
{
World *pThis = reinterpret_cast<World*>(pContext);
pThis->Process(pData, cbData);
}
Diese Funktion ist eine statische Funktion, die ein World-Objekt erzeugt, um die Funktion Process aufzurufen.
Das funktioniert, aber es bricht in der Zeile ab, in der es auf die Funktion frameEvent zugreifen will.
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;
}
}
Zugriffsverletzung beim Lesen von Speicherplatz 0x00000000.
Kann mir jemand den richtigen Weg weisen, um dieses Problem zu lösen?
Falls es Sie interessiert, ich schreibe ein Plugin für den Microsoft Flight Simulator X.
Ich versuche zu implementieren simconnect.h
auf eine oo Art. Msdn zeigt ein Beispiel, das ich gerade versuche zu implementieren.
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
}
Ich hoffe, ich habe genug Informationen gegeben.