在VC中这样定义的函数
int __stdcall Start(const char *pchSmgIp, \
const int nSmgPort, \
const char *pchClientID, \
const char *pchPwd, \
const unsigned char uchVersion, \
void (__stdcall *pOnDeliver)(MoStr mo));
做成DLL后在
VB中如何声明Declare Function Start Lib "SMGPAPI.DLL" (ByVal pchSmgIp As String, nSmgPort As Integer, ByVal pchClientID As String, ByVal pchPwd As String, uchVersion As String, ???) As Integer
特别是最后一个参数??
int __stdcall Start(const char *pchSmgIp, \
const int nSmgPort, \
const char *pchClientID, \
const char *pchPwd, \
const unsigned char uchVersion, \
void (__stdcall *pOnDeliver)(MoStr mo));
做成DLL后在
VB中如何声明Declare Function Start Lib "SMGPAPI.DLL" (ByVal pchSmgIp As String, nSmgPort As Integer, ByVal pchClientID As String, ByVal pchPwd As String, uchVersion As String, ???) As Integer
特别是最后一个参数??
最后一个参数用 ByVal lpfuncOnDeliver As Long
MoStr 类型是什么?现在假定是 String。
调用时写 Call Start(xxx, xxx, xxx, xxx, xxx, AddresOf funcOnDeliver)
在一个标准模块中写。
Public Function lpfuncOnDeliver(mo As String)
'代码在此处开始。
End Sub
大侠好象不行耶!Declare Function Start Lib "SMGPAPI.DLL" (ByVal pchSmgIp As String, ByVal nSmgPort As Long, ByVal pchClientID As String, ByVal pchPwd As String, ByVal uchVersion As Byte, ByVal funcOnDeliver As Long) As Long
回调函数:
Public Function funcOnDeliver(mo As String)
'代码在此处开始。
End Function
调用:
Private Sub Command1_Click()
Call Start("127.0.0.1", 8890, "SMGP", 123, 1, AddressOf funcOnDeliver)End Sub
2 回调是否放在标准模块中了。
3 看该函数的手册,在回调中要如何处理,给出什么返回值
4 程序的其他地方是否有问题。
typedef struct MoStr {
SMGP_HEAD pk_head;
SMGP_DELIVER pk_deliver;
} MOSTR;
//////////////////////////以下为函数说明//////////////////////////////////////
1. Start - 启动函数
定义:
SMGP_API int __stdcall Start(const char *pchSmgIp, \
const int nSmgPort, \
const char *pchClientID, \
const char *pchPwd, \
const unsigned char uchVersion, \
void (__stdcall *pOnDeliver)(MoStr mo));
参数说明:
pchSmgIp - 网关IP地址
nSmgPort - 网关端口号
pchClientID - CP编号,最长8位,不足接口库会自动补齐
pchPwd - CP的登录密码
uchVersion - 协议版本号,目前是0x13
void (__stdcall *pOnDeliver(MoStr mo)) - 处理上行消息的回调函数指针(包括MO消息和状态报告)
介绍:
接口库启动,调用时传入连接网关的相关参数和MO消息处理回调函数指针,接口库会自动连接网关,并且启动消息收发和处理线程模块,各种处理自动进行。通过调用下面将要介绍的Submit函数,用户可以主动下发MT消息;上行消息(MO和状态报告)的接收将在接口库内自动进行,收到上行消息后,通过内部调度算法,调用用户自定义的消息处理函数pOnDeliver进行处理,消息内容作为参数传给用户定义的回调函数。
Public Type MoStr
pk_head As SMGP_HEAD 'SMGP_HEAD 换成实际类型。
pk_deliver As SMGP_DELIVER '同上。
End TypePublic Function funcOnDeliver(mo As MoStr)
'代码在此处开始。
End Function
public sub funcOnDeliver(mo as MoStr)
end sub
其实是一样的,Function没有定义返回值就是Sub
所以这里应该用Sub,否则程序有99%的可能会崩溃
char sMsgid[10]; unsigned char uchIsReport;
unsigned char uchMsgfmt;
char sRecvTime[14];
char sSrcTermId[21];
char sDstTermId[21];
unsigned char uchMsgLen;
union {
char sMsgcontent[252];
smgp_status_report csr;
} MO_Msg_Content;
char sReserved[8];
} SMGP_DELIVER;
typedef struct smgp_status_report {
char sMsgid[10];
char sSub[3];
char sDlvrd[3];
char sSubmitDate[10];
char sDoneDate[10];
char sStat[7];
char sErr[3];
char sTxt[20];
} SMGP_STATUS_REPORT;
-------------我的做法(失败)-----------------
Public Type SMGP_HEAD
nPacketLength As Integer
nRequestID As Integer
nSeqId As Integer
End Type
Public Type smgp_status_report
sMsgid(10) As String
sSub(3) As String
sDlvrd(3) As String
sSubmitDate(10) As String
sDoneDate(10) As String
sStat(7) As String
sErr(2) As String
sTxt(20) As StringEnd TypePublic Type MO_Msg_Content
sMsgcontent(252) As String
csr As smgp_status_report
End TypePublic Type SMGP_DELIVER
sMsgid(10) As String
uchIsReport As Byte
uchMsgfmt As Byte
sRecvTime(14) As String
sSrcTermId(21) As String
sDstTermId(21) As String
uchMsgLen As Byte
MO_Msg_Content As Variant
sReserved(8) As String
End Type
Public Type MoStr
pk_head As SMGP_HEAD 'SMGP_HEAD 换成实际类型。
pk_deliver As SMGP_DELIVER '同上。
End Type