SMEIDLL.dll中的函数原型为:
int WINAPI SubmitAExEx(unsigned char OrgTON, unsigned char OrgNPI, LPCSTR OrgAddr,
unsigned char DestTON, unsigned char DestNPI, LPCSTR DestAddr,
unsigned char PRI, unsigned char RD, unsigned char RP,
unsigned char SRR, unsigned char MR, unsigned char DCS,
unsigned char PID, LPCSTR Schedule, LPCSTR Expire,
unsigned long Default_ID, unsigned char UDHI, unsigned long UDLen,
LPCSTR UserData, LPCSTR ServiceSubType,
unsigned char* byMsgID, unsigned char byPKTotal,
unsigned char byPKNumber, unsigned char byMsglevel,
unsigned char byFeeUserType, LPCSTR sSPID, LPCSTR sFeeType,
LPCSTR sFeeAddr, LPCSTR sFeeCode,unsigned char byUserNum,
LPCSTR sDestAddrs, unsigned long* SM_ID, unsigned char* FCS)
注:SubmitAExEx适用于CMPP协议(移动)。
我的申明:
function SubmitAExEx(OrgTON, OrgNPI: Byte; OrgAddr: LPCSTR; DestTON, DestNPI: Byte; DestAddr: LPCSTR;
PRI, RD, RP, SRR, MR, DCS, PID: Byte; Schedule, Expire: LPCSTR;
Default_ID: longword; UDHI: Byte; UDLen: longword; UserData, ServiceSubType: LPCSTR;
byMsgID: PByte; byPKTotal, byPKNumber, byMsglevel, byFeeUserType: Byte;
sSPID, sFeeType, sFeeAddr, sFeeCode: LPCSTR; byUserNum: Byte;
sDestAddrs: LPCSTR; SM_ID: Plongword; FCS: PByte): integer; external 'smeidll.dll';
调用:
procedure TForm1.Button5Click(Sender: TObject);
var
ret: integer;
byMsgID : Byte;
SM_ID : Longword;
FCS : Byte;
d: TSubmitAExEx;
Schedule,Expire: string;
begin
Schedule:=FormatDateTime('yyyy/MM/dd hh:mm:ss',Now);
Expire:=FormatDateTime('yyyy/MM/dd hh:mm:ss',Now+0.5);
ret:=d(2,1,'040222',1,1,'8613760818278',0,0,0,0,0,8,0,PAnsiChar(Schedule),
PAnsiChar(Expire),0,0,4,'test','icp',@byMsgID, //MAX_MSG_ID,CMPP的字段,消息ID
1,1,0,1,'spid','01','','11',1,'040222',@SM_ID,@FCS);
showmessage(inttostr(ret));
end;每次ret返回都是4,而且还会出现这样的错误提示:
Access violation at address 3134319 in modual "smeidll.dll".read of address 3134319.
请问是什么原因,请用过的高手急救呀!
int WINAPI SubmitAExEx(unsigned char OrgTON, unsigned char OrgNPI, LPCSTR OrgAddr,
unsigned char DestTON, unsigned char DestNPI, LPCSTR DestAddr,
unsigned char PRI, unsigned char RD, unsigned char RP,
unsigned char SRR, unsigned char MR, unsigned char DCS,
unsigned char PID, LPCSTR Schedule, LPCSTR Expire,
unsigned long Default_ID, unsigned char UDHI, unsigned long UDLen,
LPCSTR UserData, LPCSTR ServiceSubType,
unsigned char* byMsgID, unsigned char byPKTotal,
unsigned char byPKNumber, unsigned char byMsglevel,
unsigned char byFeeUserType, LPCSTR sSPID, LPCSTR sFeeType,
LPCSTR sFeeAddr, LPCSTR sFeeCode,unsigned char byUserNum,
LPCSTR sDestAddrs, unsigned long* SM_ID, unsigned char* FCS)
注:SubmitAExEx适用于CMPP协议(移动)。
我的申明:
function SubmitAExEx(OrgTON, OrgNPI: Byte; OrgAddr: LPCSTR; DestTON, DestNPI: Byte; DestAddr: LPCSTR;
PRI, RD, RP, SRR, MR, DCS, PID: Byte; Schedule, Expire: LPCSTR;
Default_ID: longword; UDHI: Byte; UDLen: longword; UserData, ServiceSubType: LPCSTR;
byMsgID: PByte; byPKTotal, byPKNumber, byMsglevel, byFeeUserType: Byte;
sSPID, sFeeType, sFeeAddr, sFeeCode: LPCSTR; byUserNum: Byte;
sDestAddrs: LPCSTR; SM_ID: Plongword; FCS: PByte): integer; external 'smeidll.dll';
调用:
procedure TForm1.Button5Click(Sender: TObject);
var
ret: integer;
byMsgID : Byte;
SM_ID : Longword;
FCS : Byte;
d: TSubmitAExEx;
Schedule,Expire: string;
begin
Schedule:=FormatDateTime('yyyy/MM/dd hh:mm:ss',Now);
Expire:=FormatDateTime('yyyy/MM/dd hh:mm:ss',Now+0.5);
ret:=d(2,1,'040222',1,1,'8613760818278',0,0,0,0,0,8,0,PAnsiChar(Schedule),
PAnsiChar(Expire),0,0,4,'test','icp',@byMsgID, //MAX_MSG_ID,CMPP的字段,消息ID
1,1,0,1,'spid','01','','11',1,'040222',@SM_ID,@FCS);
showmessage(inttostr(ret));
end;每次ret返回都是4,而且还会出现这样的错误提示:
Access violation at address 3134319 in modual "smeidll.dll".read of address 3134319.
请问是什么原因,请用过的高手急救呀!
解决方案 »
- GDI+ TEXTOUT绘制的文字 怎么选中取出来
- 新手请教数据库方面的问题
- 功能实现了,请qxf32和zhangxiaommmm再领分,谢谢了
- 状态栏?
- 为什么我编译后的EXE文件,在其他机子上运行会出现"非法错误"??
- 怎样制报表(有关rave的学习资料,请大侠帮忙)
- 本人刚接触intraweb,寻求介绍intraweb编程的网络资源?请多多帮忙!谢谢!
- 急急我是初学者请问:用delphi如何写控件,在delphi中怎样用ListView,最好给一些例程看看。
- 程序员的爱!我的GF又飞了:~(
- 高手,请问如何确定MDI窗的同一个子窗口只能打开若干个(比如说三个)?
- GB13000字库区位读取、汉字显示
- 求助:通过变量指定对象名
...FCS: PByte):integer; stdcall; external 'smeidll.dll';继续看看:)
我也采用过stdcall的方法
申明为:
type TSubmitAExEx=Function(OrgTON, OrgNPI: Byte; OrgAddr: LPCSTR; DestTON, DestNPI: Byte; DestAddr: LPCSTR;
PRI, RD, RP, SRR, MR, DCS, PID: Byte; Schedule, Expire: LPCSTR;
Default_ID: longword; UDHI: Byte; UDLen: longword; UserData, ServiceSubType: LPCSTR;
byMsgID: PByte; byPKTotal, byPKNumber, byMsglevel, byFeeUserType: Byte;
sSPID, sFeeType, sFeeAddr, sFeeCode: LPCSTR; byUserNum: Byte;
sDestAddrs: LPCSTR; SM_ID: Plongword; FCS: PByte): integer; stdcall;调用:
procedure TForm1.Button5Click(Sender: TObject);
var
ret: integer;
byMsgID : Byte;
SM_ID : Longword;
FCS : Byte;
h:thandle;
d: TSubmitAExEx;
Schedule,Expire: string;
begin
h:=safeloadlibrary('SMEIDll.dll');
if h>0 then
@d:=getprocaddress(h,'SubmitAExEx')
else
begin
showmessage('找不到SMEIDLL.dll文件!');
exit;
end;
Schedule:=FormatDateTime('yyyy/MM/dd hh:mm:ss',Now);
Expire:=FormatDateTime('yyyy/MM/dd hh:mm:ss',Now+0.5);
ret:=d(2,1,'040222',1,1,'8613760818278',0,0,0,0,0,8,0,PAnsiChar(Schedule),
PAnsiChar(Expire),0,0,4,'test','icp',@byMsgID, //MAX_MSG_ID,CMPP的字段,消息ID
1,1,0,1,'spid','01','','11',1,'040222',@SM_ID,@FCS);
showmessage(inttostr(ret));
end;结果运行时,返回结果还是一样,错误也会出现!》》更正,问题贴中ret:=d(....)
应为: ret:=SubmitAExEx(......)
我再试下cdecl
-------------------------
程序异常退出了,用stdcall是正确的,看来是其它原因。
不知道与它会不会冲突呀,不过那套软件我们不能关闭,不然现有的平台就全瘫痪了!
Access violation at address 3134319 in modual "smeidll.dll".read of address 3134319.
function SubmitAExEx(OrgTON : ShortInt; OrgNPI :ShortInt; OrgAddr :PChar; DestTON :ShortInt; DestNPI :ShortInt; DestAddr :PChar; PRI :ShortInt; RD :ShortInt; RP :ShortInt; SRR :ShortInt; MR :ShortInt; DCS :ShortInt; PID :ShortInt; Schedule :PChar; Expire :PChar; Default_ID :LongWord; UDHI :ShortInt; UDLen :LongWord; UserData :PChar;ServiceSubType:Pchar; byMsgID:pchar; byPKTotal:ShortInt; byPKNumber:ShortInt; byMsglevel:ShortInt; byFeeUserType:ShortInt; sSPID:Pchar; sFeeType:Pchar; sFeeAddr:Pchar; sFeeCode:Pchar; byUserNum:ShortInt; sDestAddrs:Pchar; var SM_ID:longword; var FCS:ShortInt):integer;stdCall external 'SMEIDLL.DLL';
我初始化接口、登录都是成功的,只是在发送这儿出了问题。大富翁有人提到:unsigned char* byMsgID ——》byMsgID: Pchar
我原来声明的是:unsigned char* byMsgID ——》byMsgID: Byte 然后调用@byMsgID
这个我要试一下!至于模拟网关,我找了一个《中国移动通信CMPP2.0服务端模拟器 v1.0 》,不知道可不可以用。
今晚我测试一下,明天我会来说明测试情况的。
var
ret: integer;
byMsgID : array [0..31] of Byte;
SM_ID : Longword;
FCS : Byte;
h:thandle;
d: TSubmitAExEx;
begin
h:= safeloadlibrary('SMEIDll.dll');
if h>0 then
@d:=getprocaddress(h,'SubmitAExEx')
else
begin
showmessage('找不到SMEIDLL.dll文件!');
exit;
end; ret:= d(2, 1,'040222',1,1,'8613760818278',0,0,0,0,0,8,0,nil,
nil,0,0,4,'test','icp',@byMsgID, 1,1,0,1,'spid','01','','11',1,'040222',@SM_ID,@FCS);
showmessage(inttostr(ret));
end;
说一下我测的情况,现在没有了 Access violation at address 3134319 in modual "smeidll.dll ".read of address 3134319这样的错误,不过返回还是4。我想应该是我对某些参数的赋值不对,所以这些在程序上应该是都没有问题了。对于参数我会再仔细的核对一下。
等我问题完全解决后,我会再开贴赠送你们100分的,多谢支持了!