在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
特别是最后一个参数??

解决方案 »

  1.   

    这是一个有回调(Call Back)的函数。
    最后一个参数用 ByVal lpfuncOnDeliver As Long
    MoStr 类型是什么?现在假定是 String。
    调用时写 Call Start(xxx, xxx, xxx, xxx, xxx, AddresOf funcOnDeliver)
    在一个标准模块中写。
    Public Function lpfuncOnDeliver(mo As String)
        '代码在此处开始。
    End Sub
      

  2.   

    http://community.csdn.net/Expert/TopicView.asp?id=4170122
      

  3.   

    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 pOnDeliver As Long) As Long
      

  4.   

    声明:
    大侠好象不行耶!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
      

  5.   

    1 MoStr 的类型到底是什么?
    2 回调是否放在标准模块中了。
    3 看该函数的手册,在回调中要如何处理,给出什么返回值
    4 程序的其他地方是否有问题。
      

  6.   

    我在VC中的定义为一结构体:
    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进行处理,消息内容作为参数传给用户定义的回调函数。
      

  7.   

    楼主还要给出 SMGP_HEAD SMGP_DELIVER 的类型。
    Public Type MoStr
        pk_head As SMGP_HEAD            'SMGP_HEAD 换成实际类型。
        pk_deliver As SMGP_DELIVER      '同上。
    End TypePublic Function funcOnDeliver(mo As MoStr)
        '代码在此处开始。
    End Function
      

  8.   

    funcOnDeliver声明错了,应该是Sub而不是Function
    public sub funcOnDeliver(mo as MoStr)
    end sub
      

  9.   

    //funcOnDeliver声明错了,应该是Sub而不是Function
    其实是一样的,Function没有定义返回值就是Sub
      

  10.   

    不对,Function没有写返回类型那他默认的是返回1个Variant类型function funcOnDeliver() = function funcOnDeliver() as variant他c函数是写的没有返回值的 void (__stdcall *pOnDeliver)(MoStr mo));
    所以这里应该用Sub,否则程序有99%的可能会崩溃
      

  11.   

    各位大侠,VC的联合体在VB中对应的数据结构是啥呀?typedef struct smgp_deliver {
    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;
      

  12.   

    smgp_status_report的定义
    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