Funções globais de marshaling
Essas funções dão suporte a marshaling e conversão de dados de marshaling em ponteiros de interface.
Importante
As funções listadas na tabela a seguir não podem ser usadas em aplicativos que são executados no Windows Runtime.
Nome | Descrição |
---|---|
AtlFreeMarshalStream | Libera os dados de marshal e o ponteiro IStream . |
AtlMarshalPtrInProc | Cria um novo objeto de fluxo e realiza marshaling do ponteiro de interface especificado. |
AtlUnmarshalPtr | Converte dados de marshaling de um fluxo em um ponteiro de interface. |
Requisitos:
Cabeçalho: atlbase.h
AtlFreeMarshalStream
Libera os dados de marshaling no fluxo e depois libera o ponteiro de fluxo.
HRESULT AtlFreeMarshalStream(IStream* pStream);
Parâmetros
pStream
[in] Um ponteiro para a interface IStream
no fluxo usado para marshaling.
Exemplo
Confira o exemplo de AtlMarshalPtrInProc.
AtlMarshalPtrInProc
Cria um novo objeto de fluxo, grava o CLSID do proxy no fluxo e realiza o marshaling do ponteiro de interface especificado gravando os dados necessários para inicializar o proxy no fluxo.
HRESULT AtlMarshalPtrInProc(
IUnknown* pUnk,
const IID& iid,
IStream** ppStream);
Parâmetros
pUnk
[in] Um ponteiro para a interface em que o marshaling será realizado.
iid
[in] O GUID da interface em que o marshaling está sendo realizado.
ppStream
[out] Um ponteiro para a interface IStream
no novo objeto de fluxo usado para marshaling.
Valor de retorno
Um valor HRESULT padrão.
Comentários
O sinalizador MSHLFLAGS_TABLESTRONG é definido para que o ponteiro possa ter o marshaling realizado em vários fluxos. O ponteiro também passar por unmarshaling várias vezes.
Se o marshaling falhar, o ponteiro do fluxo será liberado.
AtlMarshalPtrInProc
só pode ser usado em um ponteiro para um objeto em processo.
Exemplo
//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
Converte os dados de marshaling do fluxo em um ponteiro de interface que pode ser usado pelo cliente.
HRESULT AtlUnmarshalPtr(
IStream* pStream,
const IID& iid,
IUnknown** ppUnk);
Parâmetros
pStream
[in] Um ponteiro para o fluxo que está passando por unmarshaling.
iid
[in] O GUID da interface em que o unmarshaling está sendo realizado.
ppUnk
[out] Um ponteiro para a interface que realizou unmarshaling.
Valor de retorno
Um valor HRESULT padrão.
Exemplo
Confira o exemplo de AtlMarshalPtrInProc.