Files
2026-03-03 13:56:44 +08:00

931 lines
20 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "StdAfx.h"
#include "Math.h"
#include "DataBaseEngine.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 * __cdecl 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 * __cdecl CDataBase::QueryInterface(const IID & Guid, DWORD dwQueryVer)
{
QUERYINTERFACE(IDataBase,Guid,dwQueryVer);
QUERYINTERFACE_IUNKNOWNEX(IDataBase,Guid,dwQueryVer);
return NULL;
}
//打开连接
void __cdecl 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;
return ;
}
catch (CComError & ComError) { SetErrorInfo(SQLException_Connect,GetComErrorDescribe(ComError)); }
return ;
}
//关闭连接
void __cdecl CDataBase::CloseConnection()
{
try
{
CloseRecordset();
if ((m_DBConnection!=NULL)&&(m_DBConnection->GetState()!=adStateClosed))
{
EfficacyResult(m_DBConnection->Close());
}
return ;
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return ;
}
//设置信息
bool __cdecl CDataBase::SetConnectionInfo(DWORD dwDBAddr, WORD wPort, LPCTSTR szDBName, LPCTSTR szUser, LPCTSTR szPassword)
{
//效验参数
ASSERT(szDBName!=NULL);
ASSERT(szUser!=NULL);
ASSERT(szPassword!=NULL);
struct sockaddr_in local;
local.sin_family = AF_INET;
local.sin_addr.s_addr = dwDBAddr;
char * pIP = inet_ntoa(local.sin_addr);
//构造连接字符串
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,pIP,wPort);
return true;
}
//设置信息
bool __cdecl CDataBase::SetConnectionInfo(LPCTSTR szIP, WORD wPort, LPCTSTR szData, LPCTSTR szName, LPCTSTR szPass)
{
//效验参数
ASSERT(szIP!=NULL);
ASSERT(szData!=NULL);
ASSERT(szName!=NULL);
ASSERT(szPass!=NULL);
//构造连接字符串
m_strConnect.Format(TEXT("Provider=SQLOLEDB.1;Password=%s;Persist Security Info=True;User ID=%s;Initial Catalog=%s;Data Source=%s,%ld;"),
szPass,szName,szData,szIP,wPort);
return true;
}
VOID __cdecl 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(ErrorType_Other,GetComErrorDescribe(ComError)); }
}
//获得参数
void __cdecl CDataBase::GetParameter(LPCTSTR pszParamName, CDBVarValue & DBVarValue)//(LPCTSTR pszParamName, _variant_t & vtValue)
{
//效验参数
ASSERT(pszParamName!=NULL);
//获取参数
try
{
DBVarValue.Clear();
DBVarValue=m_DBCommand->Parameters->Item[pszParamName]->Value;
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return;
}
//执行语句
VOID __cdecl CDataBase::AddParameter(LPCTSTR pszName, DataTypeEnum Type, ParameterDirectionEnum Direction, LONG lSize, CDBVarValue & DBVarValue)
{
ASSERT(pszName!=NULL);
try
{
_ParameterPtr Parameter=m_DBCommand->CreateParameter(pszName,Type,Direction,lSize,DBVarValue);
m_DBCommand->Parameters->Append(Parameter);
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return;
return ;
}
VOID __cdecl CDataBase::NextRecordset()
{
try
{
m_DBRecordset->MoveNext();
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return;
}
//关闭记录
VOID __cdecl CDataBase::CloseRecordset()
{
try
{
if (IsRecordsetOpened()) EfficacyResult(m_DBRecordset->Close());
return ;
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return ;
}
VOID __cdecl CDataBase::BindToRecordset(CADORecordBinding * pBind)
{
ASSERT(pBind!=NULL);
try
{
IADORecordBindingPtr pIBind(m_DBRecordset);
pIBind->BindToRecordset(pBind);
return ;
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return ;
}
//往下移动
void __cdecl CDataBase::MoveToNext()
{
try
{
m_DBRecordset->MoveNext();
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return;
}
//移到开头
void __cdecl CDataBase::MoveToFirst()
{
try
{
m_DBRecordset->MoveFirst();
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return;
}
//是否结束
bool __cdecl CDataBase::IsRecordsetEnd()
{
try
{
return (m_DBRecordset->EndOfFile==VARIANT_TRUE);
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return true;
}
//获取数目
long __cdecl CDataBase::GetRecordCount()
{
try
{
if (m_DBRecordset==NULL) return 0;
return m_DBRecordset->GetRecordCount();
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return 0;
}
//获取返回数值
long __cdecl 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.lVal;
}
ASSERT(FALSE);
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return 0;
}
//获取返回数值
void __cdecl CDataBase::GetRecordsetValue(LPCTSTR pszItem, CDBVarValue & DBVarValue)
{
//效验参数
ASSERT(pszItem!=NULL);
try
{
DBVarValue.Clear();
DBVarValue=m_DBRecordset->Fields->GetItem(pszItem)->Value;
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return ;
}
//执行语句
VOID __cdecl CDataBase::ExecuteProcess(LPCTSTR pszSPName, bool bRecordset)
{
return ;
}
//执行语句
VOID __cdecl CDataBase::ExecuteSentence(LPCTSTR pszCommand, bool bRecordset)
{
ASSERT(pszCommand!=NULL);
try
{
m_DBConnection->CursorLocation=adUseClient;
m_DBConnection->Execute(pszCommand,NULL,adExecuteNoRecords);
return ;
}
catch (CComError & ComError)
{
SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError));
}
catch(...)
{
CloseRecordset();
CloseConnection();
}
return ;
}
//接口函数引用的函数
//是否打开
bool __cdecl CDataBase::IsRecordsetOpened()
{
if (m_DBRecordset==NULL) return false;
if (m_DBRecordset->GetState()==adStateClosed) return false;
return true;
}
//获取错误
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;
}
//设置错误
void CDataBase::SetErrorInfo(enSQLException enErrorType, LPCTSTR pszDescribe)
{
m_ADOError.SetErrorInfo(enErrorType,pszDescribe);
return;
}
///接口函数引用的函数
//设置存储过程
void __cdecl CDataBase::SetSPName(LPCTSTR pszSpName)
{
ASSERT(pszSpName!=NULL);
try
{
m_DBCommand->CommandText=pszSpName;
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return;
}
//执行语句
bool __cdecl CDataBase::Execute(LPCTSTR pszCommand)
{
ASSERT(pszCommand!=NULL);
try
{
m_DBConnection->CursorLocation=adUseClient;
m_DBConnection->Execute(pszCommand,NULL,adExecuteNoRecords);
return true;
}
catch (CComError & ComError)
{
SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError));
}
catch(...)
{
CloseRecordset();
CloseConnection();
}
return false;
}
//执行命令
bool __cdecl CDataBase::ExecuteCommand(bool bRecordset)
{
try
{
//关闭记录集
CloseRecordset();
//执行命令
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));
}
return true;
}
catch (CComError & ComError)
{
SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError));
}
catch(...)
{
CloseRecordset();
CloseConnection();
}
return false;
}
//获取参数
bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, BYTE & bValue)
{
try
{
bValue=0;
_variant_t vtFld=m_DBRecordset->Fields->GetItem(lpFieldName)->Value;
switch(vtFld.vt)
{
case VT_BOOL:
{
bValue=(vtFld.boolVal!=0)?1:0;
break;
}
case VT_I2:
case VT_UI1:
{
bValue=(vtFld.iVal>0)?1:0;
break;
}
case VT_NULL:
case VT_EMPTY:
{
bValue=0;
break;
}
default: bValue=(BYTE)vtFld.iVal;
}
return true;
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return false;
}
//获取参数
bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, UINT & ulValue)
{
try
{
ulValue=0L;
_variant_t vtFld=m_DBRecordset->Fields->GetItem(lpFieldName)->Value;
if ((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY)) ulValue=vtFld.lVal;
return true;
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return false;
}
//获取参数
bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, DOUBLE & dbValue)
{
try
{
dbValue=0.0L;
_variant_t vtFld=m_DBRecordset->Fields->GetItem(lpFieldName)->Value;
switch(vtFld.vt)
{
case VT_R4:
{
dbValue=vtFld.fltVal;
break;
}
case VT_R8:
{
dbValue=vtFld.dblVal;
break;
}
case VT_DECIMAL:
{
dbValue=vtFld.decVal.Lo32;
dbValue*=(vtFld.decVal.sign==128)?-1:1;
dbValue/=pow((float)10,vtFld.decVal.scale);
break;
}
case VT_UI1:
{
dbValue=vtFld.iVal;
break;
}
case VT_I2:
case VT_I4:
{
dbValue=vtFld.lVal;
break;
}
case VT_NULL:
case VT_EMPTY:
{
dbValue=0.0L;
break;
}
default: dbValue=vtFld.dblVal;
}
return true;
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return false;
}
//获取参数
bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, LONG & lValue)
{
try
{
lValue=0L;
_variant_t vtFld=m_DBRecordset->Fields->GetItem(lpFieldName)->Value;
if ((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY)) lValue=vtFld.lVal;
return true;
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return false;
}
//获取参数
bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, DWORD & ulValue)
{
try
{
ulValue=0L;
_variant_t vtFld=m_DBRecordset->Fields->GetItem(lpFieldName)->Value;
if ((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY)) ulValue=vtFld.ulVal;
return true;
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return false;
}
//获取参数
bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, INT & nValue)
{
try
{
nValue=0;
_variant_t vtFld = m_DBRecordset->Fields->GetItem(lpFieldName)->Value;
switch(vtFld.vt)
{
case VT_BOOL:
{
nValue = vtFld.boolVal;
break;
}
case VT_I2:
case VT_UI1:
{
nValue = vtFld.iVal;
break;
}
case VT_NULL:
case VT_EMPTY:
{
nValue = 0;
break;
}
default: nValue = vtFld.iVal;
}
return true;
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return false;
}
//获取参数
bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, __int64 & llValue)
{
try
{
llValue=0L;
_variant_t vtFld=m_DBRecordset->Fields->GetItem(lpFieldName)->Value;
if ((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY)) llValue=vtFld.llVal;
return true;
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return false;
}
//获取参数
bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, TCHAR szBuffer[], UINT uSize)
{
try
{
_variant_t vtFld=m_DBRecordset->Fields->GetItem(lpFieldName)->Value;
if (vtFld.vt==VT_BSTR)
{
lstrcpy(szBuffer,(char*)_bstr_t(vtFld));
return true;
}
return false;
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return false;
}
//获取参数
bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, WORD & wValue)
{
try
{
wValue=0L;
_variant_t vtFld=m_DBRecordset->Fields->GetItem(lpFieldName)->Value;
if ((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY)) wValue=(WORD)vtFld.ulVal;
return true;
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return false;
}
//获取参数
bool __cdecl 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) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return false;
}
//获取参数
bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, bool & bValue)
{
try
{
_variant_t vtFld=m_DBRecordset->Fields->GetItem(lpFieldName)->Value;
switch(vtFld.vt)
{
case VT_BOOL:
{
bValue=(vtFld.boolVal==0)?false:true;
break;
}
case VT_EMPTY:
case VT_NULL:
{
bValue = false;
break;
}
default:return false;
}
return true;
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return false;
}
void CDataBase::ExecuteSql(LPCTSTR strSQL,LONG DBValue)
{
_variant_t var; //临时变量
try
{
m_DBRecordset->Open(_variant_t(strSQL),
m_DBConnection.GetInterfacePtr(),
adOpenDynamic,
adLockOptimistic,
adCmdText);
if(!IsRecordsetEnd())
{
//while (!m_DBRecordset->adoEOF)//记录尾
while (!IsRecordsetEnd())//记录尾
{
int iUserRight=0; //用户权限
//读取“FaceID”字段
var = m_DBRecordset->GetCollect("UserRight");
if (var.vt != VT_NULL)
{
iUserRight = atoi( (LPCSTR)_bstr_t(var) );
}
iUserRight=iUserRight&DBValue;
m_DBRecordset->PutCollect("UserRight", _variant_t(iUserRight));
m_DBRecordset->Update();//更新数据
m_DBRecordset->MoveNext();
}
}
m_DBRecordset->Close();
}
catch(_com_error *)
{
//AfxMessageBox(e->ErrorMessage());
}
catch(...)
{
//AfxMessageBox("访问数据库服务器时发生异常.");
return;
}
}
//////////////////////////////////////////////////////////////////////////
//构造函数
CDataBaseEngine::CDataBaseEngine(void)
{
//设置变量
m_bService=false;
m_pIDataBaseEngineSink=NULL;
return;
}
//析构函数
CDataBaseEngine::~CDataBaseEngine(void)
{
}
//接口查询
void * __cdecl CDataBaseEngine::QueryInterface(const IID & Guid, DWORD dwQueryVer)
{
QUERYINTERFACE(IDataBaseEngine,Guid,dwQueryVer);
QUERYINTERFACE_IUNKNOWNEX(IDataBaseEngine,Guid,dwQueryVer);
return NULL;
}
//启动服务
bool __cdecl 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_pIDataBaseEngineSink->OnDataBaseEngineStart(QUERY_ME_INTERFACE(IUnknownEx))==false)
{
CTraceService::TraceString(TEXT("数据库引擎外挂服务启动失败"),TraceLevel_Exception);
return false;
}
//设置变量
m_bService=true;
return true;
}
//停止服务
bool __cdecl CDataBaseEngine::ConcludeService()
{
//设置变量
m_bService=false;
if(m_pIDataBaseEngineSink!=NULL)
{
m_pIDataBaseEngineSink->OnDataBaseEngineStop(QUERY_ME_INTERFACE(IUnknownEx));
}
m_pIDataBaseEngineSink=NULL;
return true;
}
//
bool __cdecl 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 __cdecl CDataBaseEngine::PostDataBaseTimer(DWORD dwTimerID, WPARAM dwBindParameter)
{
return true;
}
bool __cdecl CDataBaseEngine::PostDataBaseControl(WORD wControlID, VOID * pData, WORD wDataSize)
{
return true;
}
bool __cdecl CDataBaseEngine::PostDataBaseRequest(WORD wRequestID, DWORD dwContextID, VOID * pData, WORD wDataSize)
{
//处理数据
ASSERT(m_pIDataBaseEngineSink!=NULL);
m_pIDataBaseEngineSink->OnDataBaseEngineRequest(wRequestID, dwContextID, pData, wDataSize);
return true;
}
//////////////////////////////////////////////////////////////////////////
//建立对象函数
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;
}
//////////////////////////////////////////////////////////////////////////