StgCreateStorageEx 函数 (coml2api.h)

StgCreateStorageEx 函数使用 IStorage 或 IPropertySetStorage 接口提供的实现创建新的存储对象。 若要打开现有文件,请改用 StgOpenStorageEx 函数。

为 Windows 2000、Windows Server 2003 和 Windows XP 编写的应用程序必须使用 StgCreateStorageEx,而不是 StgCreateDocfile 来利用增强的 Windows 2000 和 Windows XP 结构化存储功能。

语法

HRESULT StgCreateStorageEx(
  [in]  const WCHAR          *pwcsName,
  [in]  DWORD                grfMode,
  [in]  DWORD                stgfmt,
  [in]  DWORD                grfAttrs,
  [in]  STGOPTIONS           *pStgOptions,
  [in]  PSECURITY_DESCRIPTOR pSecurityDescriptor,
  [in]  REFIID               riid,
  [out] void                 **ppObjectOpen
);

参数

[in] pwcsName

指向要创建的文件路径的指针。 它未解释到文件系统。 可以是相对名称,也可以 NULL。 如果 NULL,则会分配一个具有唯一名称的临时文件。 如果非NULL,则字符串大小不得超过MAX_PATH个字符。

Windows 2000:与 CreateFile 函数不同,不能使用“\?”前缀超过MAX_PATH限制。

[in] grfMode

一个值,指定打开新存储对象时要使用的访问模式。 有关详细信息,请参阅 STGM 常量。 如果调用方指定事务处理模式以及STGM_CREATE或STGM_CONVERT,则为根存储调用提交操作时,将进行覆盖或转换。 如果未为根存储对象调用 IStorage::Commit,则文件以前的内容将还原。 无法将STGM_CREATE和STGM_CONVERT与STGM_NOSNAPSHOT标志合并,因为在事务处理模式下覆盖或转换文件时需要快照副本。

[in] stgfmt

一个指定存储文件格式的值。 有关详细信息,请参阅 STGFMT 枚举。

[in] grfAttrs

一个值,该值取决于 stgfmt 参数的值。

