c#使用c++的dll

来源:互联网 发布:arena软件图片 编辑:程序博客网 时间:2024/05/22 07:53
//C#使用c++dll方法
//回调函数注意参数类型变化,如long型C++ 的长度为32,C# 的长度为64
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace ClientControl
{
    public partial class MainForm : Form
    {
        [DllImport("bmpcodec.dll")]
        static extern int TXYS_InitSystem();//初始化
        [DllImport("bmpcodec.dll")]
        static extern int TXYS_ExitSystem();//退出
        [DllImport("bmpcodec.dll")]
        static extern int TXYS_StartRecvBMP();//开始压缩图像
        [DllImport("bmpcodec.dll")]
        static extern int TXYS_StopRecvBMP();//停止压缩图像
        [DllImport("bmpcodec.dll")]
        static extern int TXYS_CheckNetChannel(int iAllowBandWidth); //网络信道检测
        [DllImport("bmpcodec.dll")]
        static extern int TXYS_RegDataArriveEventHandler(TXYS_DataArriveHandler_t fHandlerFunc); //注册数据到来
        [DllImport("bmpcodec.dll")]
        static extern int TXYS_RegReqTimeEventHandler(TXYS_RequestTimeHandler_t fHandlerFunc); //注册时间
        [DllImport("bmpcodec.dll")]
        static extern int TXYS_RegWarnEventHandler(TXYS_WarnHandler_t fHandlerFunc); //注册警告
        [DllImport("bmpcodec.dll")]
        static extern int TXYS_RegStateNotifyEventHandler(TXYS_StateNotifyHandler_t fHandlerFunc);//注册状态
        [DllImport("bmpcodec.dll")]
        static extern int TXYS_RegCheckNotifyEventHandler(TXYS_NetCheckNotifyHandler_t fHandlerFunc);//注册网络检测事件
        // 函数指针类型    
       
        public delegate int TXYS_DataArriveHandler_t(int iImageFrameNo,  int iPackNo, int iDataSize,  string ucData);
        public delegate int TXYS_RequestTimeHandler_t();
        public delegate int TXYS_WarnHandler_t(int iFaultNo, int iWarnType);
        public delegate int TXYS_StateNotifyHandler_t(long lStartTime, long lEndTime,
                                       long lMinDelayTime, long lMaxDelayTime, long lMeanDelayTime,
                                       int iMaxLostFarmeNum, int iTotalLostFrameNum);
        public delegate int  TXYS_NetCheckNotifyHandler_t(int iStatus, int iUseBandWidth, int lMeanDelayTime);
        private delegate void UpdateDelegate(string str);
        //委托操作函数
        private void UpdateText(string str)
        {
            datalabel.Text=str;
        }
        public static TXYS_DataArriveHandler_t dataArrive;//=new TXYS_DataArriveHandler_t(
        public static TXYS_WarnHandler_t warnArrive;
        public static TXYS_NetCheckNotifyHandler_t netCheck;
        //数据到来回调函数
        public int fDataArriveHandler(int iImageFrameNo,int iPackNo, int iDataSize, string  ucData)
        {
           // if (iImageFrameNo < 0)
            //    return 0;
          // MessageBox.Show("" + iImageFrameNo);
           UpdateDelegate eh = new UpdateDelegate(UpdateText);
           this.datalabel.Invoke(eh, new object[] {iImageFrameNo +"帧,第"+iPackNo+ "包数据到来"+"大小"+iDataSize+ucData });
            //datalabel.Text = "" + iImageFrameNo + "帧数据到来";
           
            return 0;
        }
        //警告事件回调函数
        public int fWarnArriveHandle(int iFaultNo, int iWarnType)
        {
           // MessageBox.Show("" + iFaultNo + "," + iWarnType);
            UpdateDelegate eh = new UpdateDelegate(UpdateText);
            this.datalabel.Invoke(eh, new object[] { "网络警告" +iFaultNo+","+iWarnType});
            return 0;
        }
        //网络检测事件函数
        public int fNetCheckHandle(int iStatus, int iUseBandWidth, int lMeanDelayTime)
        {
            //MessageBox.Show("" + iStatus + "," + iUseBandWidth + "," + lMeanDelayTime);
            UpdateDelegate eh = new UpdateDelegate(UpdateText);
            this.datalabel.Invoke(eh, new object[] { "网络事件" + iStatus + "," + iUseBandWidth+","+lMeanDelayTime });
            return 0;
        }
        public MainForm()
        {
            InitializeComponent();
            TXYS_InitSystem();
            dataArrive = new TXYS_DataArriveHandler_t(this.fDataArriveHandler);
            TXYS_RegDataArriveEventHandler(dataArrive);
            warnArrive = new TXYS_WarnHandler_t(this.fWarnArriveHandle);
            TXYS_RegWarnEventHandler(warnArrive);
            netCheck = new TXYS_NetCheckNotifyHandler_t(this.fNetCheckHandle);
            TXYS_RegCheckNotifyEventHandler(netCheck);
        }
        ~MainForm()
        {
           
            //TXYS_ExitSystem();
        }
        private void MainForm_Load(object sender, EventArgs e)
        {
           
        }
        //启动图像传输
        private void ButtonStart_Click(object sender, EventArgs e)
        {
            TXYS_StartRecvBMP();
        }
        private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            TXYS_ExitSystem();
        }
        private void buttonStop_Click(object sender, EventArgs e)
        {
            TXYS_StopRecvBMP();
        }
        private void buttonNetcheck_Click(object sender, EventArgs e)
        {
            TXYS_CheckNetChannel(1024);
        }
    }