Funkcje globalne kierowania
Te funkcje zapewniają obsługę marshalingu i konwertowania danych marshalingowych na wskaźniki interfejsu.
Ważne
Funkcje wymienione w poniższej tabeli nie mogą być używane w aplikacjach wykonywanych w środowisko wykonawcze systemu Windows.
Nazwa/nazwisko | opis |
---|---|
AtlFreeMarshalStream | Zwalnia dane marshala i IStream wskaźnik. |
AtlMarshalPtrInProc | Tworzy nowy obiekt strumienia i marshaluje określony wskaźnik interfejsu. |
AtlUnmarshalPtr | Konwertuje dane marshalingu strumienia na wskaźnik interfejsu. |
Wymagania:
Nagłówek: atlbase.h
AtlFreeMarshalStream
Zwalnia dane organizatora w strumieniu, a następnie zwalnia wskaźnik strumienia.
HRESULT AtlFreeMarshalStream(IStream* pStream);
Parametry
pStream
[in] Wskaźnik do interfejsu IStream
w strumieniu używanym do marshalingu.
Przykład
Zobacz przykład atlMarshalPtrInProc.
AtlMarshalPtrInProc
Tworzy nowy obiekt strumienia, zapisuje identyfikator CLSID serwera proxy do strumienia i organizuje określony wskaźnik interfejsu, pisząc dane potrzebne do zainicjowania serwera proxy do strumienia.
HRESULT AtlMarshalPtrInProc(
IUnknown* pUnk,
const IID& iid,
IStream** ppStream);
Parametry
Punk
[in] Wskaźnik do interfejsu do marshalingu.
identyfikator iid
[in] Identyfikator GUID interfejsu, który jest marshalowany.
ppStream
[out] Wskaźnik do interfejsu w IStream
nowym obiekcie strumienia używanym do marshalingu.
Wartość zwracana
Standardowa wartość HRESULT.
Uwagi
Flaga MSHLFLAGS_TABLESTRONG jest ustawiona, aby wskaźnik mógł być przesłonięty do wielu strumieni. Wskaźnik może być również wielokrotnie unmarshaled.
Jeśli przeprowadzanie marshalingu zakończy się niepowodzeniem, wskaźnik strumienia zostanie zwolniony.
AtlMarshalPtrInProc
można używać tylko w wskaźniku do obiektu w procesie.
Przykład
//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
Konwertuje dane dotyczące organizowania strumienia na wskaźnik interfejsu, którego może używać klient.
HRESULT AtlUnmarshalPtr(
IStream* pStream,
const IID& iid,
IUnknown** ppUnk);
Parametry
pStream
[in] Wskaźnik do strumienia jest unmarshaled.
identyfikator iid
[in] Identyfikator GUID interfejsu jest unmarshaled.
ppUnk
[out] Wskaźnik do niezamężnego interfejsu.
Wartość zwracana
Standardowa wartość HRESULT.
Przykład
Zobacz przykład atlMarshalPtrInProc.