用MFC实现的飞信给好友发送短信接口

    这段时间,我在学习vc。以前一直是在用C#和Java的,最近发现MFC还是有一定的用处的,所以就利用暑假这段时间来学习一下。但是光看书没有用,几个月之前,我用C#实现了一个飞信发短信的接口。所以这次,以学习MFC为目的,写了一个MFC版的飞信发短信接口。开发工具用的是Visual studio 2005。
    其中用到了MFC中的众多功能,如Socket、CString类的使用、Winnet、加密(hash)、ATl提供的正则表达式库和调用Dom解析xml等等。最后,我将该接口做成了一个MFC dll,从而也学习了MFC dll的制作和使用。编译的时候采用默认的Unicode编码。另外,其中还涉及到编码的转换等等。在处理字符串的时候基本都用CString,不知道这种习惯好不好。
    接口中只提供一个CFetion类,其中提供3个函数,功能主要登陆、发送短信和登出,相当简单,一看就明白。由于其中调用了Com,所以调用的时候需要进行Com的初始化工作。下面是一个使用的例子:
#include "Fetion.h"
#pragma comment(lib, "MFCFetionSDK.lib")
CoInitialize(NULL);
CFetion fetion(_T("你的手机号"), _T("你的密码"));
fetion.Login();
fetion.SendSMSToPhone(_T("好友手机号"), _T("要发送的消息。"));
fetion.Logout();
CoUninitialize();
    速度方面,我测试一下,还是相当快的,占的内存也非常的少。
    关于飞信协议方面,还是采用MD5进行加密的,改成SHA1也相当简单。在我之前的文章中,我讲到一些关键技术的实现方法。由于刚刚初学MFC,其中肯定写得很烂,所以代码先不提供了。如果有需要,可以发邮件给我。mailto:ssdut@126.com。
    下面说一下,我解决的几个关键性的问题,也方便刚初学MFC的朋友。
    1、如何导出MFC类?
    这个问题折磨了我很久,vs2005中新建一个MFC dll的时候会产生一个.def文件,用来导出函数,但我上网查了好多资料,都没有实现用.def导出类。网上有说可以生成map文件后,通过查看其中的信息导出类中的函数。我嫌麻烦,最后通过AFX_CLASS_EXPORT进行导出的。导入用AFX_CLASS_IMPORT。
    2、如何用afxinet.h访问https
    飞信在登录的时候用到https,好像我试了一下http同样是可行的,但是我觉得不够安全,所以选择使用https。但是这和C#中一样,访问https的是有会出现证书的问题。网上资料很少,可能是我找资料的方法不对,最后在一个国外网站上找到一个solution。
AfxParseURL(url, type, server, param, port);
connection = session.GetHttpConnection(server, port);
if(type == 4107)
{
file = connection->OpenRequest(CHttpConnection::HTTP_VERB_GET, param, NULL, 1, NULL, NULL, INTERNET_FLAG_SECURE | INTERNET_FLAG_IGNORE_CERT_CN_INVALID | INTERNET_FLAG_IGNORE_CERT_DATE_INVALID);
}
    3、编码转换和hash的计算
    编码转换用的Windows api中的WideCharToMultiByte和MultiByteToWideChar。而hash用的是#include <wincrypt.h>。下面是我用到的工具类。
Code
    其中用到的都是CString,Unicode用的是CStringW,多字节的用的是CStringA。这好像在VC6中只有CString,并不分什么CStringA和CStringW。所以这不适合在VC6中使用。 那个Codepages是我从C#中找过来的,竟然发现一个重复的,我直接做删除处理,也不知道对不对,但我知道utf-8是对的。
    4、关于头文件的问题
    我的dll中Fetion.dll中远不只这三个函数,还有很多私有函数和私有成员。我在提供Fetion.h中都删除了,开始发现删除之后不好用了,后来我把其中要到的指针成员改成普通的对象就好用了。但是在debug的版本的时候,告诉我fetion对象被破坏了,不知道怎么回事。幸好在release版本中,一切正常。
    5、关于飞信
    飞信的协议分析,我是借助别人的成果,我自己没有去抓包分析,也没有去反编译,和我写的C#版本一样,是通过看别人用php版本,翻译过来的。
   总结
   通过这个简单的小例子,基本对MFC的非窗体使用有了一个了解,会运用各种东西来处理自己想要的效果。对于窗体编程,我的经验不是很多。我也编写了一个小例子,一个隐藏和现实窗口的小程序。在以后的文章中介绍。
   dll和例子:MFCFetionSDK.rar
    由于好多人发邮件给我要源代码,所以在此提供源代码的下载:mfcfetion.rar
    转载请保持文章的完整性,并注明出处。

posted on 2009-08-16 05:08  小橋流水  阅读(3868)  评论(10编辑  收藏  举报

导航