IMarshal::GetUnmarshalClass 方法 (objidl.h)

检索未配置代码的 CLSID。

语法

HRESULT GetUnmarshalClass(
  [in]  REFIID riid,
  [in]  void   *pv,
  [in]  DWORD  dwDestContext,
  [in]  void   *pvDestContext,
  [in]  DWORD  mshlflags,
  [out] CLSID  *pCid
);

参数

[in] riid

对要封送的接口的标识符的引用。

[in] pv

指向要封送的接口的指针;如果调用方没有指向所需接口的指针,可以为 NULL

[in] dwDestContext

要取消对指定接口进行封送的目标上下文。 可能的值来自枚举 MSHCTX。 拆收处理可以发生在当前进程 (MSHCTX_INPROC) 的另一个单元中,也可以发生在与当前进程(MSHCTX_LOCAL) 相同计算机上的另一个进程中。

[in] pvDestContext

此参数是保留的,必须为 NULL

[in] mshlflags

指示要封送的数据是传输回客户端进程, (典型情况) 还是写入全局表,其中的多个客户端可以检索这些数据。 可能的值来自 MSHLFLAGS 枚举。

[out] pCid

一个指针,它接收用于在客户端进程中创建代理的 CLSID。

返回值

如果方法成功,则返回值S_OK。 否则,它将S_FALSE。

注解

在调用 CoMarshalInterface 时,由服务器进程中负责封送指向对象上接口的指针的任何代码间接调用此方法。 此封送代码通常是 COM 为多个接口之一生成的存根,这些接口可以封送指向在完全不同的对象上实现的接口的指针。 示例包括 IClassFactoryIOleItemContainer 接口。 出于讨论目的,负责封送指针的代码称为 封送存根

若要为对象创建代理,COM 需要原始对象中的两条信息:要写入封送处理流的数据量和代理的 CLSID。

封送存根通过连续调用 CoGetMarshalSizeMaxCoMarshalInterface 获取这两条信息。

给调用方的说明

封送处理存根调用对象的此方法实现,以获取用于创建代理实例的 CLSID。 客户端在收到 CLSID 后,会加载系统注册表中为其列出的 DLL。

如果要实现现有 COM 接口或使用 Microsoft 接口定义语言 (MIDL) 来定义自己的接口,则不会显式调用此方法。 在任一情况下,存根会自动进行调用。 请参阅 定义 COM 接口

如果不使用 MIDL 定义自己的接口,则存根必须直接或间接调用此方法,以获取客户端 COM 库为实现接口的对象创建代理所需的 CLSID。

如果调用方具有指向要封送的接口的指针,则为了提高效率,应使用 pv 参数传递该指针。 这样,可以使用此类指针来确定代理的适当 CLSID 的实现不必在自身上调用 QueryInterface 。 如果调用方没有指向要封送的接口的指针,它可以传递 NULL

实施者说明

COM 调用 GetUnmarshalClass 以获取用于在客户端进程中创建代理的 CLSID。 要用于代理的 CLSID 通常不是原始对象的 CLSID,而是使用专用于代理对象的 Guidgen.exe 工具) 生成的 (。

为每个对象实现此方法,这些对象为其一个或多个接口提供封送处理。 负责封送对象的代码将 CLSID 以及封送数据写入流;COM 从接收端的流中提取 CLSID 和数据。

如果代理实现只包含将整个原始对象复制到客户端进程,因此无需将调用转发到原始对象,则返回的 CLSID 与原始对象的 CLSID 相同。 当然,建议仅对预期不会更改的对象使用此策略。

如果 pv 参数为 NULL 并且实现需要接口指针,则它可以在当前对象上调用 QueryInterface 来获取它。 pv 参数的存在只是为了提高效率。

若要确保 GetUnmarshalClass 的实现在将来支持新目标上下文时继续正常工作,请将封送处理委托给实现不处理的所有 dwDestContext 值的 COM 默认实现。 若要将封送处理委托给 COM 默认实现,请调用 CoGetStandardMarshal 函数。

注意对于实现从 GetUnmarshalClass 方法返回的 CLSID 的进程内服务器,ThreadingModel 注册表值必须为“两个”。 有关详细信息,请参阅 InprocServer32
 

要求

要求
最低受支持的客户端 Windows 2000 专业版 [桌面应用 |UWP 应用]
最低受支持的服务器 Windows 2000 Server [桌面应用 |UWP 应用]
目标平台 Windows
标头 objidl.h

另请参阅

CoMarshalInterface

IMarshal