Поделиться через


Глобальные функции для маршалинга

Эти функции обеспечивают поддержку маршалинга и преобразования маршалинга данных в указатели интерфейса.

Важно!

Функции, перечисленные в следующей таблице, нельзя использовать в приложениях, которые выполняются в среда выполнения 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(&center);

      //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.

См. также

Функции