Страница 1 из 1

DCOM - вызов метода клиента через косвенно-вызыв. интерфейс

Добавлено: 29 июн 2005, 16:16
Владимир
Привет всем. Помогите решить проблему: клиент(dll) реализует интерфей ILink с методом SendText(). Сервер(exe) в определенные моменты времени вызывает это метод. Проблема в том что вызов метода то работает, то не работает.

Код: Выделить всё

CClient::SendText()
{
   MessageBox(NULL,"Message",NULL,MB_OK);
}

CServer::Init(IUnknown* pClient)
{
 ...
  pClient->QueryInterface(IID_ILink,(void**)&m_Link))
 ...
  hCommWatchThread = CreateThread(                                                  (LPSECURITY_ATTRIBUTES) NULL,
0,
(LPTHREAD_START_ROUTINE) CommWatchProc,
(LPVOID) this,
0, &dwThreadID )));

 //m_Link указатель ILink*
 m_Link->SendText();//работает окно всплывает
  ...
}

DWORD WINAPI CommWatchProc(LPVOID lpData )
{
  ...
  CServer *pSrv = (CServer*)lpData;
  ...
  WaitCommEvent(pSrv->m_hComDev, &dwEvtMask, NULL);
 
  pSrv->m_Link->SendText();//не работает окно не всплывает
  ...
}

Добавлено: 29 июн 2005, 19:50
Eugie
Есть подозрение, что ты не вызывешь CoInitializeEx()/CoUninitialize() в начале/конце потоковой процедуры CommWatchProc. И еще: какую модель апартментов используешь? Если STA, потоки будут в разных апартментах и при передаче указателей на интерфейс нужно применять маршалинг. Попробуй изменить модель на MTA (если клиентский объект не предполагает модификацию данных, это безопасно и без синхронизации).

Вообще, на эту тему советую посмотреть серию статей на RSDN (см. COM/DCOM/COM+/Исследования)

Добавлено: 29 июн 2005, 21:06
Владимир
Действительно инициализировал сервер с моделью MTA (CoInitializeEx(NULL, COINIT_MULTITHREADED) ;) и все заработало ;-) . А CoInitializeEx()/CoUninitialize() вызывается в начале и конце _tWinMain(...). Огромное спасибо, выручил, а то я чуть башку себе "не свернул": при вызове метода ничего не происходит, но и прога не ругается