Share via


Método IPersistStorage::InitNew (objidl.h)

Inicializa un nuevo objeto de almacenamiento.

Sintaxis

HRESULT InitNew(
  [in] IStorage *pStg
);

Parámetros

[in] pStg

Puntero de IStorage al nuevo objeto de almacenamiento que se va a inicializar. El contenedor crea un objeto de almacenamiento anidado en su objeto de almacenamiento (consulte IStorage::CreateStorage). A continuación, el contenedor llama a la función WriteClassStg para inicializar el nuevo objeto de almacenamiento con el identificador de clase de objeto (CLSID).

Valor devuelto

Este método puede devolver los siguientes valores.

Código devuelto Descripción
S_OK
El método se completó correctamente.
CO_E_ALREADYINITIALIZED
El objeto ya se ha inicializado mediante una llamada anterior al método IPersistStorage::Load o al método IPersistStorage::InitNew .
E_OUTOFMEMORY
El objeto de almacenamiento no se inicializó debido a una falta de memoria.
E_FAIL
El objeto de almacenamiento no se inicializó por algún motivo distinto de la falta de memoria.

Comentarios

Una aplicación contenedora puede llamar a este método cuando necesite inicializar un nuevo objeto, por ejemplo, con un comando InsertObject.

Un objeto que admita la interfaz IPersistStorage debe tener acceso a un objeto de almacenamiento válido en todo momento mientras se ejecuta. Esto incluye el tiempo justo después de crear el objeto, pero antes de que se haya hecho persistente. El contenedor del objeto debe proporcionar al objeto un puntero IStorage válido al almacenamiento durante este tiempo a través de la llamada a IPersistStorage::InitNew. Según el estado del contenedor, es posible que tenga que crearse un archivo temporal para este fin.

Si el objeto desea conservar la instancia de IStorage , debe llamar a AddRef para incrementar su recuento de referencias.

Después de la llamada a IPersistStorage::InitNew, el objeto está en estado cargado o en ejecución. Por ejemplo, si la clase de objeto tiene un servidor en proceso, el objeto estará en estado de ejecución. Sin embargo, si el objeto usa el controlador predeterminado, la llamada del contenedor a InitNew solo invoca la implementación del controlador que no ejecuta el objeto. Más adelante si el contenedor ejecuta el objeto , el controlador llama al método InitNew para el objeto .

Notas a los autores de llamadas

En lugar de llamar directamente a IPersistStorage::InitNew , normalmente se llama a la función auxiliar OleCreate que hace lo siguiente:
  1. Llama a la función CoCreateInstance para crear una instancia de la clase de objeto.
  2. Consulta la nueva instancia para la interfaz IPersistStorage .
  3. Llama al método InitNew para inicializar el objeto .
La aplicación contenedora debe almacenar en caché el puntero IPersistStorage al objeto para su uso en operaciones posteriores en el objeto .

Notas para los implementadores

Una implementación de IPersistStorage::InitNew debe inicializar el objeto en su estado predeterminado, siguiendo estos pasos:
  1. Abra previamente y almacene en caché los punteros a los flujos o almacenamientos que el objeto tendrá que guardar en este almacenamiento.
  2. Llame a AddRef y almacene en caché el puntero de almacenamiento que se pasa.
  3. Llame a la función WriteFmtUserTypeStg para escribir el formato nativo del Portapapeles y la cadena de tipo de usuario para el objeto en el objeto de almacenamiento.
  4. Establezca la marca desfasada para el objeto .
Los dos primeros pasos son especialmente importantes para asegurarse de que el objeto puede guardarse en situaciones de poca memoria. La apertura previa y la retención de punteros a las interfaces de flujo y almacenamiento garantizan que no se producirá un error en una operación de guardado en este almacenamiento debido a una memoria insuficiente.

La implementación de este método debe devolver el código de error CO_E_ALREADYINITIALIZED si recibe una llamada al método IPersistStorage::InitNew o al método IPersistStorage::Load después de que ya se haya inicializado.

Requisitos

Requisito Value
Cliente mínimo compatible Windows 2000 Professional [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows 2000 Server [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado objidl.h

Consulte también

IPersistStorage