导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
uptou (uptou)
★☆☆☆☆
-
普通会员
2003/10/17 10:01:56
标题:
请问这个函数在Delphi中该如何用呢?
浏览:4476
加入我的收藏
楼主:
GetDeliverSMExExEx 【函数功能】 读取下发的短讯内容,并且能确认此消息是否为状态报告,用于CMPP协议中,SP需要短消息网关返回状态报告的内容。 【函数原型】 int WINAPI GetDeliverSMExExEx(ULONG* sm_ID, unsigned char* DestTON, unsigned char* DestNPI, char* DestAddr, unsigned char* OrgTON, unsigned char* OrgNPI, char* OrgAddr, unsigned char* PRI, unsigned char* RP, unsigned char* UDHI, unsigned char* PID, unsigned char* DCS, char* TimeStamp, unsigned long * UDLen, char* UserData, unsigned char* StatusReport,unsigned char* sMsgID, char* sSubmitdate, char* sDonedate, char* sStatus); 【参数说明】 Sm_ID 类型:ULONG* 意义:返回短消息的ID DestTON 类型:unsigned char* 意义:返回目标地址号码类型 DestNPI 类型:unsigned char* 意义;返回目标地址编码方案 DestAddr 类型:char* 返回最大长度为20字符串(不包括"\0"字符)。 意义:目标地址 OrgTON 类型:unsigned char* 说明:返回源地址号码类型 OrgNPI 类型:unsigned char* 说明:返回源地址编码方案 OrgAddr 类型:char* 返回最大长度为20字符串(不包括"\0"字符)。 说明:源地址 PRI 类型:unsigned char* 说明:返回优先级 RP 类型:unsigned char* 说明:返回回应路径 UDHI 类型:unsigned char* 说明:返回头结构指示 PID 类型:unsigned char* 说明:返回协议标志 DCS 类型:unsigned char* 说明:返回编码方案 TimeStamp 类型:char* 返回最大长度为19字符串(不包括"\0"字符)。 说明:提交时间 UDLen 类型:ULONG* 意义:返回短消息的UDL UserData 类型:char* 返回最大长度为140字节的字符串(不包括"\0"字符)。 说明:正文(为状态报告时无意义) StatusReport 类型:unsigned char* 返回:状态报告标志,0:表示不是状态报告,1:表示为状态报告 sMsgID 类型:unsigned char*返回22字节的字符串,此消息为状态报告时此字段才有意义。 说明:可通过此字段去匹配相应的Submit消息 sSubmitdate 类型:char* 返回 说明:10字节的提交时间格式 YYMMDDHHMM(YY为年的后两位00-99,MM:01-12,DD:01-31,HH:00-23,MM:00-59) sDonedate 类型:char* 返回 说明:10字节的消息下发时间格式YYMMDDHHMM(同上面的sSubmitdata) sStatus 类型:char*返回 说明:7字节的字符串, SP根据该字段确定CMPP_SUBMIT消息的处理状态。具体值的意义见下表。 【调用举例】 ULONG ulsm_ID; unsigned char byDestTON, byDestNPI, byOrgTON, byOrgNPI, byPRI, byPID, byDCS; char sDestAddr[MAX_ADDR_LEN]; memset(sDestAddr, 0, MAX_ADDR_LEN); char sOrgAddr[MAX_ADDR_LEN]; memset(sOrgAddr, 0, MAX_ADDR_LEN); char sTimeStamp[MAX_TIMESTAMP_LEN]; memset(sTimeStamp, 0, MAX_TIMESTAMP_LEN); char sUserData[MAX_UD_LEN]; memset(sUserData, 0, MAX_UD_LEN); unsigned char MsgID[23]; memset(MsgID, 0, 23); char sSubmitdate[MAX_SUBMIT_TIME_LEN+1]; memset(sSubmitdate, 0, MAX_SUBMIT_TIME_LEN+1); char sDonedate[MAX_DONE_TIME_LEN+1]; memset(sDonedate, 0, MAX_DONE_TIME_LEN+1); char sStatus[MAX_STATE_LEN+1]; memset(sStatus, 0, MAX_STATE_LEN+1); int iRet; unsigned char byRP; unsigned char byUDHI; unsigned long ulUDLen; unsigned char byStatusReport = 0; iRet = GetDeliverSMExEx(&ulsm_ID, &byDestTON, &byDestNPI, sDestAddr, &byOrgTON,&byOrgNPI, sOrgAddr, &byPRI, &byRP, &byUDHI, &byPID, &byDCS,sTimeStamp, &ulUDLen, sUserData, &byStatusReport,MsgID, sSubmitdate, sDonedate, sStatus); if(iRet == 0) { CString sGetData; sGetData.Format("接收成功!\n接受到数据:%s", sUserData); CString str; str.Format("接收到Deliver消息\n" "源地址 = %s\n" "目标地址 = %s\n" "TimeStamp = %s\n" "正文 = %s\n" "状态报告标志 = %d\n" "MsgID = %s\n" "Submit date = %s\n" "done date = %s\n" "stat = %s", sOrgAddr, sDestAddr, sTimeStamp, sUserData, StatusReport, MsgID, sSubmitdate, sDonedate, sStatus); MessageBox(str,MB_OK,0); } else MessageBox("接收失败!",MB_OK,0);
----------------------------------------------
-
作者:
bios (阿贡)
★☆☆☆☆
-
盒子中级会员
2003/10/17 11:28:07
1楼:
晕倒,这么复杂!
----------------------------------------------
作者:
bios (阿贡)
★☆☆☆☆
-
盒子中级会员
2003/10/17 11:29:56
2楼:
CString??VC的原代码吧!
----------------------------------------------
作者:
uptou (uptou)
★☆☆☆☆
-
普通会员
2003/10/17 11:31:09
3楼:
这是原型函数,我现在要在Delphi中调用,该如何用呢?我是新手,还请各位老大指教。
----------------------------------------------
-
作者:
2003/10/17 13:43:05
4楼:
新手还搞这样的代码来,晕
----------------------------------------------
我有我风采
作者:
bios (阿贡)
★☆☆☆☆
-
盒子中级会员
2003/10/17 17:10:20
5楼:
带我慢慢看来! 你会很急吗?
----------------------------------------------
作者:
uptou (uptou)
★☆☆☆☆
-
普通会员
2003/10/17 17:35:20
6楼:
有点急,不过你慢慢看,谢谢你。
----------------------------------------------
-
作者:
bios (阿贡)
★☆☆☆☆
-
盒子中级会员
2003/10/18 10:11:56
7楼:
GetDeliverSMExExEx 【函数功能】 读取下发的短讯内容,并且能确认此消息是否为状态报告,用于CMPP协议中,SP需要短消息网关返回状态报告的内容。 【函数原型】 function GetDeliverSMExExEx( sm_ID :PDword; DestTON:PChar; DestNPI:PChar; DestAddr:Pchar; OrgTON:Pchar; OrgNPI:PChar; OrgAddr:PChar; PRI:PChar; RP:PChar; UDHI:PChar; PID:PChar; DCS:PChar; TimeStamp:PChar; UDLen:PDword,; UserData:PChar; StatusReport:PChar; sMsgID:PChar; sSubmitdate:PChar; sDonedate:PChar; sStatus:PChar):Longint;stdcall; 【参数说明】 Sm_ID 类型:PDword 意义:返回短消息的ID DestTON 类型:PChar 意义:返回目标地址号码类型 DestNPI 类型:PChar 意义;返回目标地址编码方案 DestAddr 类型:PChar 返回最大长度为20字符串 意义:目标地址 OrgTON 类型:PChar 说明:返回源地址号码类型 OrgNPI 类型:PChar 说明:返回源地址编码方案 OrgAddr 类型:PChar 返回最大长度为20字符串 说明:源地址 PRI 类型:PChar 说明:返回优先级 RP 类型:PChar 说明:返回回应路径 UDHI 类型:PChar 说明:返回头结构指示 PID 类型:PChar 说明:返回协议标志 DCS 类型:PChar 说明:返回编码方案 TimeStamp 类型:PChar 返回最大长度为19字符串 说明:提交时间 UDLen 类型:PDword 意义:返回短消息的UDL UserData 类型:PChar 返回最大长度为140字节的字符串(不包括'\0'字符)。 说明:正文(为状态报告时无意义) StatusReport 类型: PChar 返回:状态报告标志,0:表示不是状态报告,1:表示为状态报告 sMsgID 类型:PChar 返回22字节的字符串,此消息为状态报告时此字段才有意义。 说明:可通过此字段去匹配相应的Submit消息 sSubmitdate 类型:PChar 说明:10字节的提交时间格式 YYMMDDHHMM(YY为年的后两位00-99,MM:01-12,DD:01-31,HH:00-23,MM:00-59) sDonedate 类型:PChar 说明:10字节的消息下发时间格式YYMMDDHHMM(同上面的sSubmitdata) sStatus 类型:PChar 说明:7字节的字符串, SP根据该字段确定CMPP_SUBMIT消息的处理状态。具体值的意义见下表。 【调用举例】 resourcestring r1='接收到Deliver消息'+#13#10+ '源地址 := %s'+#13#10+ '目标地址 := %s'+#13#10+ 'TimeStamp := %s'+#13#10+ '正文 := %s'+#13#10+ '状态报告标志 := %c'+#13#10+ 'MsgID := %s'+#13#10+ 'Submit date := %s'+#13#10+ 'done date := %s'+#13#10+ 'stat := %s'; r2='接收成功!'+#13#10+'接受到数据:%s'; var ulsm_ID:DWord; byDestTON, byDestNPI, byOrgTON, byOrgNPI, byPRI, byPID, byDCS:PChar; sDestAddr:array [0..MAX_ADDR_LEN-1] of char; sOrgAddr:array [0..MAX_ADDR_LEN-1] of char; sTimeStamp:[0..MAX_TIMESTAMP_LEN]of char; sUserData:[0..MAX_UD_LEN]of char; MsgID:[0..22]of char; sSubmitdate:[0..MAX_SUBMIT_TIME_LEN]of char; sDonedate:[0..MAX_DONE_TIME_LEN]of char; sStatus:[0..MAX_STATE_LEN]of char; iRet:Longint; ulUDLen:DWord; byRP,byUDHI,byStatusReport:char; s1,s2:string; begin FillChar(sDestAddr, MAX_ADDR_LEN,0); FillChar(sOrgAddr, MAX_ADDR_LEN,0); FillChar(sTimeStamp, MAX_TIMESTAMP_LEN,0 ); FillChar(sUserData, MAX_UD_LEN,0); FillChar(MsgID, 23,0); FillChar(sSubmitdate,MAX_SUBMIT_TIME_LEN+1, 0); FillChar(sDonedate, MAX_DONE_TIME_LEN+1,0); FillChar(sStatus, MAX_STATE_LEN+1,0); byStatusReport:='0'; //----------------------------- iRet := GetDeliverSMExEx(ulsm_ID, byDestTON, byDestNPI, sDestAddr, byOrgTON,byOrgNPI, sOrgAddr, byPRI, byRP, byUDHI, byPID, byDCS,sTimeStamp, ulUDLen, sUserData, byStatusReport,MsgID, sSubmitdate, sDonedate, sStatus); if(iRet = 0) then begin//1 s2:=Format(r2, [sUserData]); s1:=Format(r1,[sOrgAddr, sDestAddr, sTimeStamp,sUserData, StatusReport, MsgID, sSubmitdate, sDonedate, sStatus]); MessageBox(application.handle,Pchar(s1),'ok',MB_OK); end//1 else MessageBox(application.handle,'接收失败!','fail',MB_OK); end;
----------------------------------------------
作者:
bios (阿贡)
★☆☆☆☆
-
盒子中级会员
2003/10/18 10:13:18
8楼:
T1
此帖子包含附件: 大小: 108.3K
----------------------------------------------
作者:
bios (阿贡)
★☆☆☆☆
-
盒子中级会员
2003/10/18 10:14:14
9楼:
如有不对,再说吧!
此帖子包含附件: 大小: 53.8K
----------------------------------------------
作者:
uptou (uptou)
★☆☆☆☆
-
普通会员
2003/10/19 0:27:31
10楼:
我按照你上面的方法写,可是运行时提示内存出错,原因为何?可否给一些建议?
----------------------------------------------
-
作者:
zizii (高高高级馒头)
★☆☆☆☆
-
神秘会员
2003/10/19 0:35:06
11楼:
厉害,新手就做华为的那个短信接口,佩服! 你用的CMPP还是SMPP,如果是CMPP用这个就行了: //CMPP取下发短讯 function GetDeliverSMExEx(sm_ID: PULONG; DestTON: PUChar; DestNPI: PUChar; DestAddr: PChar; OrgTON: PUChar; OrgNPI: PUChar; OrgAddr: PChar; PRI: PUChar; RP: PUChar; UDHI: PUChar; PID: PUChar; DCS: PUChar; TimeStamp: PChar; UDLen: PDWORD; UserData: PChar; StatusReport: PUChar): Integer stdcall; external DLL; 以上函数是原型翻译过来,简化以后就是这样的: function GetDeliverSM(var ulsm_ID:LongInt; var w_sDestAddr:string; var w_sOrgAddr:string; var w_sTimeStamp:string; var w_sUserData:string):Integer; var byDestTON, byDestNPI, byOrgTON, byOrgNPI, byPRI, byPID, byDCS : Char; sDestAddr:array[0..MAX_ADDR_LEN-1]of Char; sOrgAddr:array[0..MAX_ADDR_LEN-1]of Char; sTimeStamp:array[0..MAX_TIMESTAMP_LEN-1]of Char; sUserData:array[0..MAX_UD_LEN-1]of Char; byRP:UChar; byUDHI:UChar; ulUDLen:LongInt; byStatusReport:UChar; iRet:Integer; begin byStatusReport:=0; iRet:=GetDeliverSMExEx(@ulsm_ID, @byDestTON, @byDestNPI, sDestAddr, @byOrgTON, @byOrgNPI, sOrgAddr, @byPRI, @byRP, @byUDHI, @byPID, @byDCS, sTimeStamp, @ulUDLen, sUserData, @byStatusReport); Result:=iRet; w_sDestAddr:=sDestAddr; w_sOrgAddr:=sOrgAddr; w_sTimeStamp:=sTimeStamp; w_sUserData:=sUserData; end; 以上代码本站长专用,不知道你用起来有没有问题:~)
----------------------------------------------
维护世界和平,共创美好盒子。
作者:
Giver (Giver)
★☆☆☆☆
-
盒子活跃会员
2003/10/19 14:06:14
12楼:
这是些什么东西啊,可否详细介绍一下关于短信平台的资料啊,或者哪里可以找到啊
----------------------------------------------
http://www.gaiwei.com
作者:
bios (阿贡)
★☆☆☆☆
-
盒子中级会员
2003/10/19 15:25:13
13楼:
我只是翻译,没调试,我现在可没心事做这个!
----------------------------------------------
作者:
uptou (uptou)
★☆☆☆☆
-
普通会员
2003/10/19 16:15:21
14楼:
Giver把你邮件地址留下,我发给你资料,大家共同参详一下。
----------------------------------------------
-
作者:
uptou (uptou)
★☆☆☆☆
-
普通会员
2003/10/19 16:25:11
15楼:
站长,我不是很明白你的意思?可否解释一下?你所指的简化是什么意思?另外,那几个MAX的值从何而来?
----------------------------------------------
-
作者:
uptou (uptou)
★☆☆☆☆
-
普通会员
2003/10/19 17:10:53
16楼:
还有就是那个sTimeStamp的值怎么总是为空?
----------------------------------------------
-
作者:
zizii (高高高级馒头)
★☆☆☆☆
-
神秘会员
2003/10/19 18:46:55
17楼:
max自己根据文档说明定义的。
----------------------------------------------
维护世界和平,共创美好盒子。
作者:
Giver (Giver)
★☆☆☆☆
-
盒子活跃会员
2003/10/19 19:09:00
18楼:
to uptou : 谢谢,这是我的信箱:delphier@163.com 希望和你成为好朋友!
----------------------------------------------
http://www.gaiwei.com
作者:
bios (阿贡)
★☆☆☆☆
-
盒子中级会员
2003/10/19 20:21:50
19楼:
to:Giver 偶向你请教!
----------------------------------------------
作者:
uptou (uptou)
★☆☆☆☆
-
普通会员
2003/10/19 22:21:04
20楼:
为什么总是返回4? PRI:=0; DCS:=15; RD:=0; RP:=0; SRR:=1; MR:=0; PID:=0; UDHI:=0; S_sms:='大家好才是真的好!'; Udlen:=length(S_sms); S_iRet:=SubmitAExEx(2,//OrgTON源地址号码类型 1,//OrgNPI: Byte源地址编码方案 '03339',//OrgAddr: String;源地址,最大长度20个ASC字符 2,//DestTON,目标地址号码类型。取值同OrgTON 1,//DestNPI: Byte,目标地址编码方案。取值同OrgNPI '13926649920',//DestAddr: String;目标地址 PRI,//PRI,SM优先级 RD,//RD,保留,设置为0 RP,//RP,回应路径,保留,设置为0 SRR,//SRR,状态报告,保留,设置为0;需要状态报告时,设置为1 MR,//MR,//消息索引,保留,设置为0 DCS,//DCS,//数据编码方案 PID,//PID: Byte;协议类型,缺省为0 ',//Schedule,定时时间,注意:时间格式必须为"yyyy/mm/dd hh:mm:ss"。缺省为NULL,长度为19个ASC字符 ',//Expire: String;超时时间,注意:时间格式必须为"yyyy/mm/dd hh:mm:ss"。缺省为NULL,长度为19个ASC字符 0,//Default_ID: LongWord;缺省短消息的信息码,缺省为0 UDHI,//UDHI: Byte;用于长短消息,表示UserData是否是结构 UdLen,//: Integer; 表示UserData的长度 S_sms,//UserData,用户信息,短消息正文 ',//ServiceSubType: String;业务类型,通过此值来判断计费,缺省值为NULL byMsgID,//byMsgID,返回ACK应答消息的MsgID 1,//byPKTotal,相同Msg_id的消息总条数,从1开始 1,//byPKNumber,相同Msg_id的消息序号,从1开始 0,//byMsglevel,信息级别,缺省为0 0,//byFeeUserType: Byte;计费用户类型字段 '999999',//sSPID,信息内容来源(Src_ID),对应CMPP的 Msg_src '02',//sFeeType,资费类别 ',//sFeeAddr,被计费用户的号码 '000020',//sFeeCode: String;资费代码,以分为单位 1,//byUserNum: Byte;接收消息的用户数量 '13926649920',//sDestAddrs: String;接收业务MSISDN号码,最多100个MSISDN号码 @SM_ID,//SM_ID: Cardinal; 返回短消息ID @FCS);//FCS: Byte)
----------------------------------------------
-