글 수 83
예전에 하이텔 게제동 일반 프로그래밍 게시판에 올렸던 글입니다.
제 목:[답변] 아래 vtbl 관련자료:없음 [25554]
보낸이:유영천 (yuchi ) 2001-01-23 13:15 조회:143
검색은 따로 하지 않습니다.
일반적으로 다음과 같이 구현하죠.virtual함수 사용의 대표적인 예인
com을 예로 들어봅시다.
interfalce IUnknown
{
virtual STDMETHODIMP QueryInterface(REFIID, PPVOID) = 0;
virtual STDMETHODIMP_(ULONG) AddRef(void) = 0;
virtual STDMETHODIMP_(ULONG) Release(void) = 0;
};
class CoComponent : public IUnknown
{
STDMETHODIMP QueryInterface(REFIID, PPVOID);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
};
이 경우 CoComponent의 인스턴스가 생성되면 4바이트짜리 vtable의 첫번째
포인터 하나를 가지고 있습니다.가장 앞부분에 가지고 있죠.
CoComponenet* pCom = new CoComponent;
pCom->AddRef();
요렇게 하면 call dword ptr [pCom+8] 이 됩니다.
vtable을 검색해서 뒤지는건 아니고 컴파일 시에 직접 베이스 포인터로부터
의 옵셋을 기록합니다.
따라서 이런 경우 IUnknown 에서 어떤 순서로 함수를 선언했느냐에 따라
함수가 들어있는 테이블의 순서가 결정됩니다.또 이 순서와 프로토타입만
알면 테이블의 내용을 다른 함수 포인터로 바꿔치기하므로서 간단하게
호출해야할 할 함수를 바꿀수도 있습니다.
이 특성이 가장 잘 이용된 것이 com이라고 할 수 있습니다.
설명이 좀 부실한데 도움이 되셨는지..
제 목:[답변] 아래 vtbl 관련자료:없음 [25554]
보낸이:유영천 (yuchi ) 2001-01-23 13:15 조회:143
검색은 따로 하지 않습니다.
일반적으로 다음과 같이 구현하죠.virtual함수 사용의 대표적인 예인
com을 예로 들어봅시다.
interfalce IUnknown
{
virtual STDMETHODIMP QueryInterface(REFIID, PPVOID) = 0;
virtual STDMETHODIMP_(ULONG) AddRef(void) = 0;
virtual STDMETHODIMP_(ULONG) Release(void) = 0;
};
class CoComponent : public IUnknown
{
STDMETHODIMP QueryInterface(REFIID, PPVOID);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
};
이 경우 CoComponent의 인스턴스가 생성되면 4바이트짜리 vtable의 첫번째
포인터 하나를 가지고 있습니다.가장 앞부분에 가지고 있죠.
CoComponenet* pCom = new CoComponent;
pCom->AddRef();
요렇게 하면 call dword ptr [pCom+8] 이 됩니다.
vtable을 검색해서 뒤지는건 아니고 컴파일 시에 직접 베이스 포인터로부터
의 옵셋을 기록합니다.
따라서 이런 경우 IUnknown 에서 어떤 순서로 함수를 선언했느냐에 따라
함수가 들어있는 테이블의 순서가 결정됩니다.또 이 순서와 프로토타입만
알면 테이블의 내용을 다른 함수 포인터로 바꿔치기하므로서 간단하게
호출해야할 할 함수를 바꿀수도 있습니다.
이 특성이 가장 잘 이용된 것이 com이라고 할 수 있습니다.
설명이 좀 부실한데 도움이 되셨는지..