내부 구조를 쉽게 이해하려면 이상하게도 호출해보면 좋거든요 -_-;...
어셈코드는 (전 어셈을 제대로 해본적은없어여. 학기때들어보고 읽은 책도
별로 안되고..) MSDN의 COM 기초인 Dr.GUI에 보면 코드가 있어요. C코드는
대충 이럼 되지 않을까 하니까 되네여.-_-. 그냥 올려봅니다..*

/ TestVTBL.cpp : Defines the entry point for the console application.
// 2000/03/02 by bro ( bro@shinbiro.com )
// virtual table hard coding call test.

#include "stdafx.h"
#include <conio.h>

#ifndef DWORD
typedef unsigned int DWORD;
#endif

typedef void (*VFP)();

class Base
{
public:
virtual void vfp1()
{
printf("[Base::vfp1] invoked...\n");
}
virtual void vfp2()
{
printf("[Base::vfp2] invoked...\n");
}

};

class Son : public Base
{
public:
void vfp1()
{
printf("[Son::vfp] invoked...\n");
}
int m_nTemp;
};

void InvokeAssem( void* pObj , int nFunc )
{
_asm
{
MOV EAX, [pObj] ; 처음 간접주소를 얻습니다. (클래스레이아웃으로 옮김)
MOV EAX, [EAX ] ; 그 간접주소의 또 간접주소 (vtbl로 옮김)
CALL [EAX] ; vtbl의 첫 주소가 가리키는 것을 함수코드로보고 콜
}
}

extern "C" void InvokeC( void* pObj, int nFunc )
{
// 객체 메모리의 클래스 레이아웃에서 첫번째 4바이트(vtal을 가리키는 포인터)
// 를 얻어와 그것이 가리키는 vtbl테이블의 첫번째 포인터(함수포인터)
// 를 실행하는 예입니다.
((void (*)())(*(unsigned int*)(*(unsigned int*)pObj)))();
//((VFP)( *(DWORD*)(*(DWORD*)pObj) ))();
}

int main(int argc, char* argv[])
{
Son* pSon = new Son;

//InvokeAssem( (void*)pSon, 0 );
InvokeC( (void*)pSon, 0 );

delete pSon;
_getch();
return 0;
}

+ Recent posts