2014-04-18 96 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