如何从 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
是不够的,因为此时信息已经丢失。
我有这个功能:
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
是不够的,因为此时信息已经丢失。