IPersistStorage::InitNew 方法 (objidl.h)

初始化新的存储对象。

语法

HRESULT InitNew(
  [in] IStorage *pStg
);

参数

[in] pStg

指向要初始化的新存储对象的 IStorage 指针。 容器在其存储对象中创建嵌套存储对象 (请参阅 IStorage::CreateStorage) 。 然后,容器调用 WriteClassStg 函数,以使用 CLSID) 对象类标识符 (初始化新的存储对象。

返回值

此方法可以返回以下值。

返回代码 说明
S_OK
该方法已成功完成。
CO_E_ALREADYINITIALIZED
对象已由先前对 IPersistStorage::Load 方法或 IPersistStorage::InitNew 方法的调用初始化。
E_OUTOFMEMORY
由于内存不足,存储对象未初始化。
E_FAIL
由于内存不足以外的某种原因,未初始化存储对象。

注解

容器应用程序可以在需要初始化新对象(例如,使用 InsertObject 命令)时调用此方法。

支持 IPersistStorage 接口的对象在运行时必须随时有权访问有效的存储对象。 这包括在创建对象之后、使对象持久化之前的时间。 在此期间,对象的容器必须通过调用 IPersistStorage::InitNew 为对象提供指向存储的有效 IStorage 指针。 根据容器的状态,可能需要为此创建一个临时文件。

如果对象想要保留 IStorage 实例,则必须调用 AddRef 以递增其引用计数。

调用 IPersistStorage::InitNew 后,对象处于已加载或正在运行状态。 例如,如果对象类具有进程内服务器,则对象将处于运行状态。 但是,如果对象使用默认处理程序,则容器对 InitNew 的调用仅调用不运行对象的处理程序实现。 稍后,如果容器运行 对象,处理程序会为对象调用 InitNew 方法。

调用方备注

通常调用执行以下操作的 OleCreate 帮助程序函数,而不是直接调用 IPersistStorage::InitNew
  1. 调用 CoCreateInstance 函数以创建对象类的实例。
  2. 查询 IPersistStorage 接口的新实例。
  3. 调用 InitNew 方法以初始化 对象。
容器应用程序应缓存指向 对象的 IPersistStorage 指针,以便在以后对对象执行的操作中使用。

实施者说明

IPersistStorage::InitNew 的实现应执行以下步骤将对象初始化为其默认状态:
  1. 预先打开并缓存指向对象需要将自身保存到此存储的任何流或存储的指针。
  2. 调用 AddRef 并缓存传入的存储指针。
  3. 调用 WriteFmtUserTypeStg 函数,将对象的本机剪贴板格式和用户类型字符串写入存储对象。
  4. 设置对象的脏标志。
前两个步骤对于确保对象可以在内存不足的情况下保存自身尤其重要。 预先打开并按住指向流和存储接口的指针,可确保此存储的保存操作不会因内存不足而失败。

如果此方法的实现在初始化后收到对 IPersistStorage::InitNew 方法或 IPersistStorage::Load 方法的调用,则应返回CO_E_ALREADYINITIALIZED错误代码。

要求

要求
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
目标平台 Windows
标头 objidl.h

另请参阅

IPersistStorage