您的位置:首页 > 编程语言

模仿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++的实现。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