'CS/COM'에 해당되는 글 2건

  1. 2009.08.09 [COM/C++] offsetofclass 매크로
  2. 2009.04.24 [COM] [예제] COM Aggregation 에서의 casting

[COM/C++] offsetofclass 매크로

CS/COM 2009. 8. 9. 22:41

ATL 소스 분석중 나온 매크로로 COM_INTERFACE_ENTRY에 사용된다.
#define offsetofclass(base, derived) \
((DWORD_PTR)(static_cast<base*>((derived*)_ATL_PACKING))  -  _ATL_PACKING))
베이스 클래스의 오프셋을 구하는 매크로다...

별거 아닌데.. DWORD_PTR을 unsigned long* 로 해석해서 완전 해맸다... 히밤




:

[COM] [예제] COM Aggregation 에서의 casting

CS/COM 2009. 4. 24. 07:00
COM공부중 Aggregation 공부하던중 왠지 casting 부분에서 급 혼란. -_-; Casting을 하게 되면, Casting된 Object를 Base class부터 생각하고,  이후 그 Object의 Derived class를 생각하자!!! -_-;;;
class IUnknown
{
public:
	virtual void QueryInterface() = 0;
	virtual void AddRef() = 0;
	virtual void Release() = 0;
};

class IDummy : public IUnknown
{
public:
	virtual void Fx() = 0;
};

class INondelegatingUnknown
{
public:
	virtual void NondelegatingQueryInterface() = 0;
	virtual void NondelegatingAddRef() = 0;
	virtual void NondelegatingRelease() = 0;
};

class C : public IDummy,
	      public INondelegatingUnknown
{
public:
	virtual void QueryInterface() { std::cout << "QueryInterface" << std::endl; }
	virtual void AddRef() { std::cout << "AddRef" << std::endl; }
	virtual void Release() { std::cout << "Release" << std::endl; }

	virtual void NondelegatingQueryInterface() 
                 { std::cout << "NondelegatingQueryInterface" << std::endl; }
	virtual void NondelegatingAddRef() 
                 { std::cout << "NondelegatingAddRef" << std::endl; }
	virtual void NondelegatingRelease() 
                 { std::cout << "NondelegatingRelease" << std::endl; }

	virtual void Fx() { std::cout << "Fx()" <<  std::endl; }

	C();

public:
	IUnknown* m_pI;
	void Go();
};

C::C()
{
	m_pI = reinterpret_cast<IUnknown*>
                   ( static_cast<INondelegatingUnknown*>(this) ); 
}

void C::Go()
{
	m_pI->QueryInterface();
}

int _tmain(void)
{
	C c;

	c.Go();

	return 0;
}
Inside COM Aggregation 예제
: