【问题标题】:How to get class object of a function in hooked function?如何在挂钩函数中获取函数的类对象?
【发布时间】:2015-04-17 17:18:34
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c++ qt hook interceptor


    【解决方案1】:

    我终于成功了!!! 经过一番研究,我知道一个函数的当前类对象只不过是函数的this指针,只有当函数属于某个类时,这个指针才能存在。 我也开始知道 QT 类函数遵循各种调用约定。我所指的类遵循 __fastcall 的函数。 __fastcall 调用约定如果要成功挂钩,则需要将前 2 个隐藏参数传递给函数。所以我将void *(空指针)作为函数的前两个参数传递,它起作用了。 然后我才知道第一个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
         }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-12-11
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      相关资源
      最近更新 更多