封送全局函数
这些函数支持封送数据,并将封送数据转换为接口指针。
重要
下表中列出的函数不能在 Windows 运行时执行的应用程序中使用。
名称 | 描述 |
---|---|
AtlFreeMarshalStream | 释放封送数据和 IStream 指针。 |
AtlMarshalPtrInProc | 创建新的流对象并封送指定的接口指针。 |
AtlUnmarshalPtr | 将流的封送数据转换为接口指针。 |
要求:
标头:atlbase.h
AtlFreeMarshalStream
释放流中的封送数据,然后释放流指针。
HRESULT AtlFreeMarshalStream(IStream* pStream);
参数
pStream
[in] 指向用于封送的流的 IStream
接口的指针。
示例
请参阅 AtlMarshalPtrInProc 的示例。
AtlMarshalPtrInProc
创建新的流对象,将代理的 CLSID 写入流,并通过将初始化代理所需的数据写入流来封送指定接口指针。
HRESULT AtlMarshalPtrInProc(
IUnknown* pUnk,
const IID& iid,
IStream** ppStream);
参数
pUnk
[in] 指向要封送的接口的指针。
iid
[in] 要封送的接口的 GUID。
ppStream
[out] 指向用于封送处理的新流对象上的 IStream
接口的指针。
返回值
标准 HRESULT 值。
备注
设置 MSHLFLAGS_TABLESTRONG 标志,以便指针可以封送到多个流。 指针也可以多次取消封送处理。
如果封送处理失败,则会释放流指针。
AtlMarshalPtrInProc
只能在指向进程内对象的指针上使用。
示例
//marshaling interface from one thread to another
//IStream ptr to hold serialized presentation of interface ptr
IStream* g_pStm;
//forward declaration
DWORD WINAPI ThreadProc(LPVOID lpParameter);
HRESULT WriteInterfacePtrToStream(IMyCircle *pCirc)
{
//marshal the interface ptr to another thread
//pCirc has to be pointer to actual object & not a proxy
HRESULT hr = AtlMarshalPtrInProc(pCirc, IID_IMyCircle, &g_pStm);
//m_dwThreadID is a DWORD holding thread ID of thread being created.
CreateThread(NULL, 0, ThreadProc, NULL, 0, &m_dwThreadID);
return hr;
}
DWORD WINAPI ThreadProc(LPVOID /*lpParameter*/)
{
// CoInitializeEx is per thread, so initialize COM on this thread
// (required by AtlUnmarshalPtr)
HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
if (SUCCEEDED(hr))
{
IMyCircle* pCirc;
//unmarshal IMyCircle ptr from the stream
hr = AtlUnmarshalPtr(g_pStm, IID_IMyCircle, (IUnknown**)&pCirc);
// use IMyCircle ptr to call its methods
double center;
pCirc->get_XCenter(¢er);
//release the stream if no other thread requires it
//to unmarshal the IMyCircle interface pointer
hr = AtlFreeMarshalStream(g_pStm);
CoUninitialize();
}
return hr;
}
AtlUnmarshalPtr
将流的封送数据转换为可由客户端使用的接口指针。
HRESULT AtlUnmarshalPtr(
IStream* pStream,
const IID& iid,
IUnknown** ppUnk);
参数
pStream
[in] 指向未封送处理的流。
iid
[in] 未封送处理的接口的 GUID。
ppUnk
[out] 指向未封送处理接口的指针。
返回值
标准 HRESULT 值。
示例
请参阅 AtlMarshalPtrInProc 的示例。