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

时间:2015-02-12 11:57:30

标签: c++ qt hook interceptor

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

我有一段文字,其中一些文字是粗体,一些是常规风格。现在我想区分常规文本和粗体文本,并对两者执行不同的操作。我知道将为要显示的每行文本调用QFont::setFamily(QString)函数。所以我挂钩了setFamily()。现在我能够获得文本的字体系列,但段落的所有文本(即常规和粗体)都具有相同的字体系列。现在我想检查这个文本是否是粗体,所以为此我需要一个QFont类的对象,以便我可以调用它bold();返回true或false。最终我想要setFamily()函数的这个指针。(就像我们在target pointcut拦截中得到AspectJ一样。)

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
     }
}

请帮帮我。 Thanx提前。 。 。

1 个答案:

答案 0 :(得分:0)

最后我得到了我的方式! 经过一些研究,我开始知道函数的当前类对象只是函数的this指针,只有当函数属于某个类时,该指针才能存在。     我也知道QT类函数遵循各种调用约定。我所指的类遵循__fastcall的函数。如果要成功挂钩,__fastcall调用约定需要将前2个隐藏参数传递给函数。所以我通过void *(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
     }
}