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