Share via


IClassFactory::CreateInstance 메서드(unknwn.h)

초기화되지 않은 개체를 만듭니다.

구문

HRESULT CreateInstance(
  [in]  IUnknown *pUnkOuter,
  [in]  REFIID   riid,
  [out] void     **ppvObject
);

매개 변수

[in] pUnkOuter

개체가 집계의 일부로 만들어지는 경우 집계의 제어 IUnknown 인터페이스에 대한 포인터를 지정합니다. 그렇지 않으면 이 매개 변수는 NULL이어야 합니다.

[in] riid

새로 만든 개체와 통신하는 데 사용할 인터페이스의 식별자에 대한 참조입니다. pUnkOuterNULL인 경우 이 매개 변수는 일반적으로 초기화 인터페이스의 IID입니다. pUnkOuterNULL이 아니면 riid를 IID_IUnknown 합니다.

[out] ppvObject

riid에서 요청된 인터페이스 포인터를 수신하는 포인터 변수의 주소입니다. 반환이 성공하면 *ppvObject 에 요청된 인터페이스 포인터가 포함됩니다. 개체가 riid에 지정된 인터페이스를 지원하지 않는 경우 구현은 *ppvObjectNULL로 설정해야 합니다.

반환 값

이 메서드는 다음 값뿐만 아니라 E_INVALIDARG, E_OUTOFMEMORY 및 E_UNEXPECTED 표준 반환 값을 반환할 수 있습니다.

반환 코드 Description
S_OK
지정된 개체가 만들어졌습니다.
CLASS_E_NOAGGREGATION
pUnkOuter 매개 변수가 NULL이 아니고 개체가 집계를 지원하지 않습니다.
E_NOINTERFACE
ppvObject가 가리키는 개체는 riid로 식별된 인터페이스를 지원하지 않습니다.

설명

COM 서버의 CreateInstance 구현은 서버의 DCOM 확인자에서 속한 아파트에 포함된 개체에 대한 참조를 반환해야 합니다. 원격 아파트에 포함된 개체에 대한 참조를 반환해서는 안 됩니다.

IClassFactory 인터페이스는 항상 클래스 개체에 있습니다. CreateInstance 메서드는 지정된 CLSID로 식별된 클래스의 초기화되지 않은 개체를 만듭니다. 이러한 방식으로 개체를 만들 때 CLSID는 CoRegisterClassObject 함수를 사용하여 시스템 레지스트리에 등록되어야 합니다.

pUnkOuter 매개 변수는 개체가 집계의 일부로 생성되고 있는지 여부를 나타냅니다. 집계를 지원하기 위해 개체 정의는 필요하지 않습니다. 이를 지원하기 위해 특별히 설계되고 구현되어야 합니다.

riid 매개 변수는 새 개체와 통신할 인터페이스의 IID(인터페이스 식별자)를 지정합니다. pUnkOuterNULL이 아닌 경우(집계를 나타낸) riid 매개 변수의 값은 IID_IUnknown 합니다. 개체가 집계의 일부가 아닌 경우 riid는 개체를 초기화할 인터페이스를 지정하는 경우가 많습니다.

OLE 포함의 경우 초기화 인터페이스는 IPersistStorage이지만 다른 상황에서는 다른 인터페이스가 사용됩니다. 개체를 초기화하려면 초기화 인터페이스에서 적절한 메서드에 대한 후속 호출이 있어야 합니다. 일반적인 초기화 함수에는 IPersistStorage::InitNew (새 포함 가능 구성 요소의 경우), IPersistStorage::Load (다시 로드된 포함 가능 구성 요소의 경우), IPersistStream::Load(스트림 개체에 저장된 개체의 경우) 또는 IPersistFile::Load (파일에 저장된 개체의 경우)가 포함됩니다.

일반적으로 애플리케이션이 하나의 개체 클래스만 지원하고 클래스 개체가 단일 용도로 등록된 경우 하나의 개체만 만들 수 있습니다. 애플리케이션은 다른 개체를 만들지 않아야 하며, 이렇게 하려면 요청이 IClassFactory::CreateInstance에서 오류를 반환해야 합니다. 단일 용도로 등록된 클래스 개체가 있는 여러 클래스를 지원하는 애플리케이션도 마찬가지입니다. 한 클래스에 대해 CreateInstance 를 호출한 다음 오류를 반환해야 하는 클래스에 대해 CreateInstance 를 호출합니다.

오류를 반환하지 않도록 하려면 단일 사용 클래스 개체가 있는 여러 클래스를 지원하는 애플리케이션은 두 번째 인스턴스화 요청이 수신될 때 CoRevokeClassObject 를 호출하여 첫 번째 클래스의 등록된 클래스 개체를 취소할 수 있습니다. 예를 들어 A와 B라는 두 개의 클래스가 있다고 가정합니다. 클래스 A에 대해 CreateInstance 가 호출되면 B에 대한 클래스 개체를 해지합니다. B가 만들어지면 A에 대한 클래스 개체를 해지합니다. 이 솔루션은 클래스 개체 중 하나가 이미 해지되었을 수 있으며 두 번 해지할 수 없으므로 종료를 복잡하게 만듭니다.

요구 사항

   
지원되는 최소 클라이언트 Windows 2000 Professional [데스크톱 앱 | UWP 앱]
지원되는 최소 서버 Windows 2000 Server [데스크톱 앱 | UWP 앱]
대상 플랫폼 Windows
헤더 unknwn.h

추가 정보

CoCreateInstance

CoGetClassObject

CoRegisterClassObject

CoRevokeClassObject

IClassFactory