CoGetStandardMarshal 函数 (combaseapi.h)

根据调用方,在客户端进程或服务器进程中创建默认或标准封送处理对象,并返回指向该对象的 IMarshal 实现的指针。

语法

HRESULT CoGetStandardMarshal(
  [in]           REFIID    riid,
  [in]           LPUNKNOWN pUnk,
  [in]           DWORD     dwDestContext,
  [in, optional] LPVOID    pvDestContext,
  [in]           DWORD     mshlflags,
  [out]          LPMARSHAL *ppMarshal
);

参数

[in] riid

对要封送其指针的接口标识符的引用。 此接口必须派生自 IUnknown 接口。

[in] pUnk

指向要封送的接口的指针。

[in] dwDestContext

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

[in, optional] pvDestContext

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

[in] mshlflags

指示是要将封送的数据传输回客户端进程, (正常情况下) 还是写入全局表,在该表中可由多个客户端检索。 值来自 MSHLFLAGS 枚举。

[out] ppMarshal

接收标准封送处理程序的接口指针的 IMarshal* 指针变量的地址。

返回值

此函数可以返回标准返回值E_FAIL、E_OUTOFMEMORY和E_UNEXPECTED,以及以下值。

返回代码 说明
S_OK
已成功返回 IMarshal 实例。
CO_E_NOTINITIALIZED
在调用此函数之前,必须在当前线程上调用 CoInitializeOleInitialize 函数。

注解

CoGetStandardMarshal 函数根据需要在客户端进程或服务器进程中创建默认或标准封送处理对象,并将该对象的 IMarshal 指针返回到调用方。 如果实现 IMarshal,则你可能希望实现调用 CoGetStandardMarshal 作为一种委派给 COM 的默认实现的方式,任何你不完全了解或想要处理的目标上下文。 否则,可以忽略此函数,COM 在其内部封送处理过程中调用该函数。

当客户端进程中的 COM 库收到封送接口指针时,它会查找用于创建代理以取消封送数据包的 CLSID。 如果数据包不包含代理的 CLSID,COM 将调用 CoGetStandardMarshal,并传递 NULLpUnk 值。 此函数在客户端进程中创建一个标准代理,并返回指向该代理的 IMarshal 实现的指针。 COM 使用此指针调用 CoUnmarshalInterface 来检索指向所请求接口的指针。

如果 OLE 服务器应用程序的 IMarshal 实现调用 CoGetStandardMarshal,则应将 (riid 的 IID) 和指向 (pUnk) (所请求的接口)的指针传递。

此函数执行以下任务:

  1. 确定 pUnk 是否为 NULL
  2. 如果 pUnkNULL,则会在客户端进程中为指定的 riid 创建标准接口代理,并返回代理的 IMarshal 指针。
  3. 如果 pUnk 不为 NULL,则检查该对象的封送处理程序是否已存在,如有必要,将创建一个新封送处理程序,并返回封送处理程序的 IMarshal 指针。

要求

要求
最低受支持的客户端 Windows 2000 专业版 [桌面应用 |UWP 应用]
最低受支持的服务器 Windows 2000 Server [桌面应用 |UWP 应用]
目标平台 Windows
标头 combaseapi.h (包括 Objbase.h)
Library Ole32.lib
DLL Ole32.dll

另请参阅

IMarshal