模仿MFC寻找消息响应函数指针的 核心 代码
2014-06-05 16:17
309 查看
typedef struct
{
UINT nMessage;
UINT nCode;
UINT nID;
UINT nLastID;
UINT nSig;
int * p;
}TEST;
const TEST* AFXAPI
MyAfxFindMessageEntry(const TEST* lpEntry,
UINT nMsg, UINT nCode, UINT nID)
{
ASSERT(offsetof(TEST, nMessage) == 0);
ASSERT(offsetof(TEST, nCode) == 4);
ASSERT(offsetof(TEST, nID) == 8);
ASSERT(offsetof(TEST, nLastID) == 12);
ASSERT(offsetof(TEST, nSig) == 16);
_asm
{
MOV EBX,lpEntry
MOV EAX,nMsg
MOV EDX,nCode
MOV ECX,nID
__loop:
CMP DWORD PTR [EBX+16],0 ; nSig (0 => end)
JZ __failed
CMP EAX,DWORD PTR [EBX] ; nMessage
JE __found_message
__next:
ADD EBX,SIZE AFX_MSGMAP_ENTRY
JMP short __loop
__found_message:
CMP EDX,DWORD PTR [EBX+4] ; nCode
JNE __next
// message and code good so far
// check the ID
CMP ECX,DWORD PTR [EBX+8] ; nID
JB __next
CMP ECX,DWORD PTR [EBX+12] ; nLastID
JA __next
// found a match
MOV lpEntry,EBX ; return EBX
JMP short __end
__failed:
XOR EAX,EAX ; return NULL
MOV lpEntry,EAX
__end:
}
return lpEntry;
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
const TEST t[] = { {7, 1, 2, 5, 7, NULL}, {4, 5, 6, 8,7, NULL}, {8, 9, 10 ,12, 7, NULL}, {0, 0, 0, 0, 0, NULL} };
const TEST * n = MyAfxFindMessageEntry(t, 0, 0, 0);
if (n != NULL)
{
printf("%p %d", n, n->nLastID);
}
else
{
printf("没有找到");
}
system("pause");
return nRetCode;
}
MFC是用汇编实现的。 也有C++的实现。
{
UINT nMessage;
UINT nCode;
UINT nID;
UINT nLastID;
UINT nSig;
int * p;
}TEST;
const TEST* AFXAPI
MyAfxFindMessageEntry(const TEST* lpEntry,
UINT nMsg, UINT nCode, UINT nID)
{
ASSERT(offsetof(TEST, nMessage) == 0);
ASSERT(offsetof(TEST, nCode) == 4);
ASSERT(offsetof(TEST, nID) == 8);
ASSERT(offsetof(TEST, nLastID) == 12);
ASSERT(offsetof(TEST, nSig) == 16);
_asm
{
MOV EBX,lpEntry
MOV EAX,nMsg
MOV EDX,nCode
MOV ECX,nID
__loop:
CMP DWORD PTR [EBX+16],0 ; nSig (0 => end)
JZ __failed
CMP EAX,DWORD PTR [EBX] ; nMessage
JE __found_message
__next:
ADD EBX,SIZE AFX_MSGMAP_ENTRY
JMP short __loop
__found_message:
CMP EDX,DWORD PTR [EBX+4] ; nCode
JNE __next
// message and code good so far
// check the ID
CMP ECX,DWORD PTR [EBX+8] ; nID
JB __next
CMP ECX,DWORD PTR [EBX+12] ; nLastID
JA __next
// found a match
MOV lpEntry,EBX ; return EBX
JMP short __end
__failed:
XOR EAX,EAX ; return NULL
MOV lpEntry,EAX
__end:
}
return lpEntry;
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
const TEST t[] = { {7, 1, 2, 5, 7, NULL}, {4, 5, 6, 8,7, NULL}, {8, 9, 10 ,12, 7, NULL}, {0, 0, 0, 0, 0, NULL} };
const TEST * n = MyAfxFindMessageEntry(t, 0, 0, 0);
if (n != NULL)
{
printf("%p %d", n, n->nLastID);
}
else
{
printf("没有找到");
}
system("pause");
return nRetCode;
}
MFC是用汇编实现的。 也有C++的实现。
相关文章推荐
- MFC中用户自定义消息的消息响应函数原型
- MFC中如何添加消息响应函数
- 【转载】MFC动态创建控件及其消息响应函数
- C语言宏定义##连接符和#符的使用(MFC就是靠##自动把消息和消息函数对应起来了,借助宏来减少switch case代码的编写量)
- 在MFC中从一个线程工作函数中向窗口发送消息(this指针的妙用)
- MFC 动态创建控件及添加消息响应函数
- MFC中多个子菜单对应同一个消息响应函数
- 在MFC中从一个线程工作函数中向窗口发送消息(this指针的妙用)
- MFC实现打开、保存文件对话框和浏览文件夹对话框,把代码直接拷贝到要响应的按钮函数下面就行了
- VS2008中MFC自定义消息响应函数
- 解决给MFC的类添加消息响应函数时报错“because the code element 'Cxxx' is read only ”
- MFC单文档添加按钮控件、消息响应函数
- MFC学习笔记之:VC6.0中通过向导添加的消息响应系统自动添加的代码及删除方式
- 在MFC中从一个线程工作函数中向窗口发送消息(this指针的妙用) .
- 在MFC中从一个线程工作函数中向窗口发送消息(this指针的妙用)
- 动态调试中获取mfc程序的消息响应函数列表的思路
- 不知道在MFC中如何从线程工作函数中向窗口发送消息?用好一个指针就够了
- MFC 多个控件用同一个消息响应函数
- 在MFC中从一个线程工作函数中向窗口发送消息(this指针的妙用) .
- 关于PHP-Zend framework2 框架 学习过程。 阅前须知: ZF2中的配置文件是可以静态文件配置来注册和通过相关函数动态注册。 1.EventManager(事件驱动),关于事件驱动,在ZF2相关资料没有详细说明,可以参考ANDROID的事件驱动,MFC的消息响应/事件驱动。