上周开始整理个人资料,翻腾出了一些老代码。食之无味,弃之可惜,把一两段记录到这里来也不错。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
#include "stdafx.h" class CTest { public: int i; CTest() : i(0) { } virtual int Wow() { _tprintf(_T("Wow, i: %d\n"), i); return i; } __declspec(dllexport) int Aha() { _tprintf(_T("Aha, i: %d\n"), i); return i; } }; CTest t; struct CTest2 : CTest { }; void Test(void* p) { CTest2* pt = (CTest2*)p; pt->Wow(); // void* p = &CTest::Aha; typedef int (*fnAha)(); fnAha aha = NULL; t.i = 7788; HINSTANCE hInstance = GetModuleHandle(NULL); (FARPROC&)aha = GetProcAddress(hInstance, (LPCSTR)1); __asm { mov ecx, p } aha(); } int _tmain(int argc, _TCHAR* argv[]) { Test(&t); return 0; } |
上面的代码特意创建了一个基类的对象,而用子类的指针强制指向了它。在此情况下,首先尝试调用基类的虚方法并还修改了数据成员的值,无误;接下来采用 Windows 平台的标准方法用以找到已经作为符号被导出的基类方法的地址,通过直接向 this 寄存器赋值指定好对象,直接调用函数指针作用于该对象,执行的结果表明此方法是成功的。