VB调用DLL的问题

chinalpj 2008-03-05 09:37:39
原型:
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消息的
我在VB里的声名:
Public Declare Function GetDeliverSMExExEx Lib "smeidll" _
(sm_id As Long, DestTON As Byte, _
DestNPI As Byte, ByVal destaddr As Long, _
OrgTON As Byte, OrgNPI As Byte, _
ByVal orgaddr As Long, PRI As Byte, _
RP As Byte, UDHI As Byte, _
PID As Byte, DCS As Byte, _
ByVal TimeStamp As Long, udlen As Long, _
ByVal userdata As Long, StatusReport As Byte, _
ByVal sMsgID As Long, ByVal sSubmitdate As Long, _
ByVal sDonedate As Long, ByVal sStatus As Long) As Long
调用:
Dim sm_id, udlen As Long
Dim iret As Integer
Dim TimeStamp(20), userdata(142), sSubmitdate(20), sDonedate(20), sStatus(20) As Byte
Dim destaddr(30), orgaddr(30) As Byte
Dim sMsgID(23) As Byte
Dim userMobile, userContent, spMobile, spTime, smsid As String
Dim ssMsgID, ssSubmitdate, ssDonedate, ssStatus As String
Dim DestTON, DestNPI, OrgTON, OrgNPI, PRI, PID, DCS As Byte
Dim RP, UDHI As Byte
Dim StatusReport As Byte
StatusReport = 0
Dim mobile()
If HasDeliverMessage(100) = 0 Then

iret = GetDeliverSMExExEx(sm_id, DestTON, DestNPI, VarPtr(destaddr(0)), _
OrgTON, OrgNPI, _
VarPtr(orgaddr(0)), PRI, _
RP, UDHI, _
PID, DCS, _
VarPtr(TimeStamp(0)), udlen, _
VarPtr(userdata(0)), StatusReport, _
VarPtr(sMsgID(0)), VarPtr(sSubmitdate(0)), _
VarPtr(sDonedate(0)), VarPtr(sStatus(0)))

If iret = 0 Then
ssMsgID = StrConv(sMsgID, vbUnicode)
ReDim mobile(0 To UBound(destaddr) + 1)
CopyMemory VarPtr(mobile(0)), VarPtr(destaddr(0)), 20
mobiles = StrConv(mobile, vbUnicode)
能正常取到UDLEN和sMsgID,但destaddr,TimeStamp, userdata,sSubmitdate, sDonedate, sStatus orgaddr
取不出来,我用 CopyMemory VarPtr(mobile(0)), VarPtr(destaddr(0)), 20
然后 mobiles = StrConv(mobile, vbUnicode)
得到的mobiles是空的。


请问一下我怎么才能正常取出返回值呢,谢谢~!


...全文
138 6 打赏 收藏 举报
写回复
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cbm6666 2008-03-05
  • 打赏
  • 举报
回复
mobile的型态是什么?

如果是文字,则通用区 Dim mobile$()
下面的则是 ReDim Preserve mobile$(0 To UBound(destaddr) + 1)

试试看 ReDim Preserve mobile(0 To UBound(destaddr) + 1) '加一个Preserve

Dim userMobile, userContent, spMobile, spTime, smsid As String
你这种定义写法是错误的, 除了 smsid是string 前面的都是变体型变量,改为
Dim userMobile$, userContent$, spMobile$, spTime$, smsid$ '$是等于String的简写
其它的几行宣告都一样,也都要改

cbm6666 2008-03-05
  • 打赏
  • 举报
回复
Attn: 4F 没错,不能 Dim a,b,c,d As Integer 应该是Dim a%,b%,c%,d% 'a%等于 a As Integer

'你上面的宣告帮你整理了

Dim sm_id&, udlen&, iret%
Dim userMobile$, userContent$, spMobile$, spTime$, smsid$, ssMsgID$, ssSubmitdate$, ssDonedate$, ssStatus$
Dim TimeStamp(20) As Byte, userdata(142) As Byte, sSubmitdate(20) As Byte, sDonedate(20) As Byte, sStatus(20) As Byte, destaddr(30) As Byte, orgaddr(30) As Byte, sMsgID(23) As Byte
Dim DestTON As Byte, DestNPI As Byte, OrgTON As Byte, OrgNPI As Byte, PRI As Byte, PID As Byte, DCS As Byte, RP As Byte, UDHI As Byte, StatusReport As Byte
Dim mobile(), mobiles$ '这里你自己改我不确定你的mobiles是什么型态,但你没在这里宣告就是错的
StatusReport = 0

cbm6666 2008-03-05
  • 打赏
  • 举报
回复
哎....看你的代码真累啊, 那些变量名称狂晕..........

你的Function返回是 Long 又如何得到字串 ?

mobiles 是你要的吗? 那你应该在最上面通用区宣告全局变量 Dim mobiles as string 我并没看到你有这个宣告,返回结果当然是空值.

上面那些宣告我替你整理了,改一改吧,你那个变量宣告是一个很严重的观念错误.

智能卡_Snooper 2008-03-05
  • 打赏
  • 举报
回复
vb中一行声明多个变量时,是否每个都应该指定类型?
chinalpj 2008-03-05
  • 打赏
  • 举报
回复
不行mobile$还是为空.

chinalpj 2008-03-05
  • 打赏
  • 举报
回复
我试试,先谢了
相关推荐
发帖
API

1483

社区成员

VB API
社区管理员
  • API
加入社区
帖子事件
创建了帖子
2008-03-05 09:37
社区公告
暂无公告