AtlMarshalPtrInProc

创建新的流对象,编写代理的CLSID对流的,并通过编写必要的数据具有指定接口指针初始化代理到流中。

重要

此功能无法在 Windows 运行时执行的应用程序。

HRESULT AtlMarshalPtrInProc(
IUnknown* pUnk,
const IID& iid,
IStream** ppStream 
);

参数

  • 拒绝
    [out]一个指向要封送的接口的指针。

  • iid
    [in]封送的接口的GUID。

  • ppStream
    [out]一个指向 IStream 接口的指针在的位置使用的新流对象。

返回值

标准HRESULT值。

备注

MSHLFLAGS_TABLESTRONG 标志设置,使指针可以被封送到多个流。 指针也可以unmarshaled多次。

如果已失败,释放流指针。

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(&center);

      //release the stream if no other thread requires it 
      //to unmarshal the IMyCircle interface pointer
      hr = AtlFreeMarshalStream(g_pStm);

      CoUninitialize();
   }

   return hr;
}

要求

Header: atlbase.h

请参见

参考

AtlUnmarshalPtr

AtlFreeMarshalStream

MSHLFLAGS

其他资源

封送处理全局函数