天天看點

模仿MFC尋找消息響應函數指針的 核心 代碼

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++的實作。 

繼續閱讀