IPersistStorage::InitNew
Initializes a
new object, providing a pointer to the storage to be used for the object.
HRESULT InitNew(
IStorage *pStg |
//Points
to the new storage object |
); |
|
Parameter
pStg
[in]IStorage
pointer to the new storage object to be initialized. The container creates a
nested storage object in its storage object (see IStorage::CreateStorage
Return Values
S_OK
The new
storage object was successfully initialized.
CO_E_ALREADYINITIALIZED
The object
has already been initialized by a previous call to either the IPersistStorage::Load
E_OUTOFMEMORY
The storage
object was not initialized due to a lack of memory.
E_FAIL
The storage
object was not initialized for some reason other than a lack of memory.
Remarks
A container
application can call this method when it needs to initialize a new object, for
example, with an InsertObject command.
An object
that supports the IPersistStorage
If the object
wants to retain the IStorage instance, it must call IUnknown::AddRef
to increment its reference count.
After the
call to IPersistStorage::InitNew, the object is in either the loaded or
running state. For example, if the object class has an in-process server, the
object will be in the running state. However, if the object uses the default
handler, the container s call to InitNew only invokes the handler s
implementation which does not run the object. Later if the container runs the
object, the handler calls the IPersistStorage::InitNew method for the
object.
Notes to Callers
Rather than
calling IPersistStorage::InitNew directly, you typically call the OleCreate
1. Calls the CoCreateInstance function to create an instance
of the object class
2. Queries the new instance for the IPersistStorage interface
3. Calls the IPersistStorage::InitNew
method to initialize the object
The container
application should cache the IPersistStorage pointer to the object for
use in later operations on the object.
Notes to Implementers
An
implementation of IPersistStorage::InitNew should initialize the object
to its default state, taking the following steps:
1. Pre-open and cache the pointers to any streams
or storages that the object will need to save itself to this storage.
2. Call IPersistStorage::AddRef and cache
the storage pointer that is passed in.
3. Call the WriteFmtUserTypeStg function to write the
native clipboard format and user type string for the object to the storage
object.
4. Set the dirty flag for the object.
The first two
steps are particularly important for ensuring that the object can save itself
in low memory situations. Pre-opening and holding onto pointers to the stream
and storage interfaces guarantee that a save operation to this storage will not
fail due to insufficient memory.
Your
implementation of this method should return the CO_E_ALREADYINITIALIZED error
code if it receives a call to either the IPersistStorage::InitNew method
or the IPersistStorage::Load
See Also