C#回調函數及API應用淺析
開發環境:WinXP Pro(SP2英文版) + VS.NET 2003中文版
接口庫版本: CMPP2.0 API第二版(V2.6)
該例程演示了如何在C#里面調用VC6.0開發的C#回調函數的API應用,而且回調函數的參數包含結構體,使用C#的委托和IntPtr方法實現。
由于我使用C#剛兩天,這是我寫的***個C#程序,因此例程寫的可能有點粗糙,但是編譯和運行完全沒有問題。
CMPP2.0的API應用封裝成了標準C調用的方法,提供以下三個接口,使用的時候只要有CMPPAPI.dll就可以了。
在C#里面如何調用API應用,如何聲明結構體,如何使用委托實現C#回調函數,如何實現使用自定義結構體作為參數的C#回調函數,請仔細查看例程源碼。注意:CMPPAPI.dll要和可執行文件放到同一個目錄下,或者放到可執行文件能找到的目錄,或者放到系統目錄下(如:C:\windows\system32)。
下面是C#下面的完整的調用代碼
- //Class1.cs
- using System;
- // 該名稱空間包含了在Visual C#中調用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)]
- 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;
- }
【編輯推薦】