2

我用这些行在 Win64 上编写了一个 C++ 应用程序:

Window* wnd = 0;
long l = reinterpret_cast<long> ( wnd );

编译器在最后一行显示以下错误:

error: cast from 'window::Window*' to 'long int' loses precision [-fpermissive] 

我使用此值将其放入 SetWindowLong (WindowsAPI) 函数中。

我无法理解这个错误。我正在使用 MinGW-w64 (ruben build)。

4

2 回答 2

3

阅读我原来的评论

问题是sizeof(window::Window *)大于sizeof(long),这意味着您无法有效地将指针的值存储在l. 这解释了错误。

现在,您真正想要的是实际使用SetWindowLongPtr

注意要编写与 32 位和 64 位版本的 Windows 兼容的代码,请使用SetWindowLongPtr. 在为 32 位 Windows 编译时,SetWindowLongPtr定义为对SetWindowLong函数的调用。

window::Window *wnd = ...;
HWND handle = ...;
int index = ...; /* e.g. GWLP_USERDATA */
LONG_PTR val = reinterpret_cast<LONG_PTR>(wnd);
SetWindowLongPtr(handle, index, val);
于 2012-09-08T19:50:49.947 回答
1

该消息表明sizeof(long)您正在编译的架构上的 小于sizeof(window::Window *). long太小而无法将指针的值存储在您所针对的体系结构上。

具体来说,您的目标似乎是 64 位 Windows 系统架构,其中使用了 LLP64 数据模型。在 LLP64 中,along是 32 位,指针是 64 位。

于 2012-09-08T19:46:33.120 回答