Globale Funktionen zur Verarbeitung von Marshalling

Diese Funktionen bieten Unterstützung für das Marshalling und Konvertieren von Marshaling-Daten in Schnittstellenzeiger.

Wichtig

Die in der folgenden Tabelle aufgeführten Funktionen können nicht in Anwendungen verwendet werden, die in der Windows-Runtime ausgeführt werden.

Name Beschreibung
AtlFreeMarshalStream Gibt die Marshalldaten und den IStream Zeiger frei.
AtlMarshalPtrInProc Erstellt ein neues Streamobjekt und marshallt den angegebenen Schnittstellenzeiger.
AtlUnmarshalPtr Konvertiert die Marshallingdaten eines Datenstroms in einen Schnittstellenzeiger.

Anforderungen:

Kopfzeile: atlbase.h

AtlFreeMarshalStream

Gibt die Marschalldaten im Stream und anschließend den Streamzeiger frei.

HRESULT AtlFreeMarshalStream(IStream* pStream);

Parameter

pStream
[in] Ein Zeiger auf die IStream Schnittstelle im Datenstrom, der zum Marshallen verwendet wird.

Beispiel

Sehen Sie sich das Beispiel für AtlMarshalPtrInProc an.

AtlMarshalPtrInProc

Erstellt ein neues Streamobjekt, schreibt die CLSID des Proxys in den Stream und marshallt den angegebenen Schnittstellenzeiger durch Schreiben der für die Initialisierung des Proxys erforderlichen Daten in den Stream.

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

Parameter

Punk
[in] Ein Zeiger auf die Schnittstelle, die gemarstet werden soll.

Iid
[in] Die GUID der Schnittstelle, die gemarstet wird.

Ppstream
[out] Ein Zeiger auf die IStream Schnittstelle für das neue Streamobjekt, das zum Marshallen verwendet wird.

Rückgabewert

Ein HRESULT-Standardwert.

Hinweise

Das MSHLFLAGS_TABLESTRONG Flag wird festgelegt, sodass der Zeiger auf mehrere Datenströme gemarstet werden kann. Der Zeiger kann auch mehrmals entmarstet werden.

Wenn das Marshalling fehlschlägt, wird der Datenstromzeiger losgelassen.

AtlMarshalPtrInProc kann nur für einen Zeiger auf ein In-Process-Objekt 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;
}

AtlUnmarshalPtr

Konvertiert die Marshallingdaten des Streams in einen Schnittstellenzeiger, der vom Client verwendet werden kann.

HRESULT AtlUnmarshalPtr(
    IStream* pStream,
    const IID& iid,
    IUnknown** ppUnk);

Parameter

pStream
[in] Ein Zeiger auf den Datenstrom, der nichtmarsiert wird.

Iid
[in] Die GUID der Schnittstelle, die nichtmarshaliert wird.

ppUnk
[out] Ein Zeiger auf die nichtmarshalierte Schnittstelle.

Rückgabewert

Ein HRESULT-Standardwert.

Beispiel

Sehen Sie sich das Beispiel für AtlMarshalPtrInProc an.

Siehe auch

Funktionen