getClassFile 函数 (objbase.h)

返回与指定文件名关联的 CLSID。

语法

HRESULT GetClassFile(
  [in]  LPCOLESTR szFilename,
  [out] CLSID     *pclsid
);

参数

[in] szFilename

指向要为其请求关联 CLSID 的文件名的指针。

[out] pclsid

指向返回时写入关联 CLSID 的位置的指针。

返回值

此函数可以返回任何文件系统错误以及以下值。

返回代码 说明
S_OK
已成功检索 CLSID。
MK_E_CANTOPENFILE
无法打开指定的文件名。
MK_E_INVALIDEXTENSION
注册表中的指定扩展无效。

注解

给定文件名后, GetClassFile 会查找与该文件关联的 CLSID。 它的使用示例包括 OleCreateFromFile 函数,该函数传递文件名并需要关联的 CLSID;在 IMoniker::BindToObject 的 OLE 实现中,当激活基于文件的文档的链接时,调用 GetClassFile 来查找可以打开该文件的对象应用程序。

GetClassFile 使用以下策略来确定适当的 CLSID:

  1. 如果文件包含存储对象(由调用 StgIsStorageFile 函数确定), GetClassFile 将返回使用 IStorage::SetClass 方法编写的 CLSID。
  2. 如果文件不是存储对象, GetClassFile 会尝试将文件中的各个位与注册表中的模式匹配。 注册表中的模式可以包含表单的一系列条目:

    entry = offset, cb, mask, value

    偏移项的值是文件开头或末尾的偏移量,cb 项的长度(以字节为单位)。 这两个值表示文件中的特定字节范围。 (从文件) 末尾解释偏移项的负值。 掩码值是一个位掩码,用于使用偏移量和 cb 指定的字节范围执行逻辑 AND 操作。 逻辑 AND 操作的结果与 值 项进行比较。 如果省略 掩码 ,则假定为全部掩码。

    注册表中的每个模式都按数据库中的模式顺序与文件进行比较。 每个值项匹配 AND 操作结果的第一种模式决定了文件的 CLSID。 例如,注册表的以下条目中包含的模式要求前四个字节为 AB CD 12 34,最后四个字节为 FE FE FE FE:

    HKEY_CLASSES_ROOT 
       FileType
          {12345678-0000-0001-C000-000000000095}
             0 = 0, 4, FFFFFFFF, ABCD1234 
             1 = -4, 4, , FEFEFEFE 

    如果文件包含此类模式,则 CLSID {12345678-0000-0001-C000-000-00000000095} 将与此文件相关联。

  3. 如果上述策略失败, GetClassFile 在注册表中搜索与文件名的 .ext 部分对应的 文件扩展名 键。 如果数据库条目包含有效的 CLSID, 则 GetClassFile 将返回该 CLSID。
  4. 如果所有策略都失败,函数将返回MK_E_INVALIDEXTENSION。

要求

要求 值
最低受支持的客户端 Windows 2000 专业版 [桌面应用 |UWP 应用]
最低受支持的服务器 Windows 2000 Server [桌面应用 |UWP 应用]
目标平台 Windows
标头 objbase.h
Library Ole32.lib
DLL Ole32.dll
API 集 Windows 10版本 10.0.15063 中引入的 ext-ms-win-com-ole32-l1-1-5 ()

另请参阅

WriteClassStg