дизассемблировал Awl.dll из комплекта Finereader Pro 8 IDA дает следующий блок: Код (Text): .text:2382CBB0 ; --------------- S U B R O U T I N E --------------------------------------- .text:2382CBB0 .text:2382CBB0 ; Attributes: bp-based frame .text:2382CBB0 .text:2382CBB0 ; protected: bool __thiscall AWL::CMessageLoop::TryOnIdle(long) .text:2382CBB0 public ?TryOnIdle@CMessageLoop@AWL@@IAE_NJ@Z .text:2382CBB0 ?TryOnIdle@CMessageLoop@AWL@@IAE_NJ@Z proc near .text:2382CBB0 ; CODE XREF: AWL::CMessageLoop::DoMessageLoop(void)+8Ep .text:2382CBB0 .text:2382CBB0 var_10 = dword ptr -10h .text:2382CBB0 var_C = dword ptr -0Ch .text:2382CBB0 var_4 = dword ptr -4 .text:2382CBB0 arg_0 = dword ptr 8 .text:2382CBB0 .text:2382CBB0 push ebp .text:2382CBB1 mov ebp, esp .text:2382CBB3 push 0FFFFFFFFh .text:2382CBB5 push offset loc_2387DD50 .text:2382CBBA mov eax, large fs:0 .text:2382CBC0 push eax .text:2382CBC1 mov large fs:0, esp .text:2382CBC8 sub esp, 8 .text:2382CBCB mov edx, [ebp+arg_0] .text:2382CBCE mov eax, [ecx] ; первый член класса .text:2382CBD0 push ebx .text:2382CBD1 push esi .text:2382CBD2 push edi .text:2382CBD3 mov [ebp+var_10], esp .text:2382CBD6 push edx .text:2382CBD7 mov [ebp+var_4], 0 .text:2382CBDE call dword ptr [eax+8] ; <- интересующая строка .text:2382CBE1 mov ecx, [ebp+var_C] ; .text:2382CBE4 mov large fs:0, ecx .text:2382CBEB pop edi .text:2382CBEC pop esi .text:2382CBED pop ebx .text:2382CBEE mov esp, ebp .text:2382CBF0 pop ebp .text:2382CBF1 retn 4 .text:2382CBF1 ?TryOnIdle@CMessageLoop@AWL@@IAE_NJ@Z endp как видим метод CMessageLoop::TryOnIdle вызывается по конвенции thiscall и ссылка на объект должна лежать в ecx не могу понять одного, имеется Код (Text): .text:2382CBDE call dword ptr [eax+8] ; <- интересующая строка по какой конвенции это вызов, и как хотя бы приблизительно это выглядет на Си? Единственное, что я могу тут понять, так это то, что в ecx - ссылка на объект CMessageLoop, в еах кладётся значение первого поля этого объекта. Это поле представляет из себя структуру или массив как минимум из трёх элементов, и третьим элементом является указатель на функцию, которая, собственно и вызывается.
Код (Text): class CMessagLoop { virtual void Method1(); virtual void Method2(); virtual void Method3(); } this -> [vfptr] -> [vtable] [vtable + 0] -> [ Method1 address ] -> Method1() [vtable + 4] -> [ Method2 address ] -> Method2() [vtable + 8] -> [ Method3 address ] -> Method3() Вот примерно так. Здесь стрелки - это операции разыменования указателей. Т.е. this указывает непосредственно на vfptr, который есть ничто иное, как указатель на таблицу виртуальных функций vtable, которая, в свою очередь, представляет собой массив указателей на сами виртуальные функции.