首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

windows讯息函数返回类型LRESULT竟然是long long int

2013-08-26 
windows消息函数返回类型LRESULT竟然是long long int我用纯c++写的添加了个EDIT类型的控件hwnd CreateWi

windows消息函数返回类型LRESULT竟然是long long int
我用纯c++写的
添加了个EDIT类型的控件


hwnd = CreateWindowEx(0,
"EDIT",//使用系统预设的控件类 
        "Caption",
        WS_CHILD | WS_VISIBLE | WS_BORDER | WS_GROUP | WS_TABSTOP | ES_WANTRETURN,
        UI_LEFT(0), UI_TOP(0), UI_COM_WIDTH, UI_COM_HEIGHT,
        GValue::GetHwnd(),
        (HMENU)IDC_TEXT_COUNTX,
        GValue::GetHinstance(),
        0
        );

然后根据这篇文章要替换消息处理函数

WNDPROC oldMsgProc = (WNDPROC)SetWindowLong (hwnd, GWLP_WNDPROC, (LONG)myProc);


我自己的消息函数是

LRESULT CALLBACK myProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam);


编译错误
[Error] cast from 'LRESULT (*)(HWND, UINT, WPARAM, LPARAM) {aka long long int (*)(HWND__*, unsigned int, long long unsigned int, long long int)}' to 'LONG {aka long int}' loses precision [-fpermissive] 

网上搜索了下说LRESULT是多种long类型,这里明显是long long int类型了

我ide用的是devcpp,编译器选择了32位(选择64位也不行),我的操作系统是64位的windows8

崩溃了,何解?
[解决办法]
LRESULT总是LONG_PTR
32位:typedef long LONG_PTR;
64位:typedef long long LONG_PTR;

如果要编写能编译成32位和64位的程序,一定要舍弃SetWindowLong(GetWindowLong),应该用SetWindowLongPtr(GetWindowLongPtr)代替它
[解决办法]

//WNDPROC oldMsgProc = (WNDPROC)SetWindowLong (hwnd, GWLP_WNDPROC, (LONG)myProc);
/**
LONG_PTR WINAPI SetWindowLongPtr(
  _In_  HWND hWnd,
  _In_  int nIndex,
  _In_  LONG_PTR dwNewLong
);


**/
WNDPROC oldMsgProc = (WNDPROC)SetWindowLongPtr((hwnd, GWLP_WNDPROC, (LONG_PTR)myProc);


试试,good luck

热点排行