⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smservice.cpp

📁 wavecom 短信猫开发示例 二次开发包
💻 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 + -