C#回调函数及API应用浅析

2025-03-04 07:15:06
推荐回答(1个)
回答1:

  开发环境:WinXP Pro(SP 英文版) + VS NET 中文版

  接口库版本: CMPP API第二版(V )

  该例程演示了如何在C#里面调用VC 开发的C#回调函数的API应用 而且回调函数的参数包含结构体 使用C#的委托和IntPtr方法实现

  由于我使用C#刚两天 这是我写的第一个C#程序 因此例程写的可能有点粗糙 但是编译和运行完全没有问题

  CMPP 的API应用封装成了标准C调用的方法 提供以下三个接口 使用的时候只要有CMPPAPI dll就可以了

  在C#里面如何调用API应用 如何声明结构体 如何使用委托实现C#回调函数 如何实现使用自定义结构体作为参数的C#回调函数 请仔细查看例程源码 注意:CMPPAPI dll要和可执行文件放到同一个目录下 或者放到可执行文件能找到的目录 或者放到系统目录下(如:C:\windows\system )

  下面是C#下面的完整的调用代码

  

    //Class cs   using System;  // 该名称空间包含了在Visual C#中调用API的一些必要集合  using System Runtime InteropServices;  // 使用Sleep方法需要的命名空间  using System Threading;   namespace CMPPAPI_Sample_CSharp  {   [StructLayout(LayoutKind Sequential  Pack =  )]  public struct CMPP_HEAD  {  public uint nTotalLength;  public uint nCommandId;  public uint nSeqId;  }   [StructLayout(LayoutKind Sequential  Pack =  )]  public struct CMPP_CONNECT  {  [MarshalAs(UnmanagedType ByValTStr  SizeConst =  )]  public string sSourceAddr;  [MarshalAs(UnmanagedType ByValTStr  SizeConst =  )]  public string sAuthSource;  public byte cVersion;  public uint nTimeStamp;  }   [StructLayout(LayoutKind Sequential  Pack =  )]  public struct CMPP_CONNECT_RESP  {  public byte uchStatus;  [MarshalAs(UnmanagedType ByValTStr  SizeConst =  )]  public string sAuthISMG;  public byte cVersion;  }   [StructLayout(LayoutKind Sequential  Pack =  )]  public struct CMPP_SUBMIT_RESP  {  public long nMsgid;  public byte uchResult;  }   [StructLayout(LayoutKind Sequential  Pack =  )]  public struct CMPP_STATUS_REPORT  {  public long nMsgid;  [MarshalAs(UnmanagedType ByValTStr  SizeConst =  )]  public string sStat;  [MarshalAs(UnmanagedType ByValTStr  SizeConst =  )]  public string sSubmitTime;  [MarshalAs(UnmanagedType ByValTStr  SizeConst =  )]  public string sDoneTime;  [MarshalAs(UnmanagedType ByValTStr  SizeConst =  )]  public string sDestTerminalId;  public uint nSmscSeq;  }   [StructLayout(LayoutKind Sequential  Pack =  )]  public struct CMPP_MO_MSGCONTENT  {  [MarshalAs(UnmanagedType ByValTStr  SizeConst =  )]  public string sMsgcontent;  public CMPP_STATUS_REPORT csr;  }   [StructLayout(LayoutKind Sequential  Pack =  )]  public struct CMPP_DELIVER  {  public long nMsgid;  [MarshalAs(UnmanagedType ByValTStr  SizeConst =  )]  public string sDestid;  [MarshalAs(UnmanagedType ByValTStr  SizeConst =  )]  public string sServiceid;  public byte uchTppid;  public byte uchTpudhi;  public byte uchMsgfmt;  [MarshalAs(UnmanagedType ByValTStr  SizeConst =  )]  public string sSrcterminalid;  public byte uchRegisteredDelivery;  public byte uchMsglength;   public CMPP_MO_MSGCONTENT mo_msg;   [MarshalAs(UnmanagedType ByValTStr  SizeConst =  )]  public string sReserved;  } 
lishixinzhi/Article/program/net/201311/12324