参数值 意义
STGFMT_DOCFILE
0 或FILE_FLAG_NO_BUFFERING。 有关详细信息,请参阅 CreateFile。 如果文件扇区大小(pStgOptions中指定的扇区大小不是基础磁盘物理扇区大小的整数倍数,此操作将失败。
stgfmt 所有其他值
必须为 0。

[in] pStgOptions

仅当 stgfmt 参数设置为STGFMT_DOCFILE时,pStgOptions 参数才有效。 如果将 stgfmt 参数设置为 STGFMT_DOCFILE,pStgOptions 指向 STGOPTIONS 结构,该结构指定存储对象的功能,例如扇区大小。 此参数可能 NULL,该参数创建默认扇区大小为 512 字节的存储对象。 如果非NULL,则必须将 ulSectorSize 成员设置为 512 或 4096。 如果设置为 4096,STGM_SIMPLE可能无法在 grfMode 参数中指定。 必须先设置 usVersion 成员,然后才能调用 StgCreateStorageEx。 有关详细信息,请参阅 STGOPTIONS。

[in] pSecurityDescriptor

允许在创建文件时设置 ACL。 如果未 NULL,则需要是指向 SECURITY_ATTRIBUTES 结构的指针。 有关如何在文件上设置 ACL 的信息,请参阅 CreateFile。

Windows Server 2003、Windows 2000 Server、Windows XP 和 Windows 2000 Professional:值必须 NULL。

[in] riid

一个值,该值指定要返回的接口指针的接口标识符(IID)。 此 IID 可能适用于 IStorage 接口或 IPropertySetStorage 接口。

[out] ppObjectOpen

指向接口指针变量的指针,该变量接收新存储对象上接口的指针;如果操作失败,则包含 NULL。

返回值

此函数还可以返回 HRESULT中包装的任何文件系统错误或系统错误。 有关详细信息,请参阅 错误处理策略 和 处理未知错误。

言论

当应用程序修改其文件时,它通常会创建原始文件的副本。 StgCreateStorageEx 函数是创建副本的一种方法。 此函数间接使用加密文件系统 (EFS) 重复 API。 使用此函数时,需要在 STGOPTIONS 结构中设置文件存储的选项。

StgCreateStorageEx 是 StgCreateDocfile 函数的超集,应该由新代码使用。 结构化存储的未来增强功能将通过 StgCreateStorageEx 函数公开。 有关支持的平台的信息,请参阅以下“要求”部分。

StgCreateStorageEx 函数使用系统提供的结构化存储实现之一创建新的存储对象。 此函数可用于获取
IStorage 复合文件实现、IPropertySetStorage 复合文件实现,或获取 IPropertySetStorage NTFS 实现。

创建新文件时,使用的存储实现取决于指定的标志以及存储该文件的驱动器的类型。 有关详细信息,请参阅 STGFMT 枚举。

StgCreateStorageEx 创建该文件(如果不存在)。 如果存在,则使用 grfMode 参数中的STGM_CREATE、STGM_CONVERT和STGM_FAILIFTHERE标志指示如何继续。 有关这些值的详细信息,请参阅 STGM 常量。 在直接模式下,在 grfMode 参数中指定STGM_READ模式无效(直接模式是通过未指定STGM_TRANSACTED标志来指示的)。 此函数不能用于打开现有文件;请改用 StgOpenStorageEx 函数。

可以使用 StgCreateStorageEx 函数访问结构化存储文档的根存储或支持属性集集的任何文件的属性集存储。 有关不同 STGFMT 值支持哪些 IID 的信息,请参阅 STGFMT 文档。

使用此函数创建文件以访问 NTFS 属性集实现时,将应用特殊的共享规则。 有关详细信息,请参阅 IPropertySetStorage-NTFS 实现。

如果在事务处理模式下(通过指定STGM_TRANSACTED)和只读模式(通过指定STGM_READ)创建复合文件,则有可能对返回的存储对象进行更改。 例如,可以调用 IStorage::CreateStream。 但是,无法通过调用 IStorage::Commit提交这些更改。 因此,此类更改将丢失。

指定STGM_SIMPLE在有限的情况下提供复合文件对象的更快实现,但经常使用的情况涉及需要具有多个流且无存储的复合文件实现的应用程序。 有关详细信息,请参阅 STGM 常量。 如果指定STGM_SIMPLE,则指定STGM_TRANSACTED无效。

简单模式不支持 IStorage上的所有方法。 具体而言,在简单模式下,支持的 IStorage 方法 CreateStream、Commit、SetClass 以及 com IUnknown 方法 QueryInterface、AddRef 和 Release。 此外,SetElementTimes 支持 NULL 名称,从而允许应用程序在根存储上设置时间。 IStorage 的所有其他方法 返回STG_E_INVALIDFUNCTION。

如果 grfMode 参数指定STGM_TRANSACTED,并且 pwcsName 参数指定的名称尚不存在文件,则立即创建该文件。 在访问控制文件系统中,调用方必须具有创建复合文件的文件系统目录的写入权限。 如果未指定STGM_TRANSACTED,并且指定了STGM_CREATE,则会在创建新文件之前销毁具有相同名称的现有文件。

还可以使用 StgCreateStorageEx 通过传递 pwcsName 参数的 NULL 值来创建临时复合文件。 但是,这些文件只是暂时性的,因为它们具有唯一的系统提供的名称,而这种名称对用户来说可能毫无意义。 调用方负责在完成临时文件时删除临时文件,除非为 grfMode 参数指定了STGM_DELETEONRELEASE。 有关这些标志的详细信息,请参阅 STGM 常量。

要求

要求 价值
最低支持的客户端 Windows 2000 Professional [桌面应用 |UWP 应用]
支持的最低服务器 Windows 2000 Server [桌面应用 |UWP 应用]
目标平台 窗户
标头 coml2api.h (包括 Objbase.h)
库 Ole32.lib
DLL Ole32.dll

另请参阅

CreateFile

STGFMT

STGM 常量

STGOPTIONS

StgCreateDocFileOnILockBytes

StgCreateDocfile

StgOpenStorageEx