DirectX 9.0 의 소개 DirectX SDK 의 사용법 C 또는 C++ 에 의한 DirectX 프로그래밍 COM 의 사용법 DirectX 9.0 COM 인터페이스에서의 ATL 의 사용   [목차열람] [주소복사] [슬롯비우기]
DirectX 9.0 COM 인터페이스에서의 ATL 의 사용
 
Microsoft DirectX 9.0

DirectX 9.0 COM 인터페이스에서의 ATL 의 사용


Microsoft® DirectX® 9.0 으로 Active Template Library (ATL)를 사용하기 위해서(때문에)는, ATL 와의 호환성을 위해서(때문에) 인터페이스를 재정의할 필요가 있다. 이것에 의해,CComQIPtr 클래스를 올바르게 사용해, 인터페이스의 포인터를 취득할 수 있다.

ATL 에 맞추어 인터페이스를 재정의하지 않으면 다음의 에러 메시지가 표시된다.

C:\Program Files\Microsoft Visual Studio\VC98\ATL\INCLUDE\atlbase.h(566) :
  error C2787: 'IDirectXFileData' : no GUID has been associated with this object

다음 샘플 코드는,IDirectXFileData 인터페이스를 정의하는 방법을 나타내고 있다.

// Explicit declaration
struct __declspec(uuid("{3D82AB44-62DA-11CF-AB39-0020AF71E433}")) IDirectXFileData;

// Macro method
#define RT_IID(iid_, name_) struct __declspec(uuid(iid_)) name_
RT_IID("{1DD9E8DA-1C77-4D40-B0CF-98FEFDFF9512}", IDirectXFileData);

인터페이스를 재정의한 후는,Attach 메서드를 사용해, ::Direct3DCreate9 가 돌려주는 인터페이스 포인터에 인터페이스를 Attach 할 필요가 있다. 이렇게 하지 않으면IDirect3D9 인터페이스는 스마트 포인터 클래스에 의해 올바르고 릴리즈 되지 않는다.

개체가 생성 되었을 때와CComPtr 클래스에 인터페이스를 할당할 수 있었을 때에,CComPtr 클래스는 인터페이스 포인터로 내부적으로 IUnknown::AddRef 를 호출한다. 인터페이스 포인터의 누수를 막기 위해, ::Direct3DCreate9 가 돌려주는 인터페이스로 IUnknown::AddRef 를 호출해서는 안 된다.

다음 코드는,IUnknown::AddRef 를 호출하지 않고 인터페이스를 올바르게 릴리즈 한다.

CComPtr<IDirect3D9> d3d;
d3d.Attach(::Direct3DCreate9(D3D_SDK_VERSION));

위에의 코드를 사용한다. 다음 코드는 사용해서는 안 된다. 이 코드에서는,IUnknown::AddRef 에 이어 IUnknown::Release 를 호출하고 있어, ::Direct3DCreate9 에 의해 추가된 참조를 릴리즈 하지 않는다.

CComPtr<IDirect3D9> d3d = ::Direct3DCreate9(D3D_SDK_VERSION);

이것은, Microsoft Direct3D® 에 대해, 이러한 방법으로 Attach 메서드를 사용할 필요가 있는 유일한 장소이다.

CComPTR 클래스 및 CComQIPtr 클래스의 더 자세한 정보는, Atlbase.h 헤더 파일의 정의를 참조할것.



© 2002 Microsoft Corporation. All rights reserved.
↑TOP