#include "StdAfx.h" #include "TraceService.h" // #include "EventService.h" #include "AsynchronismEngine.h" ////////////////////////////////////////////////////////////////////////// //宏定义 #define WM_ASYN_REQUEST WM_USER+10 //异步请求 ////////////////////////////////////////////////////////////////////////// BEGIN_MESSAGE_MAP(CControlWnd, CWnd) ON_MESSAGE(WM_ASYN_REQUEST, OnAsynRequest) END_MESSAGE_MAP() ////////////////////////////////////////////////////////////////////////// //构造函数 CControlWnd::CControlWnd() { m_pAsynchronismEngine = NULL; } //析构函数 CControlWnd::~CControlWnd() { } //请求消息 HRESULT CControlWnd::OnAsynRequest(WPARAM wParam, LPARAM lParam) { //效验变量 ASSERT(m_pAsynchronismEngine != NULL); //获取参数 WORD wRequestID = (WORD)wParam; IAsynchronismEngineSink * pIAsynchronismEngineSink = (IAsynchronismEngineSink *)lParam; //请求处理 ASSERT(pIAsynchronismEngineSink != NULL); m_pAsynchronismEngine->OnAsynchronismRequest(wRequestID, pIAsynchronismEngineSink); return 0; } ////////////////////////////////////////////////////////////////////////// //构造函数 CMessageThread::CMessageThread() { m_pAsynchronismEngine = NULL; } //析构函数 CMessageThread::~CMessageThread() { } //运行函数 bool CMessageThread::OnEventThreadRun() { MSG Message; if (GetMessage(&Message, NULL, 0, 0)) { TranslateMessage(&Message); DispatchMessage(&Message); return true; } return false; } //停止线程 bool CMessageThread::StopThread(DWORD dwWaitSeconds) { PostThreadMessage(WM_QUIT, 0, 0); return __super::ConcludeThread(dwWaitSeconds); } //中止线程 bool CMessageThread::TerminateThread(DWORD dwExitCode) { PostThreadMessage(WM_QUIT, 0, 0); return __super::ConcludeThread(INFINITE); } //开始事件 bool CMessageThread::OnThreadStratEvent() { ASSERT(m_pAsynchronismEngine != NULL); return m_pAsynchronismEngine->OnMessageThreadStart(); } //停止事件 bool CMessageThread::OnThreadStopEvent() { ASSERT(m_pAsynchronismEngine != NULL); return m_pAsynchronismEngine->OnMessageThreadStop(); } ////////////////////////////////////////////////////////////////////////// //构造函数 CAsynchronismEngine::CAsynchronismEngine(void) { //设置变量 m_bService = false; memset(m_cbBuffer, 0, sizeof(m_cbBuffer)); //设置组件 m_ControlWnd.m_pAsynchronismEngine = this; m_MessageThread.m_pAsynchronismEngine = this; return; } //析构函数 CAsynchronismEngine::~CAsynchronismEngine(void) { } //接口查询 void * CAsynchronismEngine::QueryInterface(const IID & Guid, DWORD dwQueryVer) { QUERYINTERFACE(IAsynchronismEngine, Guid, dwQueryVer); QUERYINTERFACE_IUNKNOWNEX(IAsynchronismEngine, Guid, dwQueryVer); return NULL; } //启动服务 bool CAsynchronismEngine::StartService() { //启动线程 if (m_MessageThread.StartThread() == false) return false; //设置变量 m_bService = true; return true; } //停止服务 bool CAsynchronismEngine::ConcludeService() { //设置变量 m_bService = false; //停止线程 m_MessageThread.ConcludeThread(INFINITE); //清理数据 m_DataStorage.RemoveData(false); return true; } //插入请求 bool CAsynchronismEngine::InsertRequest(WORD wRequestID, void * const pBuffer, WORD wDataSize, IUnknownEx * pIUnknownEx) { //效验状态 ASSERT(wDataSize <= sizeof(m_cbBuffer)); if (m_bService == false) return false; if (wDataSize > sizeof(m_cbBuffer)) return false; //查询接口 IAsynchronismEngineSink * pIAsynchronismEngineSink = QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, IAsynchronismEngineSink); ASSERT(pIAsynchronismEngineSink != NULL); if (pIAsynchronismEngineSink == NULL) return false; //插入数据 CWHDataLocker lcok(m_CriticalSection); // CThreadLockHandle ThreadLockHandle(&m_ThreadLock); if (m_DataStorage.InsertData(wRequestID, pBuffer, wDataSize) == false) return false; //投递消息 PostMessage(m_ControlWnd.m_hWnd, WM_ASYN_REQUEST, wRequestID, (LPARAM)pIAsynchronismEngineSink); return true; } bool CAsynchronismEngine::GetBurthenInfo(tagBurthenInfo & BurthenInfo) { CWHDataLocker lock(m_CriticalSection);// m_DataStorage.GetBurthenInfo(BurthenInfo); return true; } //注册钩子 bool CAsynchronismEngine::SetAsynchronismSink(IUnknownEx * pIUnknownEx) { //获取接口 IAsynchronismEngineSink * pIAsynchronismEngineSink = QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, IAsynchronismEngineSink); ASSERT(pIAsynchronismEngineSink != NULL); if (pIAsynchronismEngineSink == NULL) return false; //查找现存 IAsynchronismEngineSink * pIAsynchronismEngineSinkTemp = NULL; for (INT_PTR i = 0; i < m_AsynchronismEngineSinkArray.GetCount(); i++) { pIAsynchronismEngineSinkTemp = m_AsynchronismEngineSinkArray[0]; ASSERT(pIAsynchronismEngineSinkTemp != NULL); if (pIAsynchronismEngineSinkTemp == pIAsynchronismEngineSink) return false; } //注册钩子 m_AsynchronismEngineSinkArray.Add(pIAsynchronismEngineSink); return true; } //投递数据 bool CAsynchronismEngine::PostAsynchronismData(WORD wIdentifier, VOID * pData, WORD wDataSize) { //效验状态 ASSERT(wDataSize <= sizeof(m_cbBuffer)); if (m_bService == false) return false; if (wDataSize > sizeof(m_cbBuffer)) return false; // //查询接口 // IAsynchronismEngineSink * pIAsynchronismEngineSink = QUERY_ME_INTERFACE(IAsynchronismEngineSink); // ASSERT(pIAsynchronismEngineSink != NULL); // if (pIAsynchronismEngineSink == NULL) return false; //插入数据 CWHDataLocker lcok(m_CriticalSection); // CThreadLockHandle ThreadLockHandle(&m_ThreadLock); if (m_DataStorage.InsertData(wIdentifier, pData, wDataSize) == false) return false; //投递消息 PostMessage(m_ControlWnd.m_hWnd, WM_ASYN_REQUEST, (WPARAM)pData, /*(LPARAM)pIAsynchronismEngineSink*/0); return true; } bool CAsynchronismEngine::PostAsynchronismData(WORD wIdentifier, tagDataBuffer DataBuffer[], WORD wDataCount) { //效验状态 // ASSERT(wDataSize <= sizeof(m_cbBuffer)); if (m_bService == false) return false; // //查询接口 // IAsynchronismEngineSink * pIAsynchronismEngineSink = QUERY_ME_INTERFACE(IAsynchronismEngineSink); // ASSERT(pIAsynchronismEngineSink != NULL); // if (pIAsynchronismEngineSink == NULL) return false; //插入数据 CWHDataLocker lcok(m_CriticalSection); // CThreadLockHandle ThreadLockHandle(&m_ThreadLock); for (WORD i = 0; i < wDataCount; i++) { if (m_DataStorage.InsertData(wIdentifier, DataBuffer[i].pDataBuffer, DataBuffer[i].wDataSize) == false) return false; //投递消息 PostMessage(m_ControlWnd.m_hWnd, WM_ASYN_REQUEST, (WPARAM)DataBuffer[i].pDataBuffer, /*(LPARAM)pIAsynchronismEngineSink*/0); } return true; } //取消注册 bool CAsynchronismEngine::UnRegisterAsynchronismEngineSink(IUnknownEx * pIUnknownEx) { //获取接口 IAsynchronismEngineSink * pIAsynchronismEngineSink = QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, IAsynchronismEngineSink); ASSERT(pIAsynchronismEngineSink != NULL); if (pIAsynchronismEngineSink == NULL) return false; //删除钩子 IAsynchronismEngineSink * pIAsynchronismEngineSinkTemp = NULL; for (INT_PTR i = 0; i < m_AsynchronismEngineSinkArray.GetCount(); i++) { pIAsynchronismEngineSinkTemp = m_AsynchronismEngineSinkArray[0]; ASSERT(pIAsynchronismEngineSinkTemp != NULL); if (pIAsynchronismEngineSinkTemp == pIAsynchronismEngineSink) { m_AsynchronismEngineSinkArray.RemoveAt(i); return true; } } return false; } //线程启动 bool CAsynchronismEngine::OnMessageThreadStart() { //创建窗口 if (m_ControlWnd.m_hWnd == NULL) m_ControlWnd.Create(NULL, NULL, WS_CHILD, CRect(0, 0, 0, 0), CWnd::GetDesktopWindow(), 10); //事件通知 bool bSuccsee = true; IAsynchronismEngineSink * pIAsynchronismEngineSink = NULL; for (INT_PTR i = 0; i < m_AsynchronismEngineSinkArray.GetCount(); i++) { pIAsynchronismEngineSink = m_AsynchronismEngineSinkArray[0]; ASSERT(pIAsynchronismEngineSink != NULL); try { if (pIAsynchronismEngineSink->OnAsynchronismEngineStart() == false) bSuccsee = false; } catch (...) { bSuccsee = false; } } return bSuccsee; } //线程停止 bool CAsynchronismEngine::OnMessageThreadStop() { //关闭窗口 m_ControlWnd.DestroyWindow(); //事件通知 bool bSuccsee = true; IAsynchronismEngineSink * pIAsynchronismEngineSink = NULL; for (INT_PTR i = 0; i < m_AsynchronismEngineSinkArray.GetCount(); i++) { pIAsynchronismEngineSink = m_AsynchronismEngineSinkArray[0]; ASSERT(pIAsynchronismEngineSink != NULL); try { if (pIAsynchronismEngineSink->OnAsynchronismEngineConclude() == false) bSuccsee = false; } catch (...) { bSuccsee = false; } } return bSuccsee; } //异步请求 void CAsynchronismEngine::OnAsynchronismRequest(WORD wRequestID, IAsynchronismEngineSink * pIAsynchronismEngineSink) { //锁定资源 CWHDataLocker lcok(m_CriticalSection); //提取数据 tagDataHead DataHead; m_DataStorage.DistillData(DataHead, m_cbBuffer, sizeof(m_cbBuffer)); //消息处理 try { ASSERT(DataHead.wIdentifier == wRequestID); pIAsynchronismEngineSink->OnAsynchronismEngineData(wRequestID, m_cbBuffer, DataHead.wDataSize); } catch (...) {} return; } ////////////////////////////////////////////////////////////////////////// //建立对象函数 extern "C" __declspec(dllexport) void * CreateAsynchronismEngine(const GUID & Guid, DWORD dwInterfaceVer) { //建立对象 CAsynchronismEngine * pAsynchronismEngine = NULL; try { pAsynchronismEngine = new CAsynchronismEngine(); if (pAsynchronismEngine == NULL) throw TEXT("创建失败"); void * pObject = pAsynchronismEngine->QueryInterface(Guid, dwInterfaceVer); if (pObject == NULL) throw TEXT("接口查询失败"); return pObject; } catch (...) {} //清理对象 SafeDelete(pAsynchronismEngine); return NULL; } //////////////////////////////////////////////////////////////////////////