如何在钩子函数中获取函数的 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
}
}
我最近开始使用 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
}
}