using System;
// 該名稱空間包含了在Visual C#中調用API的一些必要集合
using System.Runtime.InteropServices;
// 使用Sleep方法需要的命名空間
using System.Threading;
namespace CMPPAPI_Sample_CSharp
{
//---------------------------------------------------------------------
//---------以下是DLL中需要使用的結構體的定義---------------------------
//--------Pack = 1表示結構體按一個位元組對齊----------------------------
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct CMPP_HEAD
{
public uint nTotalLength;
public uint nCommandId;
public uint nSeqId;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct CMPP_CONNECT
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
public string sSourceAddr;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string sAuthSource;
public byte cVersion;
public uint nTimeStamp;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct CMPP_CONNECT_RESP
{
public byte uchStatus;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string sAuthISMG;
public byte cVersion;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct CMPP_SUBMIT_RESP
{
public long nMsgid;
public byte uchResult;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct CMPP_STATUS_REPORT
{
public long nMsgid;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 7)]
public string sStat;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
public string sSubmitTime;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
public string sDoneTime;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 21)]
public string sDestTerminalId;
public uint nSmscSeq;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct CMPP_MO_MSGCONTENT
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 160)]
public string sMsgcontent;
public CMPP_STATUS_REPORT csr;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct CMPP_DELIVER
{
public long nMsgid;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 21)]
public string sDestid;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
public string sServiceid;
public byte uchTppid;
public byte uchTpudhi;
public byte uchMsgfmt;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 21)]
public string sSrcterminalid;
public byte uchRegisteredDelivery;
public byte uchMsglength;
public CMPP_MO_MSGCONTENT mo_msg;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string sReserved;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct CMPP_SUBMIT
{
public long nMsgid;
public byte uchPkTotal;
public byte uchPkNumber;
public byte uchRegisteredDelivery;
public byte uchMsgLevel;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
public string sServiceId;
public byte uchFeeUserType;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 21)]
public string sFeeTerminalId;
public byte uchTpPid;
public byte uchTpUdhi;
public byte uchMsgFmt;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
public string sMsgSrc;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)]
public string sFeeType;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
public string sFeeCode;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 17)]
public string sValidTime;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 17)]
public string sAtTime;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 21)]
public string sSrcId;
public byte uchDstUsrTl;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 21*100)]
public string sDstTerminalId;
public byte uchMsgLength;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 160)]
public string sMsgContent;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string sReserved;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct CMPP_QUERY
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string sTime;
public byte uchQueryType;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
public string sQueryCode;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string sReserved;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct CMPP_QUERY_RESP
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string sTime;
public byte uchQueryType;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
public string sQueryCode;
public uint nMTTLMsg; //從SP接收訊息總數.
public uint nMTTLUsr; //從SP接收使用者總數.
public uint nMTScs; //成功轉寄數量.
public uint nMTWT; //待轉寄數量.
public uint nMTFL; //轉寄失敗數量.
public uint nMOScs; //向SP成功送達數量.
public uint nMOWT; //向SP待送達數量.
public uint nMOFL; //向SP送達失敗數量.
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct CMPP_CANCEL
{
public long nMsgid;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct CMPP_CANCEL_RESP
{
public byte uchSuccessId;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct CMPP_ACTIVETEST_RESP
{
public byte uchReserved;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct CMPP_BODY
{
public CMPP_CONNECT_RESP pk_connectresp;
public CMPP_SUBMIT_RESP pk_submitresp;
public CMPP_QUERY_RESP pk_queryresp;
public CMPP_DELIVER pk_deliver;
public CMPP_CANCEL_RESP pk_cancelresp;
public CMPP_ACTIVETEST_RESP pk_activetestresp;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct CMPP_SMGTOSP
{
public CMPP_HEAD pk_head;
public CMPP_BODY pk_body;
}
//----------------DLL需要使用的結構體的定義----------------------------
//---------------------------------------------------------------------
//----------------聲明兩個委託,相當於VC裡面的回呼函數------------------
public delegate void OnSmgMsg(IntPtr css);
public delegate void OnLogMsg(string str);
//---------------------------------------------------------------------
class Class1
{
//--------------------------------------------------------------------------
//--------------DLL中的API函式宣告------------------------------------------
// 1.Start Func
[DllImport("CMPPAPI.dll")]
public static extern int Cmpp2Start(string pchSmgIp, int nMtPort, int nMoPort,
string pchUserName, string pchUserPwd, byte uchVersion,
OnSmgMsg pf, int nConnType, OnLogMsg pf2);
// 3.Release
[DllImport("CMPPAPI.dll")]
public static extern int Cmpp2Release();
//--------------DLL中的API函式宣告------------------------------------------
//--------------------------------------------------------------------------
//-------------這兒使用IntPtr實現與結構體之間的轉換----------------
public static void OnMsg(IntPtr ptr)
{
CMPP_SMGTOSP css = new CMPP_SMGTOSP();
css = (CMPP_SMGTOSP)Marshal.PtrToStructure(ptr, typeof(CMPP_SMGTOSP));