使用stdcall模拟thiscall(调用成员函数)

Posted dearfuture

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用stdcall模拟thiscall(调用成员函数)相关的知识,希望对你有一定的参考价值。

 1 #include <iostream>
 2 using namespace std;
 3 
 4 __declspec(naked) void* get_addr(...)
 5 {
 6     __asm
 7     {
 8         mov eax, dword ptr[esp + 4]
 9         ret
10     }
11 }
12 
13 class A
14 {
15 public:
16     char *name = "dearfuture";
17     void print()
18     {
19         cout << name << ": hello world
";
20     }
21 };
22 
23 int main()
24 {
25     A a;
26     A *pa = &a;
27     void *addr = get_addr(&A::print);
28     __asm
29     {
30         mov ecx, pa
31     }
32     void(_stdcall *f)() = (void(_stdcall *)())addr;
33     f();
34     system("pause");
35     return 0;
36 }
 1 #include <iostream>
 2 using namespace std;
 3 
 4 class A
 5 {
 6 public:
 7     char *name = "dearfuture";
 8     void print()
 9     {
10         cout << name << ": hello world
";
11     }
12 };
13 
14 int main()
15 {
16     auto pFunc = &A::print;
17     void *pAddr = static_cast<void *>(&pFunc);
18     void *addr = *static_cast<void **>(pAddr);
19     void(_stdcall *f)() = (void(_stdcall *)())addr;
20 
21     A a;
22     A *pa = &a;
23     __asm
24     {
25         mov ecx, pa
26     }
27     f();
28 
29     system("pause");
30     return 0;
31 }

 

 

在msvc x86下测试通过

以上是关于使用stdcall模拟thiscall(调用成员函数)的主要内容,如果未能解决你的问题,请参考以下文章

调用约定

系统调用约定

系统调用约定

如何运用c++里的“__stdcall”?

C/C++函数的调用约定详解

将类成员回调从 __stdcall 转换为 DWORD_PTR