c ++ вызов нестатической функции из статической функции - PullRequest
2 голосов
/ 04 октября 2011

При попытке вызвать нестатическую функцию возникает ошибка нарушения доступа.

мой .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
}

Надеюсь, я дал достаточно информации.

Ответы [ 3 ]

8 голосов
/ 04 октября 2011

Вы передаете NULL в качестве параметра контекста SimConnect_CallDispatch, поэтому ваш обратный вызов не знает, какой объект World будет вызывать Process - как это возможно, если вы этого не скажете? Измените вызов для передачи в this в качестве параметра контекста, как в примере:

SimConnect_CallDispatch(hSimConnect, DispatchCallback, this);
2 голосов
/ 04 октября 2011

Ваше использование:

SimConnect_CallDispatch(hSimConnect, DispatchCallback, NULL);

кажется очень подозрительным.Что означает параметр NULL в вызове этой функции?Это pContext?

2 голосов
/ 04 октября 2011

Это ломается, потому что this НЕДЕЙСТВИТЕЛЕН.

Проверьте эту часть своего кода:

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

Если reinterpret_cast завершится неудачно получит NULL - он вернет NULL, и выне проверяйте это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...