typedef BOOL (WINAPI *ExtTextOutA_)
% G8 {. S- a: \5 {1 ~: X& K c就是定义了一个函数类型,我们故意把他定义成和原始的API ExtTextOutA一样
, n( \+ J& V& c* i* Q就是为了ExtTextOutA_ _ExtTextOutA 声明一个与原始API ExtTextOutA一样一样的函数指针( X% s, u6 y' s8 S
然后_ExtTextOutA = (ExtTextOutA_)GetProcAddress(hm, "ExtTextOutA"); 为这个函数指针赋值为原始API的函数地址( f: l4 T7 n4 J2 R
这样_ExtTextOutA 就是real_ExtTextOutA的意思,完全把他当原始API ExtTextOutA 来使用就是了
+ H& {- R7 N" z2 t6 f* ~. X& `6 J( |9 V8 r% I+ v8 C7 A( ?4 D, z. B0 ? R$ Y4 L
你编译的DLL有点问题,我打开PE文件找到 ExtTextOutA 部分,发现虽然你导出了ExtTextOutA ,但却不是你实现的那个
* k1 p3 R# W1 }& o! k8 A3 [( K9 a. x0 G" a- E" `
$ c+ g& d. g; H5 M! r2 r' |, x# m3 u; _8 S; V; G4 C
' ]6 D2 V' m! y7 @) Q0 I-
- //6A80偏移处你 实际上的函数体代码,可以看到只是个简单的代理,明显不是你自己实现的那个
- 10006A80 > 8B4424 20 mov eax,dword ptr ss:[esp+20]
- 10006A84 8B4C24 1C mov ecx,dword ptr ss:[esp+1C]
- 10006A88 8B5424 18 mov edx,dword ptr ss:[esp+18]
- 10006A8C 50 push eax
- 10006A8D 8B4424 18 mov eax,dword ptr ss:[esp+18]
- 10006A91 51 push ecx
- 10006A92 8B4C24 18 mov ecx,dword ptr ss:[esp+18]
- 10006A96 52 push edx
- 10006A97 8B5424 18 mov edx,dword ptr ss:[esp+18]
- 10006A9B 50 push eax
- 10006A9C 8B4424 18 mov eax,dword ptr ss:[esp+18]
- 10006AA0 51 push ecx
- 10006AA1 8B4C24 18 mov ecx,dword ptr ss:[esp+18]
- 10006AA5 52 push edx
- 10006AA6 50 push eax
- 10006AA7 51 push ecx
- 10006AA8 FF15 80520110 call dword ptr ds:[10015280] ; GDI32.ExtTextOutA
- 10006AAE A3 24570110 mov dword ptr ds:[10015724],eax
- 10006AB3 C3 retn
复制代码
2 z3 S/ O+ X& m6 l, W$ ]
" q: W6 i& F, |- u! e我想主要是你定义ExtTextOutA 的时候漏了个int, VC认为这是你另外一个内部函数,而导出的是另外一个-
- int ExtTextOutA(
- HDC hdc,
- int x,
- int y,
- unsigned int flags,
- const RECT* lprect,
- LPCSTR str,
- unsigned int count,
- const int* lpDx)
- {
-
- // MessageBox(0, "i'm in ExtTextOutA now!", 0, 0);//做你想做的事情
复制代码 ' U- V, D2 R: a& {8 t3 r
另外附上我重新帮你编译过的DEBUG版DLL4 C( D4 L! i$ k% Q9 @; k# [
. B/ E* d0 b) h& G O% E2 j
|