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(¢er);
//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.