詳細(xì)介紹C#調(diào)用API
該例程演示了C#調(diào)用API函數(shù),而且回調(diào)函數(shù)的參數(shù)包含結(jié)構(gòu)體,使用C#的委托和IntPtr方法實現(xiàn).由于我使用C#剛兩天,這是我寫的***個C#程序,因此例程寫的可能有點粗糙,但是編譯和運行完全沒有問題.CMPP2.0的API封裝成了標(biāo)準(zhǔn)C調(diào)用API的方法,提供以下三個接口,使用的時候只要有CMPPAPI.dll就可以了.
- #define DllExport extern "C" __declspec(dllexport)
- DllExport int __stdcall Cmpp2Start(LPCTSTR pchSmgIp
- int nMtPort
- int nMoPort
- LPCTSTR pchUserName
- LPCTSTR pchUserPwd
- unsigned char uchVersion
- void (__stdcall *OnSmgMsg)(CMPP_SMGTOSP* css)
- int nConnType
- void (__stdcall *OnLogFile)(LPCTSTR str));
- DllExport int __stdcall Cmpp2Submit(
- unsigned char uchPKtotal
- unsigned char uchPKnumber
- unsigned char uchNeedreport
- unsigned char uchMsglevel
- LPCTSTR pchServiceid
- unsigned char uchFeeusertype
- LPCTSTR pchFeeterminalid
- unsigned char uchTppid
- unsigned char uchTpudhi
- unsigned char uchMsgfmt
- LPCTSTR pchMsgsrc
- LPCTSTR pchFeetype
- LPCTSTR pchFeecode
- LPCTSTR pchValidtime
- LPCTSTR pchAttime
- LPCTSTR pchSrcid
- unsigned char uchDestusrtl
- LPCTSTR pchDestterminalid
- unsigned char uchMsglen
- LPCTSTR pchMsgcontent);
- DllExport int __stdcall Cmpp2Release();
C#調(diào)用API,如何聲明結(jié)構(gòu)體,如何使用委托實現(xiàn)回調(diào)函數(shù),如何實現(xiàn)使用自定義結(jié)構(gòu)體作為參數(shù)的回調(diào)函數(shù),請仔細(xì)查看例程源碼。注意:CMPPAPI.dll要和可執(zhí)行文件放到同一個目錄下,或者放到可執(zhí)行文件能找到的目錄,或者放到系統(tǒng)目錄下(如:C:\windows \system32).
- //Class1.cs
- using System;
- // 該名稱空間包含了在Visual C#中調(diào)用API的一些必要集合
- using System.Runtime.InteropServices;
- // 使用Sleep方法需要的命名空間
- using System.Threading;
- namespace CMPPAPI_Sample_CSharp
- {
- [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)]
- publicstruct CMPP_CONNECT_RESP
- {
- public byte uchStatus;
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
- public string sAuthISMG;
- public byte cVersion;
- }
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- publicstruct CMPP_SUBMIT_RESP
- {
- public long nMsgid;
- public byte uchResult;
- }
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- publicstruct 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)]
- publicstruct CMPP_MO_MSGCONTENT
- {
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 160)]
- public string sMsgcontent;
- public CMPP_STATUS_REPORT csr;
- }
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- publicstruct CMPP_DELIVER
- {
- public longnMsgid;
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 21)]
- public string sDestid;
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
- public string sServiceid;
- public byteuchTppid;
- public byteuchTpudhi;
- public byteuchMsgfmt;
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 21)]
- public string sSrcterminalid;
- public byteuchRegisteredDelivery;
- public byteuchMsglength;
- public CMPP_MO_MSGCONTENT mo_msg;
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
- public string sReserved;
- }
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- publicstruct CMPP_SUBMIT
- {
- public longnMsgid;
- public byteuchPkTotal;
- public byteuchPkNumber;
- public byteuchRegisteredDelivery;
- public byteuchMsgLevel;
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
- public string sServiceId;
- public byteuchFeeUserType;
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 21)]
- public string sFeeTerminalId;
- public byteuchTpPid;
- public byteuchTpUdhi;
- public byteuchMsgFmt;
- [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 byteuchMsgLength;
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 160)]
- public string sMsgContent;
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
- public string sReserved;
- }
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- publicstruct 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)]
- publicstruct 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接收消息總數(shù).
- public uint nMTTLUsr;//從SP接收用戶總數(shù).
- public uint nMTScs; //成功轉(zhuǎn)發(fā)數(shù)量.
- public uint nMTWT; //待轉(zhuǎn)發(fā)數(shù)量.
- public uint nMTFL; //轉(zhuǎn)發(fā)失敗數(shù)量.
- public uint nMOScs; //向SP成功送達(dá)數(shù)量.
- public uint nMOWT; //向SP待送達(dá)數(shù)量.
- public uint nMOFL; //向SP送達(dá)失敗數(shù)量.
- }
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- publicstruct CMPP_CANCEL
- {
- public long nMsgid;
- }
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- publicstruct CMPP_CANCEL_RESP
- {
- public byte uchSuccessId;
- }
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- publicstruct CMPP_ACTIVETEST_RESP
- {
- public byte uchReserved;
- }
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- publicstruct CMPP_BODY
- {
- public CMPP_CONNECT_RESP pk_connectresp;
- public CMPP_SUBMIT_RESPpk_submitresp;
- public CMPP_QUERY_RESPpk_queryre
以上介紹C#調(diào)用API
【編輯推薦】