Compartir a través de


Método IClassFactory::CreateInstance (unknwn.h)

Crea un objeto sin inicializar.

Sintaxis

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

Parámetros

[in] pUnkOuter

Si el objeto se crea como parte de un agregado, especifique un puntero a la interfaz IUnknown de control del agregado. De lo contrario, este parámetro debe ser NULL.

[in] riid

Referencia al identificador de la interfaz que se va a usar para comunicarse con el objeto recién creado. Si pUnkOuter es NULL, este parámetro suele ser el IID de la interfaz de inicialización; Si pUnkOuter no es NULL, riid debe ser IID_IUnknown.

[out] ppvObject

Dirección de la variable de puntero que recibe el puntero de interfaz solicitado en riid. Tras la devolución correcta, *ppvObject contiene el puntero de interfaz solicitado. Si el objeto no admite la interfaz especificada en riid, la implementación debe establecer *ppvObject en NULL.

Valor devuelto

Este método puede devolver los valores devueltos estándar E_INVALIDARG, E_OUTOFMEMORY y E_UNEXPECTED, así como los valores siguientes.

Código devuelto Descripción
S_OK
Se creó el objeto especificado.
CLASS_E_NOAGGREGATION
El parámetro pUnkOuter no era NULL y el objeto no admite la agregación.
E_NOINTERFACE
El objeto al que ppvObject apunta no admite la interfaz identificada por riid.

Comentarios

La implementación de un servidor COM de CreateInstance debe devolver una referencia a un objeto contenido en un apartamento que pertenezca a la resolución DCOM del servidor. No debe devolver una referencia a un objeto contenido en un apartamento remoto.

La interfaz IClassFactory siempre está en un objeto de clase. El método CreateInstance crea un objeto no inicializado de la clase identificada con el CLSID especificado. Cuando se crea un objeto de esta manera, el CLSID debe registrarse en el registro del sistema con la función CoRegisterClassObject .

El parámetro pUnkOuter indica si el objeto se está creando como parte de un agregado. Las definiciones de objeto no son necesarias para admitir la agregación; deben diseñarse e implementarse específicamente para admitirla.

El parámetro riid especifica el IID (identificador de interfaz) de la interfaz a través de la cual se comunicará con el nuevo objeto. Si pUnkOuter no es NULL (lo que indica la agregación), el valor del parámetro riid debe ser IID_IUnknown. Si el objeto no forma parte de un agregado, riid suele especificar la interfaz a través de la cual se inicializará el objeto.

En el caso de las inserciones OLE, la interfaz de inicialización es IPersistStorage, pero en otras situaciones, se usan otras interfaces. Para inicializar el objeto, debe haber una llamada posterior a un método adecuado en la interfaz de inicialización. Entre las funciones de inicialización comunes se incluyen IPersistStorage::InitNew (para componentes nuevos e incrustables en blanco), IPersistStorage::Load (para componentes insertados recargados), IPersistStream::Load, (para objetos almacenados en un objeto de secuencia) o IPersistFile::Load (para objetos almacenados en un archivo).

En general, si una aplicación solo admite una clase de objetos y el objeto de clase se registra para un solo uso, solo se puede crear un objeto. La aplicación no debe crear otros objetos y una solicitud para hacerlo debe devolver un error de IClassFactory::CreateInstance. Lo mismo ocurre con las aplicaciones que admiten varias clases, cada una con un objeto de clase registrado para uso único; una llamada a CreateInstance para una clase seguida de una llamada a CreateInstance para cualquiera de las clases que deben devolver un error.

Para evitar devolver un error, las aplicaciones que admiten varias clases con objetos de clase de uso único pueden revocar el objeto de clase registrado de la primera clase llamando a CoRevokeClassObject cuando se recibe una solicitud para crear una instancia de un segundo. Por ejemplo, supongamos que hay dos clases, A y B. Cuando se llama a CreateInstance para la clase A, revoque el objeto de clase para B. Cuando se crea B, revoque el objeto de clase para A. Esta solución complica el apagado porque es posible que uno de los objetos de clase ya se haya revocado (y no se puede revocar dos veces).

Requisitos

   
Cliente mínimo compatible Windows 2000 Professional [aplicaciones de escritorio | Aplicaciones para UWP]
Servidor mínimo compatible Windows 2000 Server [aplicaciones de escritorio | Aplicaciones para UWP]
Plataforma de destino Windows
Encabezado unknwn.h

Consulte también

Cocreateinstance

CoGetClassObject

CoRegisterClassObject

CoRevokeClassObject

IClassFactory