Не работает CoMarshalInterThreadInterfaceInStream/CoGetInter
От: SergT  
Дата: 11.11.02 14:38
Оценка:
Уважаемые, дамы и господа!
Помогите, пожалуйста, не могу никак разобраться с маршалингом интерфейса во вторичный поток ActiveX компонента. Суть в следующем:
Создаю c помощью ATL ActiveX: Full control, apartment, dual interface, поддержка IConnectionPoint. У компонента, кроме прочих, есть метод Open() и есть событие OnOpen(). Метод Open() запускает вторичный поток, в котором происходит какая-то работа, и сам завершается. Так вот, после того, как вторичный поток произведет все необходимые действия, компонент должен генерировать событие OnOpen(), или OnError(). Кроме того, есть интерфейс IFire, который наследуется моим коклассом, и в котором есть метод FireOnOpen(). Этот метод просто вызывает сгенерированный визардом Fire_OnOpen:

STDMETHOD(FireOnOpen)(BYTE bIsTerminal)
{
    this->Fire_OnOpen(bIsTerminal);
    return S_OK;
}


Делаю я это так:

IStream *g_pStream;

UINT __stdcall ThreadOpen(void* pParam)
{
    HRESULT res = 0;
    IFire* pFire = NULL;
    res = CoInitialize(NULL);
    res = CoGetInterfaceAndReleaseStream(g_pStream, IID_IFire, (void**)&pFire);
    g_pStream = NULL;

// полезная работа...

    pFire->FireOnOpen(1);
    CoUninitialize();
    return 0;
}

STDMETHODIMP MyClass::Open()
{
    UINT ui;
    HRESULT res = 0;
    IFire* pFire = NULL;
    res = this->QueryInterface(IID_IFire, (void**)&pFire);
    res = CoMarshalInterThreadInterfaceInStream(IID_IFire, pFire, &g_pStream);
    _beginthreadex(NULL, 0, ThreadOpen, NULL, 0, &ui);
    return S_OK;
}


Так вот, метод Open() выполняется без проблем, инициализируется g_pStream, создается поток, а вот внутри потока все валится на ф-ии CoGetInterfaceAndReleaseStream() с кодом 0x80004005
Пожалуйста, подскажите, что я не так делаю?
Заранее благодарен.
SergT.

P.S. Отлаживаю в ActiveX Control Test Container.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.