There is something wrong with your object. You explicitly
created it in the MTA, so a message loop should be irrelevant.
I found out this myself so just posting the solution if anyone else gets
this problem.
I simply added a message loop in main instead of the getchar():
int _tmain(int argc, _TCHAR* argv[])
{
EventReceiver er;
er.Start();
printf("started\n");
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
er.Stop();
return 0;
}
/Peter
"Peter Posselt Vergmann" <ppv_milestone@hotmail.com> wrote in message
news:uMZ6uSzCIHA.1188@TK2MSFTNGP04.phx.gbl...
Hi
I am a newbie to COM and ATL and is trying to create a console
application that can receive events from a COM service.
I have a demo GUI application which is working fine and have simply
copied all COM and event functionality to a simple console application,
but I never receive and events in the console app.
I have searched through google and have found different suggestions and
tried them all without any luck, so now my hope is that someone on this
group will have a look at the code and tell me what I do wrong. I am
using VC 2003 on a Windows XP SP2 if that matters.
Hope someone can help..
Best regards,
Peter
CComModule _Module;
class EventReceiver :
public IDispEventImpl<0, EventReceiver,
&VideoOS_SDK::DIID_ICentralEvents, &VideoOS_SDK::LIBID_VideoOS_SDK, 3, 0>
{
public:
EventReceiver(void)
{
CoInitializeEx(NULL,COINIT_MULTITHREADED);
_Module.Init(NULL, GetModuleHandle(NULL));
};
~EventReceiver(void){};
void Start()
{
m_pCentral.CreateInstance(__uuidof(VideoOS_SDK::Central));
if (m_pCentral != NULL)
{
m_pCentral->SystemInfoUpdateInterval = 1;
CComPtr<IUnknown> pUnk;
this->_LocDEQueryInterface(IID_IUnknown, (void**)&pUnk);
HRESULT hresult = AtlAdvise(m_pCentral.GetInterfacePtr(), pUnk,
__uuidof(VideoOS_SDK::ICentralEvents), &m_dwCentralEventSinkCP);
_variant_t connected = m_pCentral->Connect();
}
};
void Stop()
{
m_pCentral->Close();
HRESULT hresult = AtlUnadvise(m_pCentral.GetInterfacePtr(),
__uuidof(VideoOS_SDK::ICentralEvents), m_dwCentralEventSinkCP);
};
public:
BEGIN_SINK_MAP(EventReceiver)
SINK_ENTRY_EX(0, VideoOS_SDK::DIID_ICentralEvents, 1,
ConnectionStateChanged)
SINK_ENTRY_EX(0, VideoOS_SDK::DIID_ICentralEvents, 2,
SystemStatusUpdated)
SINK_ENTRY_EX(0, VideoOS_SDK::DIID_ICentralEvents, 3, DeviceEvent)
END_SINK_MAP()
protected:
void _stdcall ConnectionStateChanged(VARIANT sender, LPDISPATCH
e){printf("ConnectionStateChanged\n");};
void _stdcall SystemStatusUpdated(VARIANT sender, LPDISPATCH
e){printf("SystemStatusUpdated\n");};
void _stdcall DeviceEvent(VARIANT sender, LPDISPATCH
e){printf("DeviceEvent\n");};
private:
VideoOS_SDK::ICentralPtr m_pCentral;
DWORD m_dwCentralEventSinkCP;
};
int _tmain(int argc, _TCHAR* argv[])
{
EventReceiver er;
er.Start();
printf("started\n");
getchar();
er.Stop();
return 0;
}