📄 mysms.cpp
字号:
#include "StdAfx.h"
#include "MySms.h"
#ifdef DEBUG
struct //错误码
{
HRESULT hr;
TCHAR szText[255];
}ReturnErrorCode [] =
{
SMS_E_INVALIDPROTOCOL, _T("S_E_INVALIDPROTOCOL"),
SMS_E_REGISTRATIONEXISTS, _T("SMS_E_REGISTRATIONEXISTS"),
SMS_S_NOSUCHREGISTRATION, _T("SMS_S_NOSUCHREGISTRATION"),
SMS_E_TOOMUCHDATA, _T("SMS_E_TOOMUCHDATA"),
SMS_E_INVALIDDATA, _T("SMS_E_INVALIDDATA"),
SMS_E_BUFFERTOOSMALL, _T("SMS_E_BUFFERTOOSMALL"),
SMS_E_PROVIDERSPECIFICBUFFERWRONGSIZE, _T("SMS_E_PROVIDERSPECIFICBUFFERWRONGSIZE"),
SMS_E_TIMEUNAVAILABLE, _T("SMS_E_TIMEUNAVAILABLE"),
SMS_E_UNKNOWNSCADDRESS, _T("SMS_E_UNKNOWNSCADDRESS"),
SMS_E_RECEIVEHANDLEALREADYOPEN, _T("SMS_E_RECEIVEHANDLEALREADYOPEN"),
SMS_E_DESTINATIONOUTOFSVC, _T("SMS_E_DESTINATIONOUTOFSVC"),
SMS_E_INVALIDADDRESS, _T("SMS_E_INVALIDADDRESS"),
SMS_E_MSGBARREDBYOPERATOR, _T("SMS_E_MSGBARREDBYOPERATOR"),
SMS_E_MSGCALLBARRED, _T("SMS_E_MSGCALLBARRED"),
SMS_E_NOSCSUBSCRIPTION, _T("SMS_E_NOSCSUBSCRIPTION"),
SMS_E_SCBUSY, _T("SMS_E_SCBUSY"),
SMS_E_SVCNOTSUBSCRIBED, _T("SMS_E_SVCNOTSUBSCRIBED"),
SMS_E_UNASSIGNEDNUMBER, _T("SMS_E_UNASSIGNEDNUMBER"),
SMS_E_UNIDENTIFIEDSUBCRIBER, _T("SMS_E_UNIDENTIFIEDSUBCRIBER"),
};
#endif
CSMS::CSMS(void)
{
m_SmsOpened = false;
}
CSMS::~CSMS(void)
{
if (m_SmsOpened)
{
SmsClose (m_SmsHandle);
}
}
/*
*函数介绍:初始化
*入口参数:(无)
*出口参数:(无)
*返回值: -1 :获取预设的短信中心号码出错
* -2 :SmsOpen调用失败
* 0 :已经初始化
* 1 :初始化成功
*/
int CSMS::Init()
{
if (!m_SmsOpened)
{
HRESULT hr;
ZeroMemory(&m_SmsCenter, sizeof (m_SmsCenter));
hr = SmsGetSMSC(&m_SmsCenter);
if (hr != ERROR_SUCCESS)
{
return -1;
}
// try to open an SMS Handle
hr = SmsOpen(SMS_MSGTYPE_TEXT, SMS_MODE_SEND, &m_SmsHandle, NULL);
//打开失败
if (hr != ERROR_SUCCESS)
{
return -2;
}
//设置ProviderSpecificData(用于发送普通文本)
m_TPSD.psMessageClass = PS_MESSAGE_CLASS1;//
m_TPSD.psReplaceOption = PSRO_NONE;//表示是标准消息
m_SizeOfTPSD = 12;
m_SmsOpened = true;
return 1;
}
else
{//已经进行过初始化
return 0;
}
}
//从给定的手机号码中提取出标准形式的号码
bool CSMS::GetStandardCode(CString & originalCode, CString & standardCode)
{
int iStart = originalCode.Find(_T("13"));
if (iStart == -1)
{
return false;
}
standardCode.Empty();
standardCode = originalCode.Mid(iStart, 11);
if (standardCode.GetLength() != 11)
{
return false;
}
standardCode.Insert(0, _T("86"));
return true;
}
int CSMS::Send(CString destCode, CString content, bool onlyASCII, bool statusReport /*=false*/)
{
if (m_SmsOpened)
{
m_TPSD.dwMessageOptions = statusReport ? PS_MESSAGE_OPTION_STATUSREPORT : PS_MESSAGE_OPTION_NONE;//是否请求状态报告
ZeroMemory(&m_SmsDestination, sizeof (m_SmsDestination));
m_SmsDestination.smsatAddressType = SMSAT_INTERNATIONAL;
CString destStandardCode;
GetStandardCode(destCode, destStandardCode);
lstrcpy(m_SmsDestination.ptsAddress, (LPCTSTR)destStandardCode);//短信号码写为+8613588881696,8613588881696都可以,不能写成13522331696
HRESULT hr;
int charNumber = content.GetLength();
int msgNumber = onlyASCII ? charNumber/160 +1 : charNumber/70 + 1; //短消息条数
LPTSTR lpContent = content.GetBuffer(0);
int maxNumber = (onlyASCII ? 160 : 70);//单条短信的最大长度
LPTSTR lpMessage;
for (int i=0;i<msgNumber;i++)
{
int lastCharNumber = charNumber - i * maxNumber;//未处理的字符数
int length = 0;//本次要处理的长度
if ( lastCharNumber < maxNumber )
{
length = lastCharNumber * sizeof(TCHAR);
}
else
{
length = maxNumber * sizeof(TCHAR);
}
lpMessage = lpContent + maxNumber * i ;
hr = SmsSendMessage(m_SmsHandle, NULL, &m_SmsDestination, NULL,
(PBYTE) lpMessage, length,
(PBYTE) &m_TPSD, m_SizeOfTPSD, SMSDE_OPTIMAL,/*短信编码方式*/
SMS_OPTION_DELIVERY_NONE/*不需要重发*/, NULL);
if (hr != ERROR_SUCCESS)
{
#ifdef DEBUG //错误诊断
for (int i=0;i<(int)(sizeof ReturnErrorCode / sizeof ReturnErrorCode[0]); i++ )
{
if (ReturnErrorCode[i].hr == hr)
{
AfxMessageBox(ReturnErrorCode[i].szText);
break;
}
}
#endif
//return -1;
}
}
return 1;
}
else
{
//未进行初始化
return 0;
}
}
/*
*函数介绍:获取短信中心号码
*入口参数:(无)
*出口参数:(无)
*返回值: -1 :获取预设的短信中心号码出错
* -2 :未进行初始化
* 1 :成功
*/
int CSMS::GetCenterCode(CString & centerCode)
{
if (m_SmsOpened)
{
centerCode.Empty();
CString temp;
temp.Format(_T("%s"), m_SmsCenter.ptsAddress);
int iStart = temp.Find(_T("13"));
centerCode = temp.Mid(iStart,11);
if (centerCode.GetLength() != 11)
{
centerCode.Empty();
return -1;
}
return 1;
}
else
{
return -2;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -