现在有个项目需要用到发短信的功能,所以网上买了个西门子T35i 芯片的短信猫,但实际编程时才发现只能发短信,一般的DLL不支持发长短信,但公司会经常发长短信,联系卖家要求给个发长短信的动态库,但卖家说他那只有这个,长短信要收钱开发的,晕。(怀疑是故意的),然后又买了个支持长短信惠通猫(szhto.ocx、HTCOM.dll不支持线程),开始还行,但用久了不知为啥总是死机一样,发/接不了短信,并且总是有两条短信删不掉,一直留在那,找供应商都不理你,说我程序的问题,无语了,
那么只有自己上网找了,好在支持T35i的有许多,又把旧的猫拿来研究。经过不懈努力终于OK。(哈。。。。哈。。。。),过程中接触了几个DLL和OCX,我都来评说下吧。
1、sms.dll (好象迅塞公司的),可以发长短信,但不能给10086这样的短号码发信息。
同步发送的、它的功能也比较简单:
function Sms_Connection(CopyRight:pchar;Com_Port,Com_BaudRate:integer;var Mobile_Type,CopyRightToCOM:PChar):integer;stdcall;external 'sms.dll'; function Sms_Send(Sms_TelNum:string;Sms_Text:string):integer;stdcall;external 'sms.dll'; Function Sms_Receive(Sms_Type:string;var Sms_Text:PChar):integer;stdcall;external 'sms.dll'; function Sms_Delete(Sms_Index:string):integer;stdcall;external 'sms.dll'; function Sms_AutoFlag :integer;stdcall;external 'sms.dll'; function Sms_NewFlag :integer;stdcall;external 'sms.dll'; function Sms_Disconnection :integer;stdcall;external 'sms.dll';
2、MonDem.dll (这个忘了是那家的了)支持多线程操作,功能也可以,但没研究出怎么发长短信,有知道的一定告之呀!
//函数说明 //先初始化,然后发送或者接收,退出程序前关闭Modem {*************************************************************} // 参数: nComNo 0~255 代表COM编号, // modemType 短信猫类型 // 0 - 1口短信猫, // 1 - 2口短信猫, // 2 - 4口短信猫, // 3 - 8短信猫口 // 返回: 0 - 成功, -1类型错 // XXX -错误代码,参见代码表 {*************************************************************} function fnSetModemType(ComNo:integer; modemType:Smallint) :integer;stdcall; external 'MonDem.dll'; {******************************************************} // 获取当前短信猫类型设置 //参数: nComNo 0~255 代表COM编号。 //返回 :短信猫类型 //0 - 1口短信猫, //1 - 2口短信猫, //2 - 4口短信猫, //3 - 8短信猫口 //XXX -错误代码,参见代码表 {*******************************************************} function fnGetModemType(ComNo:integer):integer;stdcall; external 'MonDem.dll'; {***********************初始化函数***********************} //参数: comx 0~7 代表端口号码, -1 表示所有端口 //返回: 0 - 成功 XXX -错误代码,参见代码表 {********************************************************} function fnInitModem(comx:integer):integer;stdcall; external 'MonDem.dll'; {***********************发送函数*************************} //参数: comx 0~7 代表端口号码, -1 表示任意一个可用端口 //receivephone 接受手机号,sendmsg表示发送信息内容 //sendmsg(应该在70个字符以内,包含标点符号,1个汉字算1个字符) //例如: 恭喜发财,测试成功! 长度为10 //返回: 0 - 发送成功 1 - 发送失败 XXX -错误代码,参见代码表 {********************************************************} function fnSendMsg(comx:integer;receivephone,sendmsg:pchar):integer;stdcall; external 'MonDem.dll'; {********************************************************} // 参数: nPortNo 0~255 代表端口号码, -1 表示所有端口 //返回: 端口状态,大于等于8表示设备连接正常,可以接收和发送。 // 状态小于8,表示测试状态。小于等于1,可能连线没有接好或者电源 // 没有打开,注意复位短信猫。 // -1 端口号指定错误或者是端口未打开 {********************************************************} function fnGetStatus(nPortNo:integer):integer;stdcall; external 'MonDem.dll'; {*************************接收函数***********************} //参数: comx 0~7 代表端口号码, //(-1 表示任意一个可用端口,暂时不支持) //sendphone 发送方手机号码 receivemsg 接收信息内容 //返回: 0~7 - 成功,接收端口号码 -1 - 无信息 //XXX -错误代码,参见代码表 {********************************************************} function fnReadMsgEx(comx:integer;szHeader,receivemsg:pchar):integer;stdcall; external 'MonDem.dll'; function fnGetSndCount(nPortNo:integer):integer;stdcall; external 'MonDem.dll'; function fnGetRecCount(nPortNo:integer):integer;stdcall; external 'MonDem.dll'; //function fnSetReceive(nType:integer):integer;stdcall; external 'MonDem.dll'; {************************关闭函数************************} //参数: comx 0~7 代表端口号码, -1 表示所有端口 //返回: 0 - 成功 XXX -错误代码,参见代码表 {********************************************************} function fnCloseModem(comx:integer):integer;stdcall; external 'MonDem.dll'; {*******************错误代码表:**************************} // 100: 授权错误(检测软件狗) // 101: 授权类型错误(检测软件狗类型) // 102: 未初始化,请先初始化 // 200: 端口号码错 // 201: 不支持的端口 // 202: 信息超长 // 203: 不能发送空信息 // 204: 手机号码错 // 205: 设备错 //5xx: 操作xx号端口错误 {********************************************************}
由于是OCX的方式,用起来还是比较方便的。
4、SMSControl.ocx Ver5.0(LY的)控件的用起来还是比较好用的,功能也多,但需要注册购买的,支持10086等短信发送。
不用买也是可以用的,没有连接/发送等状态的返回值,只能自己设置延时处理了。
if Smscontrol1.SendMSG(QFindSend.Fields[1].AsString,QFindSend.Fields[2].AsString)>0 then begin Memo1.Lines.Add('发送成功!'); end else begin Memo1.Lines.Add('发送失败!') end;