我最近开始使用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提前。 。 。
答案 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
}
}