我已经使用裸函数挂钩了一个导出的 MFC DLL 函数。
裸函数定义如下:
__declspec(裸)
static void __cdecl GenericHook(void* __this,class CScrollViewAccess* objParam1, class CRect& objParam2,unsigned int iParam1, unsigned long iParam2, char* szParam1,
void* vParam1,类 CFont* objParam3,类 CFont* objParam4,
类 CBrush* objParam5)
{ /*函数体开始*/
__asm pushad; /* 第一个“参数”,也用于存储寄存器 */
__asm 推送 ecx;/* 填充以便 ebp+8 引用第一个“参数” */
/* 设置标准序言 */
__asm 推送 ebp;
__asm mov ebp, esp;
__asm sub esp, __LOCAL_SIZE;
如果(flg == 假)
{
//RECT* rct = reinterpret_cast(&objParam2);
hInst = LoadLibrary("C:\\Sample.dll"); /// MFC DLL
funcPTR = (CMYCLASS_)(((int)hInst)+((int)0x00001032));
funcPTR(__this,objParam2);
/* 标准尾声 */
__asm mov esp, ebp;
__asm pop ebp;
__asm pop ecx; /* 清除填充 */
__asm 流行音乐;/* 清除第一个“参数” */
__asm jmp [蹦床];
}
/*函数体结束*/
Mfc dll具有以下功能:
无效 CMyClass::returnRect(类 CRect& objParam)
{
int 宽度 = objParam.Width();
int 高度 = objParam.Height();
CPoint pt = objParam.TopLeft();
文件* fp;
字符 szEnter[6] = {13,0,10,0,0,0};
fp = fopen("c:\\LogFolder\\log.txt","ab+");
fprintf(fp,"宽度: %d 高度: %d X坐标: %d Y坐标: %d\n%s",width,height,pt.x,pt.y,szEnter);
fclose(fp);
}
将 CRect& 参数传递给 MFC DLL 后,记录的值是错误的。
如何处理参考对象?