Как конфертировать из long long в DRAWITEMSTRUCT * - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть эта функция:

GwBoolean win95_draw_button(DRAWITEMSTRUCT *pDrawParam, GwCore *pCore)
{
    ...
    assert(pDrawParam);
    HDC hDC = pDrawParam->hDC;
    ...
}

И я получаю это исключение:

Исключение: нарушение прав чтения. pDrawParam был 0x2B4FE760. Исключение указывает на HDC hDC = pDrawParam->hDC;

HD C определяется следующим образом:

HANDLE HDC 
value: void* 

и этот hD C на правильном сайте, как это:

HD C hD C в struct tagDRAWITEMSTRUCT Здесь вызывается функция win95_draw_button:

GwBoolean GwPushButton::EventHandler(GwEvent *ev)
{
     long long lParam;
     GwWord wParam;
     GwWindowParams(&wParam, &lParam);
     ...

     // Painting in Win95 Style
    win95_draw_button ((DRAWITEMSTRUCT*)(long long)(lParam),this);
}

GwWindowParams определяется следующим образом (если это помогает):

PREEXPORT void              POSTEXPORT GwWindowParams(GwWord* nwParam, long long* nlParam); 

И объявление выглядит так:

 void GwWindowParams(GwWord *nwParam, long long *nlParam)
{
    GwFUNCTION_TRACE(GwWindowParams(GwWord *,long long*), 0)

    *nwParam = paramw;
    *nlParam = paraml;
}

paraml определяется так: static long paraml = 0L;

Я настоятельно предполагаю, что проблема здесь в lParam. Парам имеет тип долго. Я уже пытался и изменил его на долго, но я все еще получил исключение. Я думаю, это также не правильный способ (DRAWITEMSTRUCT*)(long long)(lParam) конвертировать в DRAWITEMSTRUCT*.

1 Ответ

1 голос
/ 14 апреля 2020

Я подозреваю, что ваша проблема в определении paraml.

Вы пытаетесь сохранить 64-битный указатель в 32-битном long, который усекает указатель, аннулируя его.

Измените static long paraml = 0L; на static long long paraml = 0LL или лучше static std::uintptr_t paraml = 0;.

std::uintptr_t предназначен для целочисленного типа, достаточно большого, чтобы содержать адрес.

Casting paraml до long long недостаточно, поскольку информация уже потеряна на этом этапе.

...