ATL in Builder
От: Ligen Украина http://zone-of-ambiguity.blogspot.com/
Дата: 30.08.04 14:30
Оценка:
Привет, all! Интересный вопрос: как посылать события COM из отдельного потока используя ATL на BCB?
Вообще-то тема 3-х топиков сразу получается , все будет ясно на примере
Пример следующий: создаем Application на BCB, создаем там COM сервер в EXE + добавляем в мастере или руками поддержку Event'ов. Получается следующий код:
// КОД 1
STDMETHODIMP TTestImpl::start(long lValue)
{
    pImpl->Fire_onStart(lValue);  
    return S_OK;
}

Набрасываем клиент, по быстренькому в Excel
// КОД 2
Dim WithEvents obj As Test
Sub obj_onStart(ByVal s As Long)
    Call MsgBox("Yes!")
End Sub

Sub ss()
    Set obj = CreateObject("tstLib.Test")
    Call obj.Start(4)
    Set obj = Nothing
End Sub

Все чудесно работает, есс-но, но если мы изменяем Код 2 на
DWORD WINAPI thr(LPVOID pObject)
{
   TTestImpl * pImpl=reinterpret_cast<TTestImpl * >(pObject);
   pImpl->Fire_onStart(11); // неважно, влом передавать еще один параметр
   return 0;
}
         
STDMETHODIMP TTestImpl::start(long str)
{
   HANDLE hThread=CreateThread(NULL,0,thr,this,0,0);
   WaitForSingleObject(hThread,INFINITE); // просто для примера
   CloseHandle(hThread);
   return S_OK;
}

события не вызываются! из-за чего? просветите, плз, как этого достичь...
Viva el Junta Militar! Viva el Presidente!
Re: ATL in Builder
От: Никулин Леонид Россия  
Дата: 31.08.04 10:31
Оценка:
Здравствуйте, Ligen, Вы писали:


L>STDMETHODIMP TTestImpl::start(long str)

L>{
L> HANDLE hThread=CreateThread(NULL,0,thr,this,0,0);
L> WaitForSingleObject(hThread,INFINITE); // просто для примера
L> CloseHandle(hThread);
L> return S_OK;
L>}
L>[/code]
L>события не вызываются! из-за чего? просветите, плз, как этого достичь...

Кажется проблема в апартаментах...
посмотри в поиске ... такая тема не однократно обсуждалась
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.