Freigeben über


AtlMarshalPtrInProc

Erstellt ein neues Streamobjekt, schreibt die CLSID des Proxys den Stream und marshallt den angegebenen Schnittstellenzeiger durch Schreiben der Daten, die erforderlich sind, um den Proxy in den Stream zu initialisieren.

Wichtig

Diese Funktion kann nicht in den Anwendungen verwendet werden, die in Windows-Runtime ausführen.

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

Parameter

  • pUnk
    [in] Ein Zeiger auf die Schnittstelle gemarshallt werden.

  • iid
    [in] Die GUID der Schnittstelle, die gemarshallt wird.

  • ppStream
    [out] Ein Zeiger auf die IStream-Schnittstelle auf dem neuen Streamobjekt verwendet für das Marshalling.

Rückgabewert

Ein Wert des Standards HRESULT.

Hinweise

Das MSHLFLAGS_TABLESTRONG-Flag ist festgelegt, sodass der Zeiger an mehrere Streams gemarshallt werden. Der Zeiger kann auch mehrmals das Marshalling rückgängig gemacht werden.

Wenn das Marshalling fehlschlägt, wird der Stream-Zeiger freigegeben.

AtlMarshalPtrInProc kann auf einem Zeiger zu einem prozessinternen Objekt nur verwendet werden.

Beispiel

//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;
}

Anforderungen

Header: atlbase.h

Siehe auch

Referenz

AtlUnmarshalPtr

AtlFreeMarshalStream

MSHLFLAGS

Weitere Ressourcen

Marshaling Global Functions