如何从 long long 转换为 DRAWITEMSTRUCT*

How to convert from long long to DRAWITEMSTRUCT*

我有这个功能:

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

我得到这个异常:

抛出异常:读取访问冲突。 pDrawParam 是 0x2B4FE760。异常指向 HDC hDC = pDrawParam->hDC;

HDC 是这样定义的:

HANDLE HDC 
value: void* 

这个 hDC 在正确的站点上是这样的:

HDC hDC in 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。 lParam 是 long 类型。我已经尝试并将其更改为 long long 但我仍然遇到异常。我想这也不是 (DRAWITEMSTRUCT*)(long long)(lParam) 转换为 DRAWITEMSTRUCT*.

的正确方法

我怀疑你的问题是paraml的定义。

您正在尝试将 64 位指针存储在 32 位 long 中,这会截断指针,使其无效。

static long paraml = 0L; 更改为 static long long paraml = 0LL 或更好的 static std::uintptr_t paraml = 0;

std::uintptr_t 被设计成一个足够大的整数类型来包含一个地址。

paraml 转换为 long long 是不够的,因为此时信息已经丢失。