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