如何在钩子函数中获取函数的 class 对象?

How to get class object of a function in hooked function?

我最近开始使用 madhookc 挂钩进行应用程序拦截 library.I 我正在挂钩应用程序中调用的方法来处理文本。有一次我卡住了,需要你的帮助。

我有一段文字,其中有些文字是粗体,有些是普通字体。现在我想区分常规文本和粗体文本并对两者进行不同的操作。我知道 QFont::setFamily(QString) 函数会为即将成为 displayed.So 的每一行文本调用 setFamily()。现在我可以获得文本的字体系列,但是该段落的所有文本(即常规和粗体)都具有相同的字体系列。现在我想检查这个文本是否是粗体,所以我需要一个 QFont class 的对象,这样我就可以称它为 bold(); ,其中 returns 为真或错误的。最终我想要 setFamily() 函数的这个指针。(就像我们在 AspectJ 拦截的 pointcut 中得到 target 一样。)

void WINAPI newsetFamily( QString & family );
void (WINAPI *UnhooksetFamily)( QString & family );


void WINAPI newsetFamily ( QString & family )
{
     QFont *font=this_pointer;
     if(font->bold())
     {
          //do this
     }
     else
     {
           //do this
     }
}

请帮助我。提前谢谢。 . .

我终于如愿以偿了!!! 经过一些研究,我知道函数的当前 class 对象不过是函数的 this 指针,只有当函数属于某个 class. 我也开始知道 QT class 函数遵循各种调用 conventions.The class 我指的是遵循 __fastcall 的函数。 __fastcall 如果要成功挂钩,调用约定需要将前 2 个隐藏参数传递给函数。所以我传递了 void * (空指针)作为函数的前 2 个参数并且它起作用了。 然后我才知道第一个 void * 指针不过是函数的 this 指针。这就是我的目标。

解决代码:

void (__fastcall *UnhooksetFamily)(  QFont *This,void *noUse,QString & family );


void __fastcall newsetFamily ( QFont *This,void *noUse,QString & family )
{
     QFont *font=This;
     if(font->bold())
     {
          //do this
     }
     else
     {
           //do this
     }
}