2014-04-18 27 views
0

我试图在应用程序中绕行一个函数。我有它的来源可用。调用约定是错误的,我无法弄清楚。 C++

class Foot : public Something, public SomethingElse {  
public: 
    Foot(double SomethingAgain, double Somethings, 
         Blahblah *AnotherThing = NULL); 

    virtual ~Foot(); 
    virtual void detourmepls(const char *ARGUMENT); 
}; 

这是如何在头文件中定义的。

这是我用来定义它,所以我会从我的dll使用正确的地址来调用它。

void (__cdecl* detourmepls)(const char *stuff); 

虚拟void函数的真正调用约定是什么?

任何帮助表示赞赏。

新修改和INFOS:

我使用MS走弯路1.5

detourmepls = (void(__thiscall*)(void *Pthis,void *Unknown,const char *))DetourFunction((PBYTE)ADDRESS, (PBYTE)hookedFunction); 

这是我试过的弯路(其漂亮搞砸了。)

+3

我假设你传递函数作为C回调,这是不可能的。如果注册回调函数允许传递用户数据,则编写一个静态函数,并将'this'指针传递给注册函数。 –

+0

你正在得到什么错误?当我尝试调用原始函数时, – vishram0709

+0

应用程序崩溃。 – user3548518

回答

0

背景

具有虚函数的回调需要一个'this'对象来解析虚函数。虚拟函数指针实际上更像是一个vtable“偏移量”(并且在存在多个虚拟双重秘密继承时相当多毛)。

__cdecl不支持任何。

你注册回调的API是什么样的?听起来就像是C-api。这些有时会带来无效*。如果没有,那么你需要存储的对象somehrere。

回调函数只,没有数据

如果只有一个回调函数,也没有用户数据,你需要seprately存储在你身边的对象指针和一个静态函数可以解决虚拟函数调用,这是你注册的那个。用户数据ARG

void registerCallback(void (__cdecl* callbackfn)(const char* stuff)); 

class Foo { 
    static Foo* s_callback_object; 

    ~Foo() { 
      // never hurts 
      if (this == s_callback_object) 
       s_callback_object = 0; 
    } 

    static void Foo::callbackResolver(const char* stuff) { 
      assert(s_callback_object); 
      s_callback_object->detourmepls(stuff);  
    } 
} 

Fop* foo::s_callback_object = 0; 

Foo myFoo; 
Foo::s_callback_object = &myFoo; 
registerCallback(&Foo::callBackResolver); 

回调函数:

(这是它应该怎么做,伙计)

对于案例2,用户数据,你可以投,为您的对象,而不是:

void registerCallback(void (__cdecl* callbackfn)(const char* stuff), 
        void *userdata); 

class Foo { 
    static void Foo::callbackResolver(const char* stuff, void *userdata) { 
      Foo* foo = reinterpret_cast<Foo*>(userdata); 
      foo->detourmepls(stuff);  
    } 
} 

Foo myFoo; 
registerCallBack(&Foo::callbackResolver, &myFoo); 

后一种方案是,即使在普通的C编程非常有用,所以如果你做你自己的API,像这样做。 :)

+0

我使用MS Detours 1.5 – user3548518