基于MFC与阿里云制作简易发送短信

在这里插入图片描述***~~

做到最后可能会只是不能识别汉字,但是能识别英文和数字,有待改进的地方`

`

~~ ***

# 详细步骤见如下

一. 新建一个MFC项目:打开VS2013,文件->新建->项目

在这里插入图片描述
这里选择“基于对话框”
在这里插入图片描述
二. 在工具箱下添加如下控件

在这里插入图片描述

三. 双击”打开文件“,进入。cpp代码编写页面,填入以下代码:

在这里插入图片描述

Book* book = xlCreateXMLBook();
	if (!book)
	{
		MessageBox(L"failed1");
		return;
	}
	book->load(L"Data2.xlsx");
	if (!book->load(L"Data2.xlsx"))
	{
		MessageBox(L"failed2");
		return;
	}
	Sheet* sheet = book->getSheet(0);
	if (!sheet)
	{
		MessageBox(L"failed3");
		return;
	}
	int rowfirst = sheet->firstRow();
	int rowlast = sheet->lastRow();
	int colfirst = sheet->firstCol();
	int collast = sheet->lastCol();
	for (int i = rowfirst + 1; i < rowlast; ++i)
	{
		CString serial = sheet->readStr(i, 0);
		//CString address = sheet->readNum(i, 1);
		double number = sheet->readNum(i, 1);
		CString ttt;
		ttt.Format(L"%.0lf", number);
		CString project = sheet->readStr(i, 2);
		CString time = sheet->readStr(i, 3);
		CString gread = sheet->readStr(i, 4);
		CString address = sheet->readStr(i, 5);
		mList1.InsertItem(i - 1, serial);//开辟一个行,并且设置行的内容为i的内容
		mList1.SetItemText(i - 1, 1, ttt);//i代指在第几行插入数据,第二个参数代指第几列,第三个参数代指插入数据的值
		mList1.SetItemText(i - 1, 2, project);
		mList1.SetItemText(i - 1, 3, time);
		mList1.SetItemText(i - 1, 4, gread);
		mList1.SetItemText(i - 1, 5, address);
		//mList1.SetItemText(i, 1, number);
	}

其中的” Data2.xlsx “文件格式事先我已经将格式做好,将该文件放入项目文件下

在这里插入图片描述

四. 接下来用libxl.lib库读取excel文件

工程的配置
1、把include_cpp复制到工程文件夹下,设置包含目录

2、把libxl.lib复制到工程文件夹下,附加依赖项:libxl.lib

3、把libxl.dll复制到Debug下

Dlg.cpp下补充头文件与命名空间

#include "libxl.h"
#include <iostream>
using namespace libxl;

Dlg.cpp下主要代码:

const TCHAR* ReadDataToWChar(Sheet* sheet, int row,int col)
{
    CellType type = sheet->cellType(row,col);
    TCHAR buff[1024];
    switch (type)
    {
    case 1://Num
        {
            swprintf_s(buff,1024,_T("%.2lf"),sheet->readNum(row,col));
            return buff;
        }
    case 2://Str
        {
            return sheet->readStr(row,col);
        }
    default:
        {
            return _T("读取错误!");
        }
    }
} 
void CExcelTestDlg::OnBnClickedButton1()
{
    //初始化
    Book* book = xlCreateBook();	
    //if(!book) return -1;
    //book->load("00.xls");	//直接读的方式 
    //创建两个表,一个为“测试写”,一个为“测试读”
    Sheet* sheet = book->addSheet(_T("测试写"));
    Sheet* sheet1 = book->addSheet(_T("测试读"));
    //sheet = book->getSheet(0); 
    //创建出错返回
    //if(!sheet || !sheet1) return -2; 
    ///设置格式//
    //设置字体
    //libxl::Font* font = book->addFont();
    //font->setName(_T("0"));
    //font->setSize(20);
    //font->setColor(COLOR_DARKBLUE);
    //font->setItalic(); 
    //设置样式
    Format* StrFormat = book->addFormat();
    //StrFormat->setAlignH(ALIGNH_LEFT);
    //StrFormat->setBorder(BORDERSTYLE_MEDIUMDASHDOTDOT);
    //StrFormat->setBorderColor(COLOR_RED);
    //StrFormat->setFont(font); 
    Format* dateFormat = book->addFormat();
    //dateFormat->setNumFormat(NUMFORMAT_DATE); 
    Format* NumFormat = book->addFormat();
    //NumFormat->setNumFormat(NUMFORMAT_NUMBER); 
    //Format* NumFormat1 = book->addFormat();
    //NumFormat1->setNumFormat(NUMFORMAT_NUMBER_D2);
    /你提出的要求的测试代码/
    //读EDIT写入EXCEL
    CString str;
    GetDlgItemText(IDC_WRITE, str);//得到字符串
    sheet->writeStr(0, 0, str, StrFormat);//0行0列
    //读EXCEL写入EDIT
    CString str2;
    str2 = ReadDataToWChar(sheet,0,0);//0行0列
    SetDlgItemText(IDC_READ, str2);
    /你提出的要求的测试代码/
   //以下为自由发挥部分
    ///写数据///	
    sheet->writeStr(2, 0, _T("Hello, World !"),StrFormat);
    sheet->writeNum(4, 0, 1000,NumFormat);
    //sheet->writeNum(5, 0, 20.98,NumFormat1);
    sheet->writeFormula(6, 0, _T("SUM(A5:A6)"));
    sheet->writeNum(8, 0, book->datePack(2012, 05, 17), dateFormat);
    //循环写
    for (int i = 0;i < 200;i++)
    {
        sheet->writeStr(i, 2, _T("Hello, World !"),StrFormat);
        sheet->writeNum(i, 3, i);
    } 
    ///读数据///	
    for (int i = 0;i < 200;i++)
    {
        sheet1->writeStr(i, 0,ReadDataToWChar(sheet,i,2));
        sheet1->writeStr(i, 3,ReadDataToWChar(sheet,i,3));
 
        sheet1->setCellFormat(i,3,StrFormat);
    }
    ///保存///	
    if(book->save(_T("00.xls"))) 
    {
       // ::ShellExecute(NULL, _T("open"), _T("00.xls"), NULL, NULL, SW_SHOW);   
    }
    else
    {
        std::cout << book->errorMessage() << std::endl;
    }
    book->release();
}

我当时是参考的这片文章,可以去看一下【mfc】excel读写——libxl.lib库

进行完上一步后,我们可以先打开文件看看效果
在这里插入图片描述
可以打开

五. ” 全选 “按键代码

在这里插入图片描述

 // TODO:  在此添加控件通知处理程序代码
	for (int i = 0; i < mList1.GetItemCount(); i++)
	{
		if (mList1.GetCheck(i) == FALSE)  //未被选中的
		{
			mList1.SetCheck(i, TRUE);
		}
		else  //选中的
		{
			mList1.SetCheck(i, FALSE);
		}
	}

六. 接下来就就最好去找一个服务器可以发短信,这里用的是阿里云的

 经过操作,最主要的就是拿到 短信签名signName、模板**templateCode、accessKeyId、accessKeySecret。为后续的代码准备**

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

七. 在阿里云注册好账号有了ID后就接下来的操作:Windows下 VS2013编译,配置C/C++ libcurl开发环境

具体步骤可以参考这篇文章:Windows下 VS2013编译,配置C/C++libcurl开发环境

编译配置环境:

IDE:Visual Studio 2013
Env:Win 10
libcurl_version:curl 7.64.0
官网下载地址:https://curl.haxx.se/download.html

八. 构建libcurl静态库 (这里编译x64的release版本)

1,下载libcurl源码包,这里使用最新版本。
在这里插入图片描述

下载到本地解压后,留意红色框选的winbuild目录:

2,打开命令提示符

“开始”菜单——>Visual Studio 2013——>Visual Studio Tools——>VS2013 开发人员命令提示。
在这里插入图片描述

打开如下窗口(本机64位,这里选择红色框选快捷命令):

3,编译libcurl库
命令窗口切换到刚刚解压的源码文件夹的winbuild目录下
在这里插入图片描述在这里插入图片描述

命令解析:
  nmake是MS的编译工具
  /f 参数描述文件名不使用默认的makefile
  Makefile.vc 是winbuild里的makefile文件
  mode=static 编译静态链接库
  vc=12 是VC++版本号MACHINE=64,64位lib库DEBUG=no,是否是debug版本(这里是release版本)。更多详细命令参数,参考winbuild文件夹中的BUILD.WINDOWS.txt查看。

回车,等待编译完成,关闭命令行界面。此时会在curl根目录下,生成一个builds文件夹:
在这里插入图片描述
打开builds文件夹,其中libcurl-vc12-x64-release-static-ipv6-sspi-winssl 文件夹包含了我们需要的运行库和头文件(可将该目录拷贝至其他位置,若方便后续使用)。
在这里插入图片描述

***这一步可做可不做***
> 打开builds文件夹,其中libcurl-vc12-x64-release-static-ipv6-sspi-winssl
>        文件夹包含了我们需要的运行库和头文件(可将该目录拷贝至其他位置,若方便后续使用)。

九. 在Visual Studio中链接libcurl

1,在Visual Studio中,右键单击解决方案资源管理器中的项目,然后单击“属性”。
在这里插入图片描述
2,配置属性> C / C ++>常规>其他包含目录:添加F:\curl-7.64.0\builds\libcurl-vc12-x64-release-static-ipv6-sspi-winssl\include。
在这里插入图片描述
3,配置属性>链接器>常规>其他库目录:添加F:\curl-7.64.0\builds\libcurl-vc12-x64-release-static-ipv6-sspi-winssl\lib
在这里插入图片描述
将以下lib添加至工程!
libcurl_a.lib;Ws2_32.lib;Wldap32.lib;winmm.lib;Crypt32.lib;Normaliz.lib;在这里插入图片描述
使用了静态编译libcurl,所以需要将CURL_STATICLIB预编译添加至工程。
在这里插入图片描述
如果没有编译debug版libcurl,则需要将“Runtime Library”改为Release版(即后面不带小写字母d)。同时官方并不建议使用“/MT”或“/MTd”。
在这里插入图片描述
注意此处设置修改为和上述设置一致。
在这里插入图片描述

十. 项目中调用libcurl
在这里插入图片描述
代码如下:

// ConsoleApplication3.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <stdio.h>
#include <curl.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>

//#include<stdafx.h>
#define bzero(a, b)             memset(a, 0, b)
#pragma warning(disable:4996)
#define MAXPARAM 2048

CURL* curl;
CURLcode res;
/**
bingone
本样例依赖libcurl库
下载地址 https://curl.haxx.se/download.html
**/

// 修改为您的apikey(https://www.yunpian.com)登录官网后获取
char* apikey = "你自己的apikey";
// 修改为您要发送的手机号
char* mobile = "159570";
// 设置您要发送的内容
char* text = "您的验证码是1234";
// 指定发送的模板id
int tpl_id = 3569052;
// 指定发送模板内容

char* tpl_data[4] = { "#name#", "www", "#code#", "444" };

// 发送语音验证码内容
int code = 1234;
// 获取user信息url
char* url_get_user = "你自己的url";
// 智能模板发送短信url
// 指定模板发送短信url
char* url_tpl_sms = "你自己的url";
// 发送语音验证码短信url
// ar * url_send_voice = "你自己的url";

void send_data(char* url, char* data)
{
	// specify the url
	curl_easy_setopt(curl, CURLOPT_URL, url);
	// specify the POST data
	curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);
	// get response data
	curl_easy_perform(curl);
	printf("\n\n");
}

/**
* 指定模板单发
*/
void send_tpl_sms(char* apikey, char* mobile, int tpl_id, char* tpl_value)
{
	char params[MAXPARAM + 1];
	char* cp = params;
	sprintf(params, "apikey=%s&mobile=%s&tpl_id=%d&tpl_value=%s", apikey, mobile,
		tpl_id, tpl_value);
	send_data(url_tpl_sms, params);
}

int main(void)
{

	curl = curl_easy_init();
	mobile = curl_easy_escape(curl, mobile, strlen(mobile));
	if (NULL == curl) {
		perror("curl open fail\n");
	}
	// 获取用户信息
	//get_user(apikey);

	// 发送语音验证码
	// nd_voice(apikey, mobile, code);
	char* tmp;
	char* tpl_value = (char*)malloc(sizeof(char) * 500);
	bzero(tpl_value, sizeof(char) * 500);
	
	// 模板短信发送需要编码两次,第一次URL编码转换
	int len = 0;
	tmp = curl_easy_escape(curl, tpl_data[0], strlen(tpl_data[0]));
	memcpy(tpl_value + len, tmp, strlen(tmp));
	len += strlen(tmp);
	tpl_value[len++] = '=';
	tmp = curl_easy_escape(curl, tpl_data[1], strlen(tpl_data[1]));
	memcpy(tpl_value + len, tmp, strlen(tmp));
	len += strlen(tmp);
	tpl_value[len++] = '&';
	tmp = curl_easy_escape(curl, tpl_data[2], strlen(tpl_data[2]));
	memcpy(tpl_value + len, tmp, strlen(tmp));
	len += strlen(tmp);
	tpl_value[len++] = '=';
	tmp = curl_easy_escape(curl, tpl_data[3], strlen(tpl_data[3]));
	memcpy(tpl_value + len, tmp, strlen(tmp));
	len += strlen(tmp);
	tmp = tpl_value;
	// 第二次URL编码
	tpl_value = curl_easy_escape(curl, tpl_value, strlen(tpl_value));
	send_tpl_sms(apikey, mobile, tpl_id, tpl_value);
	free(tmp);
	curl_easy_cleanup(curl);
	return 0;
}

之前让注册阿里云短信发送服务时所获得的密钥与URL 在这里便可以用到
在这里插入图片描述
在这里插入图片描述

将代码运行一遍便可以接受到短信了,但是现在属于用C++控制套程序发送短信,并没有用到MFC的” 发送短信“按键,还待后续继续完善
这里推荐一个关于MFC与云片程序相结合的网站,写的很全----云片
在这里插入图片描述

  • 0
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白舟的博客

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值