SgipGetSM
 【函数功能】
读取下发的短讯内容,从此短训内容消息体的StatusRport字段可以判断是否为状态报告,需要(V100R001.3DD101以后)以上的短消息中心以及信息平台支持,此函数适用于CNGP协议。
【函数原型】
int WINAPI SgipGetSM(ULONG* ulCommandID,ULONG* ulNodeNum,ULONG* ulTime, ULONG* ulSequenceID, char* sUserNumber, char* sSPNumber,unsigned char* byPID,unsigned char* byUDHI, unsigned char* byMsgCoding,unsigned long* ulMsgLen,char* sMsgContent,  ULONG* ulOrgNodeNum,ULONG* ulOrgTime, ULONG* ulOrgSeqID,unsigned char* byReporttype,unsigned char* byState,unsigned char* byErrCode,unsigned char* byUserCondition,char* sReserve,unsigned char byAckResult)
【函数说明】
该函数用于接收网关下发到接口的Deliver,Report,UserRpt消息及消息的各项参数输出。Deliver消息的回包由动态库完成,在调用此函数成功后,接口自动回包。
参数sMsgContent是接收返回正文的缓冲区,大小不应小于254字节。
             其中Deliver消息都到的参数有以下几个:ulCommandID, ulNodeNum, ulTime,  ulSequenceID, sUserNumber, sSPNumber,byPID, byUDHI, byMsgCoding, ulMsgLen, 
sMsgContent,sReserve,byAckResult ;当消息是Deliver 其余参数没有意义
           Report消息涉及到的参数有sUserNumber ,ulCommandID, ulNodeNum, ulTime,  ulSequenceID,ulOrgNodeNum, ulOrgTime, ulOrgSeqID,byReporttype, byState, byErrCode,
 sReserve,byAckResult。
         Deliver消息都到的参数有以下几个:ulCommandID, ulNodeNum, ulTime,  ulSequenceID, sUserNumber, sSPNumber, sReserve, byAckResult。调用接口SgipGetSM,一直不能成功。
下面是引用动态库后,我写的函数(C#)
[DllImport("SGIP\\SMEIDll.dll")]
        public static extern int SgipGetSM(out ulong ulCommandID, out ulong ulNodeNum, out ulong ulTime, out ulong ulSequenceID,
        ref StringBuilder sUserNumber, ref StringBuilder sSPNumber, out byte byPID,
        out byte byUDHI, out byte byMsgCoding, out UInt32 ulMsgLen, ref StringBuilder sMsgContent,
        out UInt32 ulOrgNodeNum, out UInt32 ulOrgTime, out UInt32 ulOrgSeqID, out byte byReporttype,
        out byte byState, out byte byErrCode, out byte byUserCondition,
        ref StringBuilder sReserve,ref byte byAckResult);是不是c里面的类型,转换成C#的类型,有问题?或者有谁遇到类似的问题,求解答c#api联通短信接口

解决方案 »

  1.   

    ULONG* ulCommandID在C#里用ref ulong ulCommandID试试
      

  2.   

    那其他的类型呢?
    char* 用string或者stringbuilder
      

  3.   

    那其他的类型呢?
    char* 用string或者stringbuilder
    ULONG* ulCommandID
    在C#里用
    ref UINT32 ulCommandID试试
    具体参考这里http://blog.csdn.net/xqf222/article/details/5877795
      

  4.   


    声明函数[DllImport("SGIP\\SMEIDll.dll")]
    public static extern int SgipGetSM(ref UInt32 ulCommandID, ref UInt32 ulNodeNum, ref  UInt32 ulTime, ref UInt32 ulSequenceID,                // 消息序列号
                         ref string sUserNumber, ref string sSPNumber, ref byte[] byPID,
                         ref byte[] byUDHI, ref byte[] byMsgCoding, ref ulong ulMsgLen, ref StringBuilder sMsgContent,                    // Delvier 消息字段序列      
                         ref ulong ulOrgNodeNum, ref ulong ulOrgTime, ref ulong ulOrgSeqID, ref byte[] byReporttype,      // Report  消息字段序列
                         ref byte[] byState, ref byte[] byErrCode, ref byte[] byUserCondition,
                         ref string sReserve, ref Byte byAckResult);
    声明参数[MarshalAs(UnmanagedType.U8)]
            public UInt32 ulCommandID;
            [MarshalAs(UnmanagedType.U8)]
            public UInt32 ulNodeNum;
            [MarshalAs(UnmanagedType.U8)]
            public UInt32 ulTime;
            [MarshalAs(UnmanagedType.U8)]
            public UInt32 ulSequenceID;
            [MarshalAs(UnmanagedType.AnsiBStr)]
            public string sUserNumber;
            [MarshalAs(UnmanagedType.AnsiBStr)]
            public string sSPNumber;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst=256)]
            public byte[] byPID;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
            public byte[] byUDHI;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
            public byte[] byMsgCoding;
            public ulong ulMsgLen;
            [MarshalAs(UnmanagedType.AnsiBStr)]
            public StringBuilder sMsgContent;
            public ulong ulOrgNodeNum;
            public ulong ulOrgTime;
            public ulong ulOrgSeqID;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
            public byte[] byReporttype;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
            public byte[] byState;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
            public byte[] byErrCode;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
            public byte[] byUserCondition;
            [MarshalAs(UnmanagedType.AnsiBStr)]
            public string sReserve;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
            public Byte byAckResult;
    这样写还是错的,返回错误:90