Fonctions globales de marshaling
Ces fonctions prennent en charge le marshaling et la conversion de données de marshaling en pointeurs d’interface.
Important
Les fonctions répertoriées dans le tableau suivant ne peuvent pas être utilisées dans les applications qui s’exécutent dans Windows Runtime.
Nom | Description |
---|---|
AtlFreeMarshalStream | Libère les données de marshal et le IStream pointeur. |
AtlMarshalPtrInProc | Crée un objet de flux et marshale le pointeur d’interface spécifié. |
AtlUnmarshalPtr | Convertit les données de marshaling d’un flux en pointeur d’interface. |
Conditions requises :
En-tête : atlbase.h
AtlFreeMarshalStream
Libère les données de marshaling dans le flux, puis libère le pointeur de flux.
HRESULT AtlFreeMarshalStream(IStream* pStream);
Paramètres
pStream
[in] Pointeur vers l’interface IStream
sur le flux utilisé pour le marshaling.
Exemple
Consultez l’exemple d’AtlMarshalPtrInProc.
AtlMarshalPtrInProc
Crée un objet de flux, écrit le CLSID du proxy dans le flux, puis marshale le pointeur d'interface spécifié en écrivant les données nécessaires pour initialiser le proxy dans le flux.
HRESULT AtlMarshalPtrInProc(
IUnknown* pUnk,
const IID& iid,
IStream** ppStream);
Paramètres
punk
[in] Pointeur vers l’interface à marshaler.
iid
[in] GUID de l’interface marshalée.
ppStream
[out] Pointeur vers l’interface IStream
sur le nouvel objet de flux utilisé pour le marshaling.
Valeur de retour
Valeur HRESULT standard.
Notes
L’indicateur MSHLFLAGS_TABLESTRONG est défini afin que le pointeur puisse être marshalé sur plusieurs flux. Le pointeur peut également être démarshalé plusieurs fois.
Si le marshaling échoue, le pointeur de flux est libéré.
AtlMarshalPtrInProc
ne peut être utilisé que sur un pointeur vers un objet in-process.
Exemple
//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
Convertit les données de marshaling du flux en un pointeur d'interface qui peut être utilisé par le client.
HRESULT AtlUnmarshalPtr(
IStream* pStream,
const IID& iid,
IUnknown** ppUnk);
Paramètres
pStream
[in] Pointeur vers le flux non délimité.
iid
[in] GUID de l’interface non délimitée.
ppUnk
[out] Pointeur vers l’interface non délimitée.
Valeur de retour
Valeur HRESULT standard.
Exemple
Consultez l’exemple d’AtlMarshalPtrInProc.