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

📄 mysms.cpp

📁 利用C++程序实现掌上电脑发送信息的功能(已经测试成功)希望得到一个C#.net的信息发送程序
💻 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 + -