#include "StdAfx.h" #include "Math.h" #include "TraceService.h" #include "DataBase.h" ////////////////////////////////////////////////////////////////////////// //宏定义 _COM_SMARTPTR_TYPEDEF(IADORecordBinding, __uuidof(IADORecordBinding)); //效验结果宏 #define EfficacyResult(hResult) { if (FAILED(hResult)) _com_issue_error(hResult); } ////////////////////////////////////////////////////////////////////////// //构造函数 CADOError::CADOError() { m_enErrorType = SQLException_None; } //析构函数 CADOError::~CADOError() { } //接口查询 void * CADOError::QueryInterface(const IID & Guid, DWORD dwQueryVer) { QUERYINTERFACE(IDataBaseException, Guid, dwQueryVer); QUERYINTERFACE_IUNKNOWNEX(IDataBaseException, Guid, dwQueryVer); return NULL; } //设置错误 void CADOError::SetErrorInfo(enSQLException enErrorType, LPCTSTR pszDescribe) { //设置错误 m_enErrorType = enErrorType; m_strErrorDescribe = pszDescribe; //抛出错误 throw QUERY_ME_INTERFACE(IDataBaseException); return; } ////////////////////////////////////////////////////////////////////////// //构造函数 CDataBase::CDataBase() : m_dwResumeConnectCount(30L), m_dwResumeConnectTime(30L) { //状态变量 m_dwConnectCount = 0; m_dwConnectErrorTime = 0L; //创建对象 m_DBCommand.CreateInstance(__uuidof(Command)); m_DBRecordset.CreateInstance(__uuidof(Recordset)); m_DBConnection.CreateInstance(__uuidof(Connection)); //效验数据 ASSERT(m_DBCommand != NULL); ASSERT(m_DBRecordset != NULL); ASSERT(m_DBConnection != NULL); if (m_DBCommand == NULL) throw TEXT("数据库命令对象创建失败"); if (m_DBRecordset == NULL) throw TEXT("数据库记录集对象创建失败"); if (m_DBConnection == NULL) throw TEXT("数据库连接对象创建失败"); //设置变量 m_DBCommand->CommandType = adCmdStoredProc; return; } //析构函数 CDataBase::~CDataBase() { //关闭连接 CloseConnection(); //释放对象 m_DBCommand.Release(); m_DBRecordset.Release(); m_DBConnection.Release(); return; } //接口查询 void * CDataBase::QueryInterface(const IID & Guid, DWORD dwQueryVer) { QUERYINTERFACE(IDataBase, Guid, dwQueryVer); QUERYINTERFACE_IUNKNOWNEX(IDataBase, Guid, dwQueryVer); return NULL; } //打开连接 VOID CDataBase::OpenConnection() { //连接数据库 try { //关闭连接 CloseConnection(); //连接数据库 EfficacyResult(m_DBConnection->Open(_bstr_t(m_strConnect), L"", L"", adConnectUnspecified)); m_DBConnection->CursorLocation = adUseClient; m_DBCommand->ActiveConnection = m_DBConnection; //设置变量 m_dwConnectCount = 0L; m_dwConnectErrorTime = 0L; } catch (CComError & ComError) { CString csTest; csTest.Format(L"OpenConnection"); SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest)); } } //关闭记录 VOID CDataBase::CloseRecordset() { try { if (IsRecordsetOpened()) EfficacyResult(m_DBRecordset->Close()); } catch (CComError & ComError) { SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError)); } } //关闭连接 VOID CDataBase::CloseConnection() { try { CloseRecordset(); if ((m_DBConnection != NULL) && (m_DBConnection->GetState() != adStateClosed)) { EfficacyResult(m_DBConnection->Close()); } } catch (CComError & ComError) { SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError)); } } //重新连接 bool CDataBase::TryConnectAgain(bool bFocusConnect, CComError * pComError) { try { //判断重连 bool bReConnect = bFocusConnect; if (bReConnect == false) { DWORD dwNowTime = (DWORD)time(NULL); if ((m_dwConnectErrorTime + m_dwResumeConnectTime) > dwNowTime) bReConnect = true; } if ((bReConnect == false) && (m_dwConnectCount > m_dwResumeConnectCount)) bReConnect = true; //设置变量 m_dwConnectCount++; m_dwConnectErrorTime = (DWORD)time(NULL); if (bReConnect == false) { if (pComError != NULL) SetErrorInfo(SQLException_Connect, GetComErrorDescribe(*pComError)); return false; } //重新连接 OpenConnection(); return true; } catch (IDataBaseException * pIDataBaseException) { //重新连接错误 if (pComError != NULL) SetErrorInfo(SQLException_Connect, GetComErrorDescribe(*pComError)); else throw pIDataBaseException; } return false; } //连接信息 bool CDataBase::SetConnectionInfo(DWORD dwDBAddr, WORD wPort, LPCTSTR szDBName, LPCTSTR szUser, LPCTSTR szPassword) { //效验参数 ASSERT(dwDBAddr != 0); ASSERT(szDBName != NULL); ASSERT(szUser != NULL); ASSERT(szPassword != NULL); BYTE a = (BYTE)((dwDBAddr >> 24) & 0xFF); BYTE b = (BYTE)((dwDBAddr >> 16) & 0xFF); BYTE c = (BYTE)((dwDBAddr >> 8) & 0xFF); BYTE d = (BYTE)(dwDBAddr & 0xFF); try { //构造连接字符串 m_strConnect.Format(TEXT("Provider=SQLOLEDB.1;Password=%s;Persist Security Info=True;User ID=%s;Initial Catalog=%d.%d.%d.%d;Data Source=%s,%ld;"), szPassword, szUser, szDBName, a, b, c, d, wPort); } catch (CComError & ComError) { SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError)); } return true; } //切换记录 VOID CDataBase::NextRecordset() { try { VARIANT lngRec; m_DBRecordset->NextRecordset(&lngRec); return; } catch (CComError & ComError) { SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError)); } } //设置信息 bool CDataBase::SetConnectionInfo(LPCTSTR szDBAddr, WORD wPort, LPCTSTR szDBName, LPCTSTR szUser, LPCTSTR szPassword) { //效验参数 ASSERT(szDBAddr != NULL); ASSERT(szDBName != NULL); ASSERT(szUser != NULL); ASSERT(szPassword != NULL); try { //构造连接字符串 m_strConnect.Format(TEXT("Provider=SQLOLEDB.1;Password=%s;Persist Security Info=True;User ID=%s;Initial Catalog=%s;Data Source=%s,%ld;"), szPassword, szUser, szDBName, szDBAddr, wPort); } catch (CComError & ComError) { CString csTest; csTest.Format(L"SetConnectionInfo:szDBAddr=%s,wPort=%d,szDBName=%s,szUser=%s,szPassword=%s", szDBAddr, wPort, szDBName, szUser, szPassword); SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest)); } return true; } //是否连接错误 bool CDataBase::IsConnectError() { try { //状态判断 if (m_DBConnection == NULL) return true; if (m_DBConnection->GetState() == adStateClosed) return true; //参数判断 long lErrorCount = m_DBConnection->Errors->Count; if (lErrorCount > 0L) { ErrorPtr pError = NULL; for (long i = 0; i < lErrorCount; i++) { pError = m_DBConnection->Errors->GetItem(i); if (pError->Number == 0x80004005) return true; } } return false; } catch (CComError & ComError) { CString csTest; csTest.Format(L"IsConnectError"); SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest)); } return false; } //是否打开 bool CDataBase::IsRecordsetOpened() { if (m_DBRecordset == NULL) return false; if (m_DBRecordset->GetState() == adStateClosed) return false; return true; } //往下移动 void CDataBase::MoveToNext() { try { m_DBRecordset->MoveNext(); } catch (CComError & ComError) { CString csTest; csTest.Format(L"MoveToNext"); SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest)); } return; } //移到开头 void CDataBase::MoveToFirst() { try { m_DBRecordset->MoveFirst(); } catch (CComError & ComError) { CString csTest; csTest.Format(L"MoveToFirst"); SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest)); } return; } //是否结束 bool CDataBase::IsRecordsetEnd() { try { return (m_DBRecordset->EndOfFile == VARIANT_TRUE); } catch (CComError & ComError) { CString csTest; csTest.Format(L"IsRecordsetEnd"); SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest)); } return true; } //获取数目 long CDataBase::GetRecordCount() { try { if (m_DBRecordset == NULL) return 0; return m_DBRecordset->GetRecordCount(); } catch (CComError & ComError) { CString csTest; csTest.Format(L"GetRecordCount"); SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest)); } return 0; } //获取大小 long CDataBase::GetActualSize(LPCTSTR pszParamName) { ASSERT(pszParamName != NULL); try { return m_DBRecordset->Fields->Item[pszParamName]->ActualSize; } catch (CComError & ComError) { CString csTest; csTest.Format(L"GetActualSize:%s", pszParamName); SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest)); } return -1; } //绑定对象 VOID CDataBase::BindToRecordset(CADORecordBinding * pBind) { ASSERT(pBind != NULL); try { IADORecordBindingPtr pIBind(m_DBRecordset); pIBind->BindToRecordset(pBind); } catch (CComError & ComError) { SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError)); } } //获取数据 VOID CDataBase::GetRecordsetValue(LPCTSTR pszItem, CDBVarValue & DBVarValue) { ASSERT(pszItem != NULL); try { DBVarValue = m_DBRecordset->Fields->GetItem(pszItem)->Value; } catch (CComError & ComError) { CString csTest; csTest.Format(L"GetRecordsetValue:%s", pszItem); SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest)); } } //获取参数 bool CDataBase::GetFieldValue(LPCTSTR lpFieldName, BYTE & bValue) { bValue = 0; try { bValue = m_DBRecordset->Fields->GetItem(lpFieldName)->Value; return true; } catch (CComError & ComError) { CString csTest; csTest.Format(L"GetFieldValue:%s", lpFieldName); SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest)); } return false; } //获取参数 bool CDataBase::GetFieldValue(LPCTSTR lpFieldName, UINT & ulValue) { ulValue = 0; try { ulValue = m_DBRecordset->Fields->GetItem(lpFieldName)->Value; return true; } catch (CComError & ComError) { CString csTest; csTest.Format(L"GetFieldValue:%s", lpFieldName); SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest)); } return false; } //获取参数 bool CDataBase::GetFieldValue(LPCTSTR lpFieldName, DOUBLE & dbValue) { dbValue = 0.0; try { dbValue = m_DBRecordset->Fields->GetItem(lpFieldName)->Value; return true; } catch (CComError & ComError) { CString csTest; csTest.Format(L"GetFieldValue:%s", lpFieldName); SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest)); } return false; } //获取参数 bool CDataBase::GetFieldValue(LPCTSTR lpFieldName, LONG & lValue) { lValue = 0L; try { lValue = m_DBRecordset->Fields->GetItem(lpFieldName)->Value; return true; } catch (CComError & ComError) { CString csTest; csTest.Format(L"GetFieldValue:%s", lpFieldName); SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest)); } return false; } //获取参数 bool CDataBase::GetFieldValue(LPCTSTR lpFieldName, DWORD & ulValue) { ulValue = 0L; try { ulValue = m_DBRecordset->Fields->GetItem(lpFieldName)->Value; return true; } catch (CComError & ComError) { CString csTest; csTest.Format(L"GetFieldValue:%s", lpFieldName); SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest)); } return false; } //获取参数 bool CDataBase::GetFieldValue(LPCTSTR lpFieldName, INT & nValue) { nValue = 0L; try { nValue = m_DBRecordset->Fields->GetItem(lpFieldName)->Value; return true; } catch (CComError & ComError) { CString csTest; csTest.Format(L"GetFieldValue:%s", lpFieldName); SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest)); } return false; } //获取参数 bool CDataBase::GetFieldValue(LPCTSTR lpFieldName, __int64 & llValue) { llValue = 0; try { llValue = m_DBRecordset->Fields->GetItem(lpFieldName)->Value; return true; } catch (CComError & ComError) { CString csTest; csTest.Format(L"GetFieldValue:%s", lpFieldName); SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest)); } return false; } //获取参数 bool CDataBase::GetFieldValue(LPCTSTR lpFieldName, TCHAR szBuffer[], UINT uSize) { try { _variant_t vtFld = m_DBRecordset->Fields->GetItem(lpFieldName)->Value; if (vtFld.vt == VT_BSTR) { _sntprintf(szBuffer, uSize, TEXT("%s"), (TCHAR*)_bstr_t(vtFld)); return true; } return false; } catch (CComError & ComError) { CString csTest; csTest.Format(L"GetFieldValue:%s", lpFieldName); SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest)); } ASSERT(0); return false; } //获取参数 bool CDataBase::GetFieldValue(LPCTSTR lpFieldName, WORD & wValue) { wValue = 0L; try { wValue = m_DBRecordset->Fields->GetItem(lpFieldName)->Value; return true; } catch (CComError & ComError) { CString csTest; csTest.Format(L"GetFieldValue:%s", lpFieldName); SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest)); } return false; } //获取参数 bool CDataBase::GetFieldValue(LPCTSTR lpFieldName, COleDateTime & Time) { try { _variant_t vtFld = m_DBRecordset->Fields->GetItem(lpFieldName)->Value; switch (vtFld.vt) { case VT_DATE: { COleDateTime TempTime(vtFld); Time = TempTime; break; } case VT_EMPTY: case VT_NULL: { Time.SetStatus(COleDateTime::null); break; } default: return false; } return true; } catch (CComError & ComError) { CString csTest; csTest.Format(L"GetFieldValue:%s", lpFieldName); SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest)); } return false; } //获取参数 bool CDataBase::GetFieldValue(LPCTSTR lpFieldName, bool & bValue) { bValue = false; try { bValue = m_DBRecordset->Fields->GetItem(lpFieldName)->Value; return true; } catch (CComError & ComError) { CString csTest; csTest.Format(L"GetFieldValue:%s", lpFieldName); SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest)); } return false; } //获取返回数值 long CDataBase::GetReturnValue() { try { _ParameterPtr Parameter; long lParameterCount = m_DBCommand->Parameters->Count; for (long i = 0; i < lParameterCount; i++) { Parameter = m_DBCommand->Parameters->Item[i]; if (Parameter->Direction == adParamReturnValue) return Parameter->Value; } } catch (CComError & ComError) { CString csTest; csTest.Format(L"GetReturnValue"); SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest)); } return 0; } //删除参数 void CDataBase::ClearParameters() { try { long lParameterCount = m_DBCommand->Parameters->Count; if (lParameterCount > 0L) { for (long i = lParameterCount; i > 0; i--) { m_DBCommand->Parameters->Delete(i - 1); } } } catch (CComError & ComError) { SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError)); } return; } //获得参数 void CDataBase::GetParameter(LPCTSTR pszParamName, CDBVarValue & DBVarValue) { //效验参数 ASSERT(pszParamName != NULL); //获取参数 try { DBVarValue.Clear(); DBVarValue = m_DBCommand->Parameters->Item[pszParamName]->Value; } catch (CComError & ComError) { CString csTest; csTest.Format(L"GetParameter:%s", pszParamName); SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest)); } return; } //插入参数 void CDataBase::AddParameter(LPCTSTR pszName, ADOCG::DataTypeEnum Type, ADOCG::ParameterDirectionEnum Direction, LONG lSize, CDBVarValue & DBVarValue) { ASSERT(pszName != NULL); if (pszName == NULL) return; try { _ParameterPtr Parameter = m_DBCommand->CreateParameter(pszName, Type, Direction, lSize, DBVarValue); m_DBCommand->Parameters->Append(Parameter); } catch (CComError & ComError) { CString csTest; csTest.Format(L"AddParameter:%s", pszName); SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest)); } } //执行语句 VOID CDataBase::ExecuteProcess(LPCTSTR pszSPName, bool bRecordset) { ASSERT(pszSPName != NULL); try { //关闭记录集 CloseRecordset(); m_DBCommand->CommandText = pszSPName; //执行命令 if (bRecordset == true) { m_DBRecordset->PutRefSource(m_DBCommand); m_DBRecordset->CursorLocation = adUseClient; EfficacyResult(m_DBRecordset->Open((IDispatch *)m_DBCommand, vtMissing, adOpenForwardOnly, adLockReadOnly, adOptionUnspecified)); } else { m_DBConnection->CursorLocation = adUseClient; EfficacyResult(m_DBCommand->Execute(NULL, NULL, adExecuteNoRecords)); } } catch (CComError & ComError) { if (IsConnectError() == true) TryConnectAgain(false, &ComError); else { SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, pszSPName)); } } } //执行命令 VOID CDataBase::ExecuteSentence(LPCTSTR pszCommand, bool bRecordset) { ASSERT(pszCommand != NULL); try { m_DBConnection->CursorLocation = adUseClient; m_DBConnection->Execute(pszCommand, NULL, adExecuteNoRecords); } catch (CComError & ComError) { if (IsConnectError() == true) TryConnectAgain(false, &ComError); else SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError)); } } //获取错误 LPCTSTR CDataBase::GetComErrorDescribe(CComError & ComError) { _bstr_t bstrDescribe(ComError.Description()); m_strErrorDescribe.Format(TEXT("ADO 错误:0x%8x,%s"), ComError.Error(), (LPCTSTR)bstrDescribe); return m_strErrorDescribe; } //获取错误 LPCTSTR CDataBase::GetComErrorDescribeEx(CComError & ComError, LPCTSTR pszSPName) { _bstr_t bstrDescribe(ComError.Description()); m_strErrorDescribe.Format(TEXT("[%s]ADO 错误:0x%8x,%s"), pszSPName, ComError.Error(), (LPCTSTR)bstrDescribe); return m_strErrorDescribe; } //设置错误 void CDataBase::SetErrorInfo(enSQLException enErrorType, LPCTSTR pszDescribe) { m_ADOError.SetErrorInfo(enErrorType, pszDescribe); return; } ////////////////////////////////////////////////////////////////////////// //构造函数 CDataBaseEngine::CDataBaseEngine(void) { //设置变量 m_bService = false; m_pIDataBaseEngineSink = NULL; return; } //析构函数 CDataBaseEngine::~CDataBaseEngine(void) { } //接口查询 void * CDataBaseEngine::QueryInterface(const IID & Guid, DWORD dwQueryVer) { QUERYINTERFACE(IDataBaseEngine, Guid, dwQueryVer); QUERYINTERFACE(IQueueServiceSink, Guid, dwQueryVer); QUERYINTERFACE_IUNKNOWNEX(IDataBaseEngine, Guid, dwQueryVer); return NULL; } bool CDataBaseEngine::GetBurthenInfo(tagBurthenInfo & BurthenInfo) { return false; } //注册接口 bool CDataBaseEngine::SetDataBaseEngineSink(IUnknownEx * pIUnknownEx) { //效验参数 ASSERT(pIUnknownEx != NULL); //ASSERT(m_pIDataBaseEngineSink == NULL); if (pIUnknownEx == NULL) return false; if (m_pIDataBaseEngineSink != NULL) return false; //查询接口 m_pIDataBaseEngineSink = QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, IDataBaseEngineSink); if (m_pIDataBaseEngineSink == NULL) { CTraceService::TraceString(TEXT("数据库引擎外挂服务接口获取失败,挂接操作失败"), TraceLevel_Exception); return false; } return true; } //注册接口 bool CDataBaseEngine::SetDataBaseEngineSink(IUnknownEx * pIUnknownEx[], WORD wSinkCount) { for (WORD i = 0; i < wSinkCount; i++) { SetDataBaseEngineSink(pIUnknownEx[i]); } return true; } //启动服务 bool CDataBaseEngine::StartService() { //判断状态 if (m_bService == true) { CTraceService::TraceString(TEXT("数据库引擎重复启动,启动操作忽略"), TraceLevel_Warning); return true; } //外挂接口 if (m_pIDataBaseEngineSink == NULL) { CTraceService::TraceString(TEXT("数据库引擎外挂服务不存在"), TraceLevel_Exception); return false; } //设置队列 if (m_QueueServiceEvent.SetQueueServiceSink(QUERY_ME_INTERFACE(IUnknownEx)) == false) { CTraceService::TraceString(TEXT("数据库引擎与队列服务绑定失败"), TraceLevel_Exception); return false; } //启动外挂 if (m_pIDataBaseEngineSink->OnDataBaseEngineStart(QUERY_ME_INTERFACE(IUnknownEx)) == false) { CTraceService::TraceString(TEXT("数据库引擎外挂服务启动失败"), TraceLevel_Exception); return false; } //设置变量 m_bService = true; return true; } //停止服务 bool CDataBaseEngine::ConcludeService() { //设置变量 m_bService = false; tagBurthenInfo BurthenInfo; int nTimeout = 1000; while (true) { m_QueueServiceEvent.m_pIQueueService.GetBurthenInfo(BurthenInfo); if (BurthenInfo.dwDataPacketCount <= 0 || nTimeout <= 0) //magiii 12/08/23/ 等待队列处理完成 break; nTimeout--; ::Sleep(10); } //停止请求队列 m_QueueServiceEvent.SetQueueServiceSink(NULL); //停止外挂 if (m_pIDataBaseEngineSink != NULL) { m_pIDataBaseEngineSink->OnDataBaseEngineConclude(QUERY_ME_INTERFACE(IUnknownEx)); m_pIDataBaseEngineSink = NULL; } return true; } //队列接口 void CDataBaseEngine::OnQueueServiceSink(WORD wIdentifier, void * pBuffer, WORD wDataSize) { //判断状态 if (m_bService == false) return; //请求处理 switch (wIdentifier) { case EVENT_DATABASE: { //效验参数 ASSERT(pBuffer != NULL); ASSERT(wDataSize >= sizeof(NTY_DataBaseEvent)); if (wDataSize < sizeof(NTY_DataBaseEvent)) return; //变量定义 NTY_DataBaseEvent * pDataBaseEvent = (NTY_DataBaseEvent *)pBuffer; WORD wHandleBuffer = wDataSize - sizeof(NTY_DataBaseEvent); //处理数据 ASSERT(m_pIDataBaseEngineSink != NULL); m_pIDataBaseEngineSink->OnDataBaseEngineRequest(pDataBaseEvent->wRequestID, pDataBaseEvent->dwContextID, pDataBaseEvent + 1, wHandleBuffer); return; } case EVENT_TIMER://时间事件 { //效验参数 ASSERT(pBuffer != NULL); ASSERT(wDataSize >= sizeof(NTY_TimerEvent)); if (wDataSize < sizeof(NTY_TimerEvent)) return; //变量定义 NTY_TimerEvent * pDataBaseEvent = (NTY_TimerEvent *)pBuffer; WORD wHandleBuffer = wDataSize - sizeof(NTY_TimerEvent); //处理数据 ASSERT(m_pIDataBaseEngineSink != NULL); m_pIDataBaseEngineSink->OnDataBaseEngineTimer(pDataBaseEvent->dwTimerID, pDataBaseEvent->dwBindParameter); return; } case EVENT_CONTROL://控制事件 { //效验参数 ASSERT(pBuffer != NULL); ASSERT(wDataSize >= sizeof(NTY_ControlEvent)); if (wDataSize < sizeof(NTY_ControlEvent)) return; //变量定义 NTY_ControlEvent * pDataBaseEvent = (NTY_ControlEvent *)pBuffer; WORD wHandleBuffer = wDataSize - sizeof(NTY_ControlEvent); //处理数据 ASSERT(m_pIDataBaseEngineSink != NULL); m_pIDataBaseEngineSink->OnDataBaseEngineControl(pDataBaseEvent->wControlID, pDataBaseEvent + 1, wHandleBuffer); return; } default: { ASSERT(false); } } return; } //控制事件 ////////////////////////////////////////////////////////////////////////// //控制事件 bool CDataBaseEngine::PostDataBaseControl(WORD wControlID, VOID * pData, WORD wDataSize) { return m_QueueServiceEvent.PostControlEvent(wControlID, pData, wDataSize); } //请求事件 bool CDataBaseEngine::PostDataBaseRequest(WORD wRequestID, DWORD dwContextID, VOID * pData, WORD wDataSize) { return m_QueueServiceEvent.PostDataBaseEvent(wRequestID, dwContextID, pData, wDataSize); } //延期请求 bool CDataBaseEngine::DeferDataBaseRequest(WORD wRequestID, DWORD dwContextID, VOID * pData, WORD wDataSize) { return m_QueueServiceEvent.PostDataBaseEvent(wRequestID, dwContextID, pData, wDataSize); } ////////////////////////////////////////////////////////////////////////// //建立对象函数 extern "C" __declspec(dllexport) void * __cdecl CreateDataBaseEngine(const GUID & Guid, DWORD dwInterfaceVer) { //建立对象 CDataBaseEngine * pDataBaseEngine = NULL; try { pDataBaseEngine = new CDataBaseEngine(); if (pDataBaseEngine == NULL) throw TEXT("创建失败"); void * pObject = pDataBaseEngine->QueryInterface(Guid, dwInterfaceVer); if (pObject == NULL) throw TEXT("接口查询失败"); return pObject; } catch (...) {} //清理对象 SafeDelete(pDataBaseEngine); return NULL; } ////////////////////////////////////////////////////////////////////////// //建立对象函数 extern "C" __declspec(dllexport) void * __cdecl CreateDataBase(const GUID & Guid, DWORD dwInterfaceVer) { //建立对象 CDataBase * pDataBase = NULL; try { pDataBase = new CDataBase(); if (pDataBase == NULL) throw TEXT("创建失败"); void * pObject = pDataBase->QueryInterface(Guid, dwInterfaceVer); if (pObject == NULL) throw TEXT("接口查询失败"); return pObject; } catch (...) {} //清理对象 SafeDelete(pDataBase); return NULL; } //////////////////////////////////////////////////////////////////////////