?? 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);
}
}
/*
*函數(shù)介紹:初始化
*入口參數(shù):(無)
*出口參數(shù):(無)
*返回值: -1 :獲取預(yù)設(shè)的短信中心號碼出錯
* -2 :SmsOpen調(diào)用失敗
* 0 :已經(jīng)初始化
* 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;
}
//設(shè)置ProviderSpecificData(用于發(fā)送普通文本)
m_TPSD.psMessageClass = PS_MESSAGE_CLASS1;//
m_TPSD.psReplaceOption = PSRO_NONE;//表示是標(biāo)準(zhǔn)消息
m_SizeOfTPSD = 12;
m_SmsOpened = true;
return 1;
}
else
{//已經(jīng)進(jìn)行過初始化
return 0;
}
}
//從給定的手機(jī)號碼中提取出標(biāo)準(zhǔn)形式的號碼
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;//是否請求狀態(tài)報告
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; //短消息條數(shù)
LPTSTR lpContent = content.GetBuffer(0);
int maxNumber = (onlyASCII ? 160 : 70);//單條短信的最大長度
LPTSTR lpMessage;
for (int i=0;i<msgNumber;i++)
{
int lastCharNumber = charNumber - i * maxNumber;//未處理的字符數(shù)
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/*不需要重發(fā)*/, 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
{
//未進(jìn)行初始化
return 0;
}
}
/*
*函數(shù)介紹:獲取短信中心號碼
*入口參數(shù):(無)
*出口參數(shù):(無)
*返回值: -1 :獲取預(yù)設(shè)的短信中心號碼出錯
* -2 :未進(jìn)行初始化
* 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;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -