Zařazení globálních funkcí
Tyto funkce poskytují podporu pro zařazování a převod dat zařazování na ukazatele rozhraní.
Důležité
Funkce uvedené v následující tabulce nelze použít v aplikacích, které se spouští v prostředí Windows Runtime.
Název | Popis |
---|---|
AtlFreeMarshalStream | Uvolní zařazování dat a IStream ukazatel. |
AtlMarshalPtrInProc | Vytvoří nový objekt streamu a zařadí zadaný ukazatel rozhraní. |
AtlUnmarshalPtr | Převede zařazování dat datového proudu na ukazatel rozhraní. |
Požadavky:
Hlavička: atlbase.h
AtlFreeMarshalStream
Uvolní zařazování dat ve streamu a následně uvolní ukazatel streamu.
HRESULT AtlFreeMarshalStream(IStream* pStream);
Parametry
pStream
[v] Ukazatel na IStream
rozhraní datového proudu, který se používá pro zařazování.
Příklad
Podívejte se na příklad pro AtlMarshalPtrInProc.
AtlMarshalPtrInProc
Vytvoří nový objekt streamu, zapíše do tohoto streamu identifikátor CLSID proxy a zařadí zadaný ukazatel rozhraní tím, že do streamu zapíše data potřebná k inicializaci proxy.
HRESULT AtlMarshalPtrInProc(
IUnknown* pUnk,
const IID& iid,
IStream** ppStream);
Parametry
punk
[v] Ukazatel na rozhraní, které se má zařaďte.
iid
[v] Identifikátor GUID rozhraní, které je zařazováno.
ppStream
[ven] Ukazatel na rozhraní nového objektu IStream
datového proudu, který se používá pro zařazování.
Návratová hodnota
Standardní hodnota HRESULT.
Poznámky
Příznak MSHLFLAGS_TABLESTRONG je nastavený, aby bylo možné ukazatel zařaďte do více datových proudů. Ukazatel může být také vícekrát rozsažen.
Pokud se zařazování nezdaří, uvolní se ukazatel datového proudu.
AtlMarshalPtrInProc
lze použít pouze u ukazatele na objekt v procesu.
Příklad
//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
Převede zařazovaná data streamu na ukazatel rozhraní, který může použít klient.
HRESULT AtlUnmarshalPtr(
IStream* pStream,
const IID& iid,
IUnknown** ppUnk);
Parametry
pStream
[v] Ukazatel na stream, který se nerozlišuje.
iid
[v] Identifikátor GUID rozhraní, které je nezastřeženo.
ppUnk
[ven] Ukazatel na nezastřežené rozhraní.
Návratová hodnota
Standardní hodnota HRESULT.
Příklad
Podívejte se na příklad pro AtlMarshalPtrInProc.