📄 smservice.cpp
字号:
/////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "SMService.h"
#include "XTTBasicDef.h"
//事件实现接口建立连接的Cookie
DWORD g_dwCookie=0;
//事件实现接口
CComObject<CMobileEvents>* g_ptrMobileEvents=NULL;
//手机短信服务接口
XTTSMSCOM::IModemServicePtr g_spiModemService=NULL;
/////////////////////////////////////////////////////////////////////////////
// CMobileEvents
STDMETHODIMP CMobileEvents::Invoke( DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,
DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr)
{
HRESULT hRet(S_OK);
switch( dispIdMember )
{
case 0x1:
if ( pDispParams->cArgs != 1 )
return DISP_E_BADPARAMCOUNT;
if ( pDispParams->cNamedArgs )
return DISP_E_NONAMEDARGS;
VARIANTARG varDeviceStatus;
VariantInit(&varDeviceStatus);
hRet = VariantChangeTypeEx( &varDeviceStatus,&(pDispParams->rgvarg[0]),lcid,0,VT_I2);
if FAILED(hRet)
return DISP_E_BADVARTYPE;
hRet=ConnectResult((XTTSMSCOM::EMobileModemStatus)varDeviceStatus.iVal);
break;
case 0x2:
if ( pDispParams->cArgs != 5 )
return DISP_E_BADPARAMCOUNT;
if ( pDispParams->cNamedArgs )
return DISP_E_NONAMEDARGS;
VARIANTARG varMsgType,varPosIndex,varMobileFrom,varMsgContent,varArrivedTime;
VariantInit(&varMsgType);
VariantInit(&varPosIndex);
VariantInit(&varMobileFrom);
VariantInit(&varMsgContent);
VariantInit(&varArrivedTime);
hRet = VariantChangeTypeEx( &varMsgType,&(pDispParams->rgvarg[4]),lcid,0,VT_I2);
if FAILED(hRet)
return DISP_E_BADVARTYPE;
hRet = VariantChangeTypeEx( &varPosIndex,&(pDispParams->rgvarg[3]),lcid,0,VT_I2);
if FAILED(hRet)
return DISP_E_BADVARTYPE;
hRet = VariantChangeTypeEx( &varMobileFrom,&(pDispParams->rgvarg[2]),lcid,0,VT_BSTR);
if FAILED(hRet)
return DISP_E_BADVARTYPE;
hRet = VariantChangeTypeEx( &varMsgContent,&(pDispParams->rgvarg[1]),lcid,0,VT_BSTR);
if FAILED(hRet)
return DISP_E_BADVARTYPE;
hRet = VariantChangeTypeEx( &varArrivedTime,&(pDispParams->rgvarg[0]),lcid,0,VT_DATE);
if FAILED(hRet)
return DISP_E_BADVARTYPE;
hRet=ReceivedMsg((XTTSMSCOM::EMobileMsgType)varMsgType.iVal,varPosIndex.iVal,varMobileFrom.bstrVal,varMsgContent.bstrVal,varArrivedTime.date);
break;
case 0x3:
if ( pDispParams->cArgs != 1 )
return DISP_E_BADPARAMCOUNT;
if ( pDispParams->cNamedArgs )
return DISP_E_NONAMEDARGS;
VARIANTARG varCallNumber;
VariantInit(&varCallNumber);
hRet = VariantChangeTypeEx( &varCallNumber,&(pDispParams->rgvarg[0]),lcid,0,VT_BSTR);
if FAILED(hRet)
return DISP_E_BADVARTYPE;
hRet=ReceivedCall(varCallNumber.bstrVal);
break;
case 0xb:
if ( pDispParams->cArgs != 6 )
return DISP_E_BADPARAMCOUNT;
if ( pDispParams->cNamedArgs )
return DISP_E_NONAMEDARGS;
VARIANTARG varMsgID,varDestNumber,varContent,varMsgStatus,varStatusTime,varNumber;
VariantInit(&varMsgID);
VariantInit(&varDestNumber);
VariantInit(&varContent);
VariantInit(&varMsgStatus);
VariantInit(&varStatusTime);
VariantInit(&varNumber);
hRet = VariantChangeTypeEx( &varMsgID,&(pDispParams->rgvarg[5]),lcid,0,VT_BSTR);
if FAILED(hRet)
return DISP_E_BADVARTYPE;
hRet = VariantChangeTypeEx( &varDestNumber,&(pDispParams->rgvarg[4]),lcid,0,VT_BSTR);
if FAILED(hRet)
return DISP_E_BADVARTYPE;
hRet = VariantChangeTypeEx( &varContent,&(pDispParams->rgvarg[3]),lcid,0,VT_BSTR);
if FAILED(hRet)
return DISP_E_BADVARTYPE;
hRet = VariantChangeTypeEx( &varNumber,&(pDispParams->rgvarg[2]),lcid,0,VT_I2);
if FAILED(hRet)
return DISP_E_BADVARTYPE;
hRet = VariantChangeTypeEx( &varMsgStatus,&(pDispParams->rgvarg[1]),lcid,0,VT_I2);
if FAILED(hRet)
return DISP_E_BADVARTYPE;
hRet = VariantChangeTypeEx( &varStatusTime,&(pDispParams->rgvarg[0]),lcid,0,VT_DATE);
if FAILED(hRet)
return DISP_E_BADVARTYPE;
hRet=SendReturnStatus(varMsgID.bstrVal,varDestNumber.bstrVal,varContent.bstrVal,varNumber.iVal,(XTTSMSCOM::EMobileMsgStatus )varMsgStatus.iVal,varStatusTime.date);
break;
case 0x15:
if ( pDispParams->cArgs != 0 )
return DISP_E_BADPARAMCOUNT;
if ( pDispParams->cNamedArgs )
return DISP_E_NONAMEDARGS;
hRet=SimCardNoMemory();
break;
case 0x16:
if ( pDispParams->cArgs != 0 )
return DISP_E_BADPARAMCOUNT;
if ( pDispParams->cNamedArgs )
return DISP_E_NONAMEDARGS;
hRet=SimCardNoMoney();
break;
case 0x3d:
if ( pDispParams->cArgs != 1 )
return DISP_E_BADPARAMCOUNT;
if ( pDispParams->cNamedArgs )
return DISP_E_NONAMEDARGS;
VARIANTARG varExceptionType;
VariantInit(&varExceptionType);
hRet = VariantChangeTypeEx( &varExceptionType,&(pDispParams->rgvarg[0]),lcid,0,VT_I2);
if FAILED(hRet)
return DISP_E_BADVARTYPE;
hRet=MobileException((XTTSMSCOM::EMobileExceptionType)varExceptionType.iVal);
break;
default:
break;
}
return hRet;
}
/*@
函数名称: ReceivedMsg
函数说明: 实现收到新消息事件处理
参数说明:
返回值:
*/
STDMETHODIMP CMobileEvents::ReceivedMsg(XTTSMSCOM::EMobileMsgType eMsgType,short sSimPosition,BSTR bstrFromNumber,BSTR bstrContent,DATE dtSentTime)
{
// TODO: Add your implementation code here
HRESULT hRet(S_OK);
COleDateTime RecTime(dtSentTime);
CString strInfo(_T("")),strFromNumber=bstrFromNumber,strContent=bstrContent;
strInfo.Format(_T("收到来自 %s 类型为 %d 内容为 %s 的短信,收到时间为 %d月%d日 %d时%d分%d秒 ,保存在SIM卡的位置是 %d"),strFromNumber,eMsgType,strContent,RecTime.GetMonth(),RecTime.GetDay(),RecTime.GetHour(),RecTime.GetMinute(),RecTime.GetSecond(),sSimPosition);
::MessageBox(NULL,strInfo,XTTSOFT_SMS_APPNAME,MB_OK);
strInfo.Empty();
return hRet;
}
/*@
函数名称: ReceivedCall
函数说明: 实现有电话拨入事件处理
参数说明:
返回值:
*/
STDMETHODIMP CMobileEvents::ReceivedCall(BSTR bstrFromNumber)
{
// TODO: Add your implementation code here
HRESULT hRet(S_OK);
CString strInfo(_T("")),strCallNumber=bstrFromNumber;
strInfo.Format(_T("有来自 %s 的电话拨入"),strCallNumber);
::MessageBox(NULL,strInfo,XTTSOFT_SMS_APPNAME,MB_OK);
strInfo.Empty();
return hRet;
}
/*@
函数名称: ConnectResult
函数说明: 实现连接手机设备返回事件处理
参数说明:
返回值:
*/
STDMETHODIMP CMobileEvents::ConnectResult(XTTSMSCOM::EMobileModemStatus eModemStatus)
{
// TODO: Add your implementation code here
HRESULT hRet(S_OK);
CString strInfo(_T(""));
if(eModemStatus<XTTSMSCOM::OK_STATUS)
{
if(g_spiModemService!=NULL)
{
CComVariant varErrDes;
XTTSMSCOM::EMobileErrorType eErrType=XTTSMSCOM::OK_ERRTYPE;
g_spiModemService->GetLastError(&varErrDes,&eErrType);//得到错误信息
CString strErrInfo(_T(""));
if(varErrDes.vt==VT_BSTR && varErrDes.bstrVal!=NULL)
strErrInfo.Format(_T("连接设备失败!错误码为%d,错误信息为 %s"),eErrType,(CString )varErrDes.bstrVal);
else
strErrInfo=_T("连接设备失败!");
::MessageBox(NULL,strErrInfo,XTTSOFT_SMS_APPNAME,MB_OK);
}
}
else
::MessageBox(NULL,_T("连接设备成功!"),XTTSOFT_SMS_APPNAME,MB_OK);
return hRet;
}
/*@
函数名称: SendReturnStatus
函数说明: 实现消息发送后结果返回事件处理
参数说明:
返回值:
*/
STDMETHODIMP CMobileEvents::SendReturnStatus(BSTR bstrMsgID,BSTR bstrDestNumber,BSTR bstrContent,
short sSplitIndex,XTTSMSCOM::EMobileMsgStatus eMsgStatus,DATE dtStatusTime)
{
// TODO: Add your implementation code here
HRESULT hRet(S_OK);
//查询发送记录
if(eMsgStatus==XTTSMSCOM::SENTOK_MSGSTATUS)
{
COleDateTime StatusTime(dtStatusTime);
CString strMsgID=bstrMsgID,strInfo(_T("")),strContent=bstrContent;
strInfo.Format(_T("短信 %s 发送结果通知:%d,目标:%s 时间为:%d月%d日 %d时%d分%d秒,拆分序号为:%d"),strContent,eMsgStatus,(CString )bstrDestNumber,StatusTime.GetMonth(),StatusTime.GetDay(),StatusTime.GetHour(),StatusTime.GetMinute(),StatusTime.GetSecond(),sSplitIndex);
::MessageBox(NULL,strInfo,XTTSOFT_SMS_APPNAME,MB_OK);
strInfo.Empty();
}
else
{
CComVariant varErrDes;
XTTSMSCOM::EMobileErrorType eErrType=XTTSMSCOM::OK_ERRTYPE;
g_spiModemService->GetLastError(&varErrDes,&eErrType);//得到错误信息
CString strErrInfo(_T(""));
if(varErrDes.vt==VT_BSTR && varErrDes.bstrVal!=NULL)
strErrInfo.Format(_T("发送失败!错误码为%d,错误信息为 %s"),eErrType,(CString )varErrDes.bstrVal);
else
strErrInfo=_T("发送失败!");
::MessageBox(NULL,strErrInfo,XTTSOFT_SMS_APPNAME,MB_OK);
}
return hRet;
}
/*@
函数名称: SimCardNoMemory
函数说明: 实现SIM卡存储空间满时事件处理
参数说明:
返回值:
*/
STDMETHODIMP CMobileEvents::SimCardNoMemory()
{
// TODO: Add your implementation code here
HRESULT hRet(S_OK);
::MessageBox(NULL,_T("注意!SIM卡存储空间已经用完,请及时删除短信以接收新的消息"),XTTSOFT_SMS_APPNAME,MB_OK);
return hRet;
}
/*@
函数名称: SimCardNoMoney
函数说明: 实现SIM卡没有可用资金来发送消息事件处理
参数说明:
返回值:
*/
STDMETHODIMP CMobileEvents::SimCardNoMoney()
{
// TODO: Add your implementation code here
HRESULT hRet(S_OK);
::MessageBox(NULL,_T("注意!SIM卡已经欠费,无法再发送短信!"),XTTSOFT_SMS_APPNAME,MB_OK);
return hRet;
}
/*@
函数名称: MobileException
函数说明: 实现手机模块产生异常事件处理
参数说明:
返回值:
*/
STDMETHODIMP CMobileEvents::MobileException(XTTSMSCOM::EMobileExceptionType eExceptionType)
{
// TODO: Add your implementation code here
HRESULT hRet(S_OK);
CString strInfo(_T(""));
strInfo.Format(_T("手机设备产生异常:%d "),eExceptionType);
::MessageBox(NULL,strInfo,XTTSOFT_SMS_APPNAME,MB_OK);
strInfo.Empty();
return hRet;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -