現在有個項目需要用到發短信的功能,所以網上買了個西門子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;