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

COM 인터페이스의 사용법


구성 요소 개체 모델 (COM) 개체를 생성 하면, 생성 메서드가 인터페이스 포인터를 돌려준다. 이 포인터를 사용해, 그 인터페이스의 임의의 메서드에 액세스 할 수 있다. 이 포인터의 구문은, C++ 의 메서드의 경우와 같다. 다음 코드는, 전의 주제로 가리킨 예의 확장이다. 이 예에서는,IDirectPlay8Peer 개체의 생성 후,CoCreateInstance 가 돌려준 IDirectPlay8Peer 인터페이스 포인터를 사용해 IDirectPlay8Peer::Initialize 메서드를 호출해, 개체를 초기화하고 있다. 알기 쉽게, 에러 정정 코드는 생략 되어 있다.

IDirectPlay8Peer*  g_pDP = NULL;
...
CoInitialize( NULL );
...
hr = CoCreateInstance( CLSID_DirectPlay8Peer, NULL, CLSCTX_INPROC_SERVER,
                         IID_IDirectPlay8Peer, (LPVOID*) &g_pDP );

hr = g_pDP->Initialize( NULL, DirectPlayMessageHandler, 0 );

추가의 인터페이스의 요구

보통은, 생성 메서드로부터 받는 인터페이스 포인터만으로 용무는 충분하다. 실제, 개체가 공개하는 인터페이스가 IUnknown 이외에는 1 개 뿐인 일도 많다. 그러나, 많은 개체는 복수의 인터페이스를 공개한다. 이 때문에, 복수의 인터페이스의 포인터가 필요하게 되는 경우도 있다. 생성 메서드가 돌려주는 인터페이스 외에도 인터페이스가 필요한 경우, 새로운 개체를 생성 할 필요는 없다. 개체의 IUnknown::QueryInterface 메서드를 사용해 다른 인터페이스 포인터를 요구할 수 있다.

CoCreateInstance 로 개체를 생성 했을 경우는,IUnknown 인터페이스 포인터를 요구한 후,IUnknown::QueryInterface 를 호출하는 것에 의해, 필요한 모든 인터페이스를 요구할 수 있다. 다만, 이 방법은, 필요한 인터페이스가 1 개만의 경우는 불편하다. 또, 돌려주는 인터페이스 포인터를 지정할 수 없는 개체 생성 메서드를 사용하는 경우는, 전혀 도움이 되지 않는다. 실제로는, 모든 COM 인터페이스는 IUnknown 인터페이스를 확장하므로, 보통은, 명시적인 IUnknown 포인터를 얻어온다 필요는 없다.

인터페이스의 확장은, C++ 의 클래스의 계승과 유사하다. 아이 인터페이스는, 친인터페이스의 모든 메서드와 아이 독자적인 메서드를 1 개 이상 공개한다. 실제, 「확장」대신에 「계승」이라고 하는 표현을 사용하는 일도 많다. 다만, 계승은 개체 내부에서 행해지는 것이다. 애플리케이션이 개체의 인터페이스를 계승 또는 확장할 수 없다. 그러나, 아이 인터페이스를 사용하면 아이 또는 친인터페이스의 임의의 메서드를 호출할 수 있다.

모든 인터페이스는 IUnknown 의 아이이다. 이 때문에, 개체에 대해서 취득한 어느 인터페이스 포인터를 사용해도,QueryInterface 를 호출할 수 있다. 그 경우는, 요구하는 인터페이스의 인터페이스 식별자 (IID)와 인터페이스 포인터의 주소를 지정할 필요가 있다. 메서드가 돌아올 때, 이 포인터에 인터페이스 포인터가 저장 된다. 예를 들어, 다음 코드는 IDirectSound9::CreateSoundBuffer 를 호출해,1차 버퍼 개체를 생성 하고 있다. 이 개체는, 복수의 인터페이스를 공개한다. CreateSoundBuffer 메서드는 IDirectSoundBuffer9 인터페이스를 돌려준다. 다음 코드에서는,IDirectSoundBuffer9 인터페이스를 사용해 QueryInterface 를 호출하는 것에 의해,IDirectSound3DListener9 인터페이스를 요구하고 있다.

IDirectSoundBuffer9* pDSBPrimary = NULL;
IDirectSound3DListener9* pDSListener;
...
if(FAILED(hr = g_pDS->CreateSoundBuffer( &dsbd, &pDSBPrimary, NULL )))
  return hr;

if(FAILED(hr = pDSBPrimary->QueryInterface(IID_IDirectSound3DListener9,
                                           (LPVOID *) &pDSListener)))
  return hr;


© 2002 Microsoft Corporation. All rights reserved.
↑TOP