Глобальные функции для маршалинга
Эти функции обеспечивают поддержку маршалинга и преобразования маршалинга данных в указатели интерфейса.
Внимание
Функции, перечисленные в следующей таблице, нельзя использовать в приложениях, которые выполняются в среда выполнения Windows.
Имя | Описание |
---|---|
AtlFreeMarshalStream | Освобождает маршалные данные и IStream указатель. |
AtlMarshalPtrInProc | Создает новый объект потока и маршалирует указанный указатель интерфейса. |
AtlUnmarshalPtr | Преобразует маршалинг данных потока в указатель интерфейса. |
Требования:
Заголовок: atlbase.h
AtlFreeMarshalStream
Освобождает данные маршалинга в потоке, затем освобождает указатель потока.
HRESULT AtlFreeMarshalStream(IStream* pStream);
Параметры
pStream
[in] Указатель на IStream
интерфейс в потоке, используемый для маршалинга.
Пример
См. пример atlMarshalPtrInProc.
AtlMarshalPtrInProc
Создает новый объект потока, записывает в поток CLSID прокси-сервера и маршалирует заданный указатель интерфейса, записывая в поток данные, необходимые для инициализации прокси-сервера.
HRESULT AtlMarshalPtrInProc(
IUnknown* pUnk,
const IID& iid,
IStream** ppStream);
Параметры
панк
[in] Указатель на интерфейс для маршалирования.
iid
[in] GUID маршалируемого интерфейса.
ppStream
[out] Указатель на IStream
интерфейс на новый объект потока, используемый для маршалинга.
Возвращаемое значение
Стандартное значение HRESULT.
Замечания
Флаг MSHLFLAGS_TABLESTRONG задан, чтобы указатель можно маршалировать в несколько потоков. Указатель также может быть немаршален несколько раз.
Если маршалинг завершается ошибкой, указатель потока освобождается.
AtlMarshalPtrInProc
можно использовать только в указателе на объект в процессе.
Пример
//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
Преобразует данные маршалинга потока в указатель интерфейса, который может использоваться клиентом.
HRESULT AtlUnmarshalPtr(
IStream* pStream,
const IID& iid,
IUnknown** ppUnk);
Параметры
pStream
[in] Указатель на поток, который не замаршался.
iid
[in] ИДЕНТИФИКАТОР GUID интерфейса, который не замахивается.
ppUnk
[out] Указатель на немаршализованный интерфейс.
Возвращаемое значение
Стандартное значение HRESULT.
Пример
См. пример atlMarshalPtrInProc.