那些年,用C#調用過的外部Dll


經常有人找到我咨詢以前在csdn資源里分享的dll調用。算算也寫過N多接口程序。翻一翻試試寫篇隨筆。

  • 明華IC讀寫器DLL
  • 愛迪爾門鎖接口DLL
  • 通用OPOS指令打印之北洋pos打印機dll
  • 明泰非接觸式RF讀寫器DLL
  • 二代身份證讀取
  • 語音盒API的使用

還有很多,以后補上。大多找不到了。也是懶得找了。

先抄點名詞解釋

DllImport是System.Runtime.InteropServices命名空間下的一個屬性類,其功能是提供從非托管DLL導出的函數的必要調用信息。
DllImport屬性應用於方法,要求最少要提供包含入口點的dll的名稱。
DllImport的定義如下:

[AttributeUsage(AttributeTargets.Method)]
  public class DllImportAttribute: System.Attribute
  {
   public DllImportAttribute(string dllName) {…} //定位參數為dllName
   public CallingConvention CallingConvention; //入口點調用約定
   public CharSet CharSet; //入口點采用的字符接
   public string EntryPoint; //入口點名稱
   public bool ExactSpelling; //是否必須與指示的入口點拼寫完全一致,默認false
   public bool PreserveSig; //方法的簽名是被保留還是被轉換
   public bool SetLastError; //FindLastError方法的返回值保存在這里
   public string Value { get {…} }
  }

Mwic_32.dll(明華IC卡)

using System;
using System.Text;
using System.Runtime.InteropServices;

namespace mw_rdp
{
	/// <summary>
	/// IC4442 的摘要說明。
	/// </summary>
	public unsafe class IC4442
	{
		public IC4442()
		{
			//
			// TODO: 在此處添加構造函數邏輯
			//
		}

        //向IC卡中寫數據

        [DllImport("Mwic_32.dll", EntryPoint = "swr_4442", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]

        public static extern int swr_4442(int icdev, int offset, int len, char* w_string);

		[DllImport("Mwic_32.dll", EntryPoint="srd_4442",  SetLastError=true,
			 CharSet=CharSet.Auto, ExactSpelling=false, 
			 CallingConvention=CallingConvention.StdCall)]
			//說明:    從指定地址讀數據  
			//		   調用:    icdev:    通訊設備標識符 offset:   偏移地址,其值范圍0~255
			//  		len:      字符串長度,其值范圍1~256  		r_string: 讀出數據所存放地址指針
			//返回:     <>0   錯誤 	=0 正確
		public  static extern  Int16 srd_4442(int icdev, Int16 offset, Int16 len,[MarshalAs(UnmanagedType.LPArray)]byte[] r_string ); 
		

		[DllImport("Mwic_32.dll", EntryPoint="chk_4442",  SetLastError=true,
			 CharSet=CharSet.Auto , ExactSpelling=false,
			 CallingConvention=CallingConvention.StdCall)]
			//	說明:    檢查卡型是否正確  
			//調用:    icdev:   通訊設備標識符 
			//返回:     <0   錯誤   =0   正確
		public static extern  Int16 chk_4442(int icdev);


        [DllImport("Mwic_32.dll", EntryPoint = "csc_4442", SetLastError = true,
     CharSet = CharSet.Auto, ExactSpelling = true,
     CallingConvention = CallingConvention.Winapi)]
        public static extern Int16 Csc_4442(int icdev, int len, [MarshalAs(UnmanagedType.LPArray)] byte[] p_string);



		[DllImport("Mwic_32.dll", EntryPoint="wsc_4442",  SetLastError=true,
			 CharSet=CharSet.Auto, ExactSpelling=false,
			 CallingConvention=CallingConvention.StdCall)]
			//說明:    改寫卡密碼
			//調用:    icdev:    通訊設備標識符 len: 密碼個數,其值為3 p_string: 新密碼地址指針
			//返回:    <0   錯誤   =0   正確
		public static extern Int16 wsc_4442(int icdev, Int16 len, [MarshalAs(UnmanagedType.LPArray)]byte[] p_string);

		[DllImport("Mwic_32.dll", EntryPoint="rsc_4442",  SetLastError=true,
			 CharSet=CharSet.Auto, ExactSpelling=false,
			 CallingConvention=CallingConvention.StdCall)]
			//說明:    讀出卡密碼  
			//調用:    icdev:    通訊設備標識符  len:      密碼個數,其值為3 	p_string: 存放密碼地址指針
			// 返回:    <>0   錯誤   =0   正確	
         
		public static extern Int16 rsc_4442(int icdev, Int16 len,  [MarshalAs(UnmanagedType.LPArray)]byte[] p_string);

		[DllImport("Mwic_32.dll", EntryPoint="rsct_4442",  SetLastError=true,
			 CharSet=CharSet.Auto, ExactSpelling=false,
			 CallingConvention=CallingConvention.StdCall)]
			//說明:    讀出密碼錯誤計數器值
			//調用:    icdev:    通訊設備標識符 counter:  密碼錯誤記數值存放指針
			//返回:     <0   錯誤 >=0   正確
		public static extern Int16 rsct_4442(int icdev, out byte counter);


	}
}

MainDll.Dll(愛迪爾門鎖)

public static class AdelDoorCardIfc
    {
        public enum AdelSoftType
        {
            Lock3200 = 1,
            Lock3200K,
            Lock4200,
            Lock4200D,
            Lock5200,
            Lock6200,
            Lock7200,
            Lock7200D,
            Lock9200,
            Lock9200T,
            A30,
            A50 = 14,
            A90 = 18,
            A92 = 22
        }
        public enum TMEncoder
        {
            DS9097E = 1,
            DS9097U = 5
        }
        public enum EnCoderType
        {
            手動發行機,
            自動發行機,
            MSR206磁卡
        }
        private const string IFC_DllFileName = "MainDll.Dll";
        [DllImport("MainDll.Dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
        public static extern int SetPort(int Soft, int Port, int EncoderType, int TMEncoder);
        [DllImport("MainDll.Dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
        public static extern int Reader_Beep(int Sound);
        [DllImport("MainDll.Dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
        public static extern int EndSession();
        [DllImport("MainDll.Dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
        public static extern void ChangeUser(string username);
        [DllImport("MainDll.Dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
        public static extern int Init(int Soft, string Server, string UName, int EnCoderType, int TMEncoder);
        [DllImport("MainDll.Dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
        public static extern int NewKey(string RoomNo, string Gate, string StartTime, string GuestName, string GuestId, int OverFlag, out int CardNo, string str1, string str2);
        [DllImport("MainDll.Dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
        public static extern int AddKey(string RoomNo, string Gate, string StartTime, string GuestName, string GuestId, int OverFlag, out int CardNo, string str1, string str2);
        [DllImport("MainDll.Dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
        public static extern int DupKey(string RoomNo, string Gate, string StartTime, string GuestName, string GuestId, int OverFlag, out int CardNo, string str1, string str2);
        [DllImport("MainDll.Dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
        public static extern int ReadCard(StringBuilder room, StringBuilder gate, StringBuilder stime, StringBuilder guestname, StringBuilder guestid, StringBuilder track1, StringBuilder track2, ref int cardno, ref int st);
        [DllImport("MainDll.Dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
        public static extern int EraseCard(int CardNo, string str1, string str2);
        [DllImport("MainDll.Dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
        public static extern int CheckOut(string RoomNo, int CardNo);
        [DllImport("MainDll.Dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
        public static extern int LostCard(string RoomNo, int CardNo);
        [DllImport("MainDll.Dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
        public static extern int ReadCardId(ref uint cardNo);
        [DllImport("MainDll.Dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
        public static extern int ReadIC(int start, int len, StringBuilder buff);
        [DllImport("MainDll.Dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
        public static extern int WriteIC(int start, int len, StringBuilder buff);
        public static void ShowMessageResult(int iResult, bool ifSystemBarNotity)
        {
            string text = string.Empty;
            switch (iResult)
            {
            case 0:
                text = "門口接口調用,操作成功!";
                break;
            case 1:
                text = "讀寫錯誤或者數據錯誤!";
                break;
            case 2:
                text = "卡已損壞!";
                break;
            case 3:
                text = "沒有檢測到卡!";
                break;
            case 4:
                text = "串口通信錯誤,請檢測連接線!";
                break;
            case 5:
                text = "卡被更換!";
                break;
            case 6:
                text = "不是新卡!";
                break;
            case 7:
                text = "卡是新卡!";
                break;
            case 8:
                text = "非本系統卡!";
                break;
            case 9:
                text = "不是客人卡!";
                break;
            case 10:
                text = "不是會員卡!";
                break;
            case 11:
                text = "密碼錯誤!";
                break;
            case 12:
                text = "無開門記錄!";
                break;
            case 13:
                text = "卡型不正確!";
                break;
            case 14:
                text = "參數錯誤!";
                break;
            case 15:
                text = "用戶取消操作(按下<ESC>鍵)!";
                break;
            case 16:
                text = "等待超時!";
                break;
            case 17:
                text = "插卡錯誤!";
                break;
            case 18:
                text = "卡是空白卡或插卡錯誤!";
                break;
            case 19:
                text = "19";
                break;
            case 20:
                text = "沒有調用Init函數!";
                break;
            case 21:
                text = "不支持該版本的門鎖軟件!";
                break;
            case 22:
                text = "連接(門鎖系統數據庫)錯誤!";
                break;
            case 23:
                text = "門鎖系統參數不存在!";
                break;
            case 24:
                text = "初始化失敗!";
                break;
            case 25:
                text = "沒有客人在住/指定客人不存在!";
                break;
            case 26:
                text = "客房已滿!";
                break;
            case 27:
                text = "沒有此卡記錄!";
                break;
            case 28:
                text = "沒有調用SetPort函數!";
                break;
            case 29:
                text = "無效的客房房號!";
                break;
            case 30:
                text = "錯誤的時間范圍!";
                break;
            case 31:
                text = "卡號已存在,無法登記!";
                break;
            case 32:
                text = "不支持調用!";
                break;
            case 33:
                text = "無效的授權碼,授權碼錯誤或過期!";
                break;
            }
            if (ifSystemBarNotity)
            {
                Utility.NotifyMessageBox(text, "接口系統提示");
            }
            else
            {
                MessageBox.Show(text, "接口系統提示");
            }
        }
    }

posdll.dll(北洋打印機封裝的OPOS指令打印DLL)

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.IO.Ports;

namespace PosPrintService
{
    /// <summary>
    /// 北洋OPOS指令集二次開發包DLL調用  
    ///   
    public class BeiYangOPOS
    {
        const string _DllVer = "1.4";
        /// <summary>
        /// 獲取動態庫版本號
        /// </summary>
        public string GetDllVer
        {
            get { return _DllVer;}
        }

      
        /// <summary>
        /// 設備打開后的句柄
        /// </summary>
        public IntPtr POS_IntPtr;

        /// <summary>
        /// 函數返回值
        /// </summary>
        public uint POS_SUCCESS = 1001;//  函數執行成功 
        public uint POS_FAIL = 1002;   //  函數執行失敗 
        public uint POS_ERROR_INVALID_HANDLE = 1101; // 端口或文件的句柄無效 
        public uint POS_ERROR_INVALID_PARAMETER = 1102;// 參數無效 
        public uint POS_ERROR_NOT_BITMAP = 1103 ; // 不是位圖格式的文件 
        public uint POS_ERROR_NOT_MONO_BITMAP = 1104;// 位圖不是單色的 
        public uint POS_ERROR_BEYONG_AREA = 1105 ;//位圖超出打印機可以處理的大小 
        public uint POS_ERROR_INVALID_PATH = 1106; // 沒有找到指定的文件路徑或名 

        /// <summary>
        /// 停止位
        /// </summary>
        public uint POS_COM_ONESTOPBIT = 0x00;//停止位為1
        public uint POS_COM_ONE5STOPBITS = 0x01;//停止位為1.5
        public uint POS_COM_TWOSTOPBITS = 0x02;//停止位為2
        /// <summary>
        /// 奇偶校驗
        /// </summary>
        public uint POS_COM_NOPARITY = 0x00;//無校驗
        public uint POS_COM_ODDPARITY = 0x01;//奇校驗
        public uint POS_COM_EVENPARITY = 0x02;//偶校驗
        public uint POS_COM_MARKPARITY = 0x03;//標記校驗
        public uint POS_COM_SPACEPARITY = 0x04;//空格校驗
        /// <summary>
        /// 其他COM口參數及端口類型定義
        /// </summary>
        public uint POS_COM_DTR_DSR = 0x00;// 流控制為DTR/DST  
        public uint POS_COM_RTS_CTS = 0x01;// 流控制為RTS/CTS 
        public uint POS_COM_XON_XOFF = 0x02;// 流控制為XON/OFF 
        public uint POS_COM_NO_HANDSHAKE = 0x03;//無握手 
        public uint POS_OPEN_PARALLEL_PORT = 0x12;//打開並口通訊端口 
        public uint POS_OPEN_BYUSB_PORT = 0x13;//打開USB通訊端口 
        public uint POS_OPEN_PRINTNAME = 0X14;// 打開打印機驅動程序 
        public uint POS_OPEN_NETPORT = 0x15;// 打開網絡接口 

        public uint POS_CUT_MODE_FULL = 0x00;// 全切 
        public uint POS_CUT_MODE_PARTIAL = 0x01;// 半切 

        /// <summary>
        /// 打開POS機的端口 開始會話
        /// </summary>
        /// <param name="lpName">
        ///指向以 null 結尾的打印機名稱或端口名稱。
        ///當參數nParam的值為POS_COM_DTR_DSR、POS_COM_RTS_CTS、POS_COM_XON_XOFF或POS_COM_NO_HANDSHAKE 時, “COM1”,“COM2”,“COM3”,“COM4”等表示串口;
        ///當參數nParam的值為POS_OPEN_PARALLEL_PORT時,“LPT1”,“LPT2”等表示並口;
        ///當參數nParam的值為POS_OPEN_BYUSB_PORT時,“BYUSB-0”、“BYUSB-1”、“BYUSB-2”、“BYUSB-3”等表示USB端口。
        ///當參數nParam的值為POS_OPEN_PRINTNAME時,表示打開指定的打印機。
        ///當參數nParam的值為POS_OPEN_NETPORT時,表示打開指定的網絡接口,如“192.168.10.251”表示網絡接口IP地址</param>
        /// <param name="nComBaudrate">串口通信需要的波特率</param>
        /// <param name="nComDataBits">串口通信需要的數據位</param>
        /// <param name="nComStopBits">串口通信需要的停止位</param>
        /// <param name="nComParity">串口通信需要的是否要奇偶校驗</param>
        /// <param name="nParam">指向以 null 結尾的打印機名稱或端口名稱。
        /// 參數nParam的值為POS_COM_DTR_DSR、POS_COM_RTS_CTS、POS_COM_XON_XOFF或POS_COM_NO_HANDSHAKE 時,
        /// “COM1”,“COM2”,“COM3”,“COM4”等表示串口;
        /// 當參數nParam的值為POS_OPEN_PARALLEL_PORT時,“LPT1”,“LPT2”等表示並口;
        /// 當參數nParam的值為POS_OPEN_BYUSB_PORT時,“BYUSB-0”、“BYUSB-1”、“BYUSB-2”、“BYUSB-3”等表示USB端口。
        /// 當參數nParam的值為POS_OPEN_PRINTNAME時,表示打開指定的打印機。</param>
        /// <returns>如果函數調用成功,返回一個已打開的端口句柄。如果函數調用失敗,返回值為 INVALID_HANDLE_VALUE (-1)。</returns>
        [DllImport("POSDLL.dll", CharSet = CharSet.Ansi)]
        public static extern IntPtr POS_Open([MarshalAs(UnmanagedType.LPStr)]string lpName, 
                                             uint nComBaudrate, 
                                             uint nComDataBits, 
                                             uint nComStopBits, 
                                             uint nComParity,
                                             uint nParam);

        /// <summary>
        /// 關閉已經打開的並口或串口,USB端口,網絡接口或打印機。
        /// </summary>
        /// <returns></returns>
        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_Close();

        /// <summary>
        /// 復位打印機,把打印緩沖區中的數據清除,字符和行高的設置被清除,打印模式被恢復到上電時的缺省模式。
        /// </summary>
        /// <returns></returns>
        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_Reset();

        /// <summary>
        /// 設置打印機的移動單位。
        /// </summary>
        /// <param name="nHorizontalMU">把水平方向上的移動單位設置為 25.4 / nHorizontalMU 毫米。可以為0到255。</param>
        /// <param name="nVerticalMU">把垂直方向上的移動單位設置為 25.4 / nVerticalMU 毫米。可以為0到255。</param>
        /// <returns>
        /// 如果函數成功,則返回值為 POS_SUCCESS。
        /// 如果函數失敗,則返回值為以下值之一:POS_FAIL POS_ERROR_INVALID_HANDLE POS_ERROR_INVALID_PARAMETER </returns>
        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_SetMotionUnit(uint nHorizontalMU, uint nVerticalMU);
        /// <summary>
        /// 選擇國際字符集和代碼頁
        /// </summary>
        /// <param name="nCharSet">
        /// 指定國際字符集。不同的國際字符集對0x23到0x7E的ASCII碼值對應的符號定義是不同的。
        /// 可以為以下列表中所列值之一。
        /// 0x00 U.S.A  0x01 France  0x02 Germany  0x03 U.K. 0x04 Denmark I 0x05 Sweden 
        /// 0x06 Italy 0x07 Spain I  0x08 Japan 0x09 Nonway 0x0A Denmark II 0x0B Spain II 
        /// 0x0C Latin America 0x0D Korea </param>
        /// <param name="nCodePage">
        /// 指定字符的代碼頁。不同的代碼頁對0x80到0xFF的ASCII碼值對應的符號定義是不同的。
        /// 0x00 PC437 [U.S.A. Standard Europe 0x01 Reserved 0x02 PC850 [Multilingual] 
        /// 0x03 PC860 [Portuguese] 0x04 PC863 [Canadian-French] 0x05 PC865 [Nordic] 
        /// 0x12 PC852 0x13 PC858 
        /// </param>
        /// <returns>
        /// 如果函數成功,則返回值為 POS_SUCCESS。
        /// 如果函數失敗,則返回值為以下值之一:POS_FAIL POS_ERROR_INVALID_HANDLE POS_ERROR_INVALID_PARAMETER </returns>
        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_SetCharSetAndCodePage(uint nCharSet, uint nCodePage);

        /// <summary>
        /// POS字體樣式
        /// </summary>
        /// 
        public uint  POS_FONT_TYPE_STANDARD  = 0x00;// 標准 ASCII 
        public uint  POS_FONT_TYPE_COMPRESSED = 0x01;// 壓縮 ASCII  
        public uint  POS_FONT_TYPE_UDC = 0x02;       // 用戶自定義字符 
        public uint  POS_FONT_TYPE_CHINESE = 0x03;   // 標准 “宋體” 
        public uint  POS_FONT_STYLE_NORMAL =  0x00;   //  正常 
        public uint  POS_FONT_STYLE_BOLD =  0x08;   //  加粗 
        public uint  POS_FONT_STYLE_THIN_UNDERLINE =  0x80;   //  1點粗的下划線 
        public uint  POS_FONT_STYLE_THICK_UNDERLINE =  0x100;   //  2點粗的下划線 
        public uint  POS_FONT_STYLE_UPSIDEDOWN =  0x200;   //  倒置(只在行首有效) 
        public uint  POS_FONT_STYLE_REVERSE =  0x400;   //  反顯(黑底白字) 
        public uint  POS_FONT_STYLE_SMOOTH =  0x800;   //  平滑處理(用於放大時) 
        public uint POS_FONT_STYLE_CLOCKWISE_90 = 0x1000;   //  每個字符順時針旋轉 90 度

        /// <summary>
        /// 把將要打印的字符串數據發送到打印緩沖區中,並指定X 方向(水平)上的絕對起始點位置,
        /// 指定每個字符寬度和高度方向上的放大倍數、類型和風格。
        /// </summary>
        /// <param name="pszString">指向以 null 結尾的字符串緩沖區</param>
        /// <param name="nOrgx">指定 X 方向(水平)的起始點位置離左邊界的點數。</param>
        /// <param name="nWidthTimes">指定字符的寬度方向上的放大倍數。可以為 1到 6。</param>
        /// <param name="nHeightTimes">指定字符高度方向上的放大倍數。可以為 1 到 6。</param>
        /// <param name="nFontType">指定字符的字體類型。</param>
        /// <param name="nFontStyle">指定字符的字體風格。</param>
        /// <returns></returns>
        
        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_S_TextOut([MarshalAs(UnmanagedType.LPStr)]string pszString, 
                                                   uint nOrgx, uint nWidthTimes, uint nHeightTimes, 
                                                   uint nFontType, uint nFontStyle);

        /// <summary>
        /// 設置POS的打印模式 (只有兩種 頁模式和標准模式)
        /// </summary>
        /// <param name="nPrintMode">
        /// POS_PRINT_MODE_STANDARD 0x00 標准模式(行模式) 
        /// POS_PRINT_MODE_PAGE 0x01 頁模式 
        /// POS_PRINT_MODE_BLACK_MARK_LABEL 0x02 黑標記標簽模式 
        /// POS_PRINT_MODE_WHITE_MARK_LABEL 0x03 白標記標簽模式 </param>
        /// <returns></returns>
        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_SetMode(uint nPrintMode);
        /// <summary>
        /// 設置字符的行高。
        /// </summary>
        /// <param name="nDistance">指定行高點數。可以為 0 到 255。每點的距離與打印頭分辨率相關。</param>
        /// <returns></returns>
        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_SetLineSpacing(uint nDistance);
        /// <summary>
        /// 設置字符的右間距(相鄰兩個字符的間隙距離)。
        /// </summary>
        /// <param name="nDistance">指定右間距的點數。可以為 0 到 255。每點的距離與打印頭分辨率相關。</param>
        /// <returns></returns>
        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_SetRightSpacing(int nDistance);

        /// <summary>
        /// 向前走紙。
        /// 1.如果在標准打印模式(行模式)下打印文本,則打印緩沖區中的數據,且打印位置自動移動到下一行的行首。
        /// 2.如果在標准打印模式(行模式)下打印位圖,則在指定的位置打印位圖,且打印位置自動移動到下一行的行首。
        /// 3.如果在頁模式或標簽模式下,則把需要打印的數據設置在指定的位置,同時把打印位置移動到下一個行首,
        /// 但是並不立即進紙並打印,而是一直到調用 POS_PL_Print 函數時才打印。
        /// </summary>
        /// <returns></returns>
        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_FeedLine();
        /// <summary>
        /// 打印頭換n行 
        /// </summary>
        /// <returns></returns>
        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_FeedLines(uint nLines);
        
        /// <summary>
        /// 切紙
        /// </summary>
        /// <param name="nMode">模式編號 半切或是全切</param>
        /// <param name="nDistance">走位的距離</param>
        /// <returns></returns>
        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_CutPaper(uint nMode, uint nDistance);

        /// <summary>
        /// 設置右邊距
        /// </summary>
        /// <param name="nDistance">右邊距</param>
        /// <returns></returns>
        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_SetRightSpacing(uint nDistance);
        /// <summary>
        /// 預下載一幅位圖到打印機的 RAM 中,同時指定此位圖的 ID 號。
        /// </summary>
        /// <param name="pszPath">指向以 null 結尾的表示位圖路徑及其文件名的字符串。</param>
        /// <param name="nID">指定將要下載的位圖的 ID 號。可以為 0 到 7。</param>
        /// <returns></returns>
        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_PreDownloadBmpToRAM([MarshalAs(UnmanagedType.LPStr)]string pszPath, uint nID);
        /// <summary>
        /// 下載並打印位圖
        /// </summary>
        /// <param name="pszPath">指向以null 結尾的包含位圖文件路徑及其名稱的字符串。</param>
        /// <param name="nOrgx">指定將要打印的位圖和左邊界的距離點數。可以為 0到 65535 點。</param>
        /// <param name="nMode">指定位圖的打印模式。</param>
        /// <returns></returns>
        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_S_DownloadAndPrintBmp([MarshalAs(UnmanagedType.LPStr)]string pszPath, uint nOrgx, uint nMode);

        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_S_PrintBmpInRAM(uint nID, uint nOrgx, uint nMode);

        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_S_PrintBmpInFlash(uint nID, uint nOrgx, uint nMode);

        /// <summary>
        /// 通過串口返回當前打印機的狀態。此函數是實時的。
        /// </summary>
        /// <param name="address"></param>
        /// <returns></returns>
        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_RTQueryStatus(byte[] address);

        /// <summary>
        /// 通過串口查詢打印機當前的狀態。此函數是非實時的。
        /// </summary>
        /// <param name="pszStatus">
        /// 指向返回的狀態數據的緩沖區,緩沖區大小為 1 個字節。
        /// 0,1 0/1 容紙器中有紙 / 紙將用盡 2,3 0/1 打印頭處有紙 / 無紙 
        /// 4,5 0/1 錢箱連接器引腳 3 的電平為低 / 高(表示打開或關閉) 
        /// 6,7 0 保留(固定為0) 
        /// </param>
        /// <param name="nTimeouts">設置查詢狀態時大約的超時時間(毫秒)。</param>
        /// <returns></returns>
        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_QueryStatus(byte[] pszStatus, int nTimeouts);
        /// <summary>
        /// 通過網絡接口查詢返回當前打印機的狀態。
        /// </summary>
        /// <param name="ipAddress">設備IP地址。如“192.168.10.251”。</param>
        /// <param name="pszStatus">
        /// 指向接收返回狀態的緩沖區,緩沖區大小為 1 個字節。 
        /// 0 0/1 錢箱連接器引腳 3 的電平為低/高(表示打開或關閉) 
        /// 1 0/1 打印機聯機/脫機 
        /// 2 0/1 上蓋關閉/打開 
        /// 3 0/1 沒有/正在由Feed鍵按下而進紙 
        /// 4 0/1 打印機沒有/有出錯 
        /// 5 0/1 切刀沒有/有出錯 
        /// 6 0/1 有紙/紙將盡(紙將盡傳感器探測) 
        /// 7 0/1 有紙/紙用盡(紙傳感器探測) 
        /// </param>
        /// <returns></returns>
        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern int POS_NETQueryStatus([MarshalAs(UnmanagedType.LPStr)]string ipAddress, out Byte pszStatus);

        
        /// <summary>
        /// 設置並打印條碼。
        /// </summary>
        /// <param name="pszInfo">指向以 null 結尾的字符串。每個字符允許的范圍和格式與具體條碼類型有關。</param>
        /// <param name="nOrgx">指定將要打印的條碼的水平起始點與左邊界的距離點數。可以為 0 到65535。</param>
        /// <param name="nType">
        /// 指定條碼的類型。可以為以下列表中所列值之一。
        /// POS_BARCODE_TYPE_UPC_A 0x41 UPC-A POS_BARCODE_TYPE_UPC_E 0x42 UPC-C 
        /// POS_BARCODE_TYPE_JAN13 0x43 JAN13(EAN13) POS_BARCODE_TYPE_JAN8 0x44 JAN8(EAN8) 
        /// POS_BARCODE_TYPE_CODE39 0x45 CODE39 POS_BARCODE_TYPE_ITF 0x46 INTERLEAVED 2 OF 5 
        /// POS_BARCODE_TYPE_CODEBAR 0x47 CODEBAR POS_BARCODE_TYPE_CODE93 0x48 25 
        /// POS_BARCODE_TYPE_CODE128 0x49 CODE 128 </param>
        /// <param name="nWidthX">
        /// 指定條碼的基本元素寬度。
        /// 2 0.25mm 0.25mm 0.625mm 3 0.375mm 0.375mm 1.0mm 4 0.5mm 0.5mm 1.25mm 
        /// 5 0.625mm 0.625mm 1.625mm 6 0.75mm 0.75mm 1.875mm 
        /// </param>
        /// <param name="nheight">指定條碼的高度點數。可以為 1 到 255 。默認值為162 點。</param>
        /// <param name="nHriFontType">
        /// 指定 HRI(Human Readable Interpretation)字符的字體類型。可以為以下列表中所列值之一。
        /// POS_FONT_TYPE_STANDARD 0x00 標准ASCII POS_FONT_TYPE_COMPRESSED 0x01 壓縮ASCII 
        /// </param>
        /// <param name="nHriFontPosition">
        /// 指定HRI(Human Readable Interpretation)字符的位置。
        /// POS_HRI_POSITION_NONE  0x00 不打印 POS_HRI_POSITION_ABOVE 0x01 只在條碼上方打印 
        /// POS_HRI_POSITION_BELOW 0x02 只在條碼下方打印 POS_HRI_POSITION_BOTH  0x03 條碼上、下方都打印 
        /// </param>
        /// <param name="nBytesOfInfo">指定由參數 pszInfoBuffer指向的字符串個數,即將要發送給打印機的字符總數。具體值與條碼類型有關。</param>
        /// <returns></returns>
        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_S_SetBarcode([MarshalAs(UnmanagedType.LPStr)]string pszInfo,
                                                      uint nOrgx,uint nType,uint nWidthX,uint nheight,
                                                      uint nHriFontType,uint nHriFontPosition,uint nBytesOfInfo);


        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_PL_SetArea(uint nOrgx , uint nOrgY , uint nWidth , uint nheight , uint nDirection );

        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_PL_TextOut([MarshalAs(UnmanagedType.LPStr)]string pszString,uint nOrgx,uint nOrgY, 
                                                   uint nWidthTimes, uint nHeightTimes, uint nFontType, uint nFontStyle);

        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_PL_PrintBmpInRAM(uint nID , uint nOrgx , uint nOrgY , uint nMode );

        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_PL_PrintBmpInFlash(uint nID, uint nOrgx, uint nOrgY, uint nMode);

        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_PL_SetBarcode([MarshalAs(UnmanagedType.LPStr)]string pszInfo, 
                                                       uint nOrgx , uint nOrgY , uint nType , uint nWidthX,uint nheight,
                                                       uint nHriFontType,uint nHriFontPosition,uint nBytesOfInfo);

        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_PL_Clear();

        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_PL_Print();
        /// <summary>
        /// 往錢箱引腳發送脈沖以打開錢箱。
        /// </summary>
        /// <param name="nID">指定錢箱的引腳。0x00 錢箱連接器引腳2 0x01 錢箱連接器引腳5 </param>
        /// <param name="nOnTimes">指定往錢箱發送的高電平脈沖保持時間,即 nOnTimes × 2 毫秒。可以為1 到 255。</param>
        /// <param name="nOffTimes">指定往錢箱發送的低電平脈沖保持時間,即 nOffTimes × 2 毫秒。可以為1 到 255。</param>
        /// <returns></returns>
        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_KickOutDrawer(uint nID, uint nOnTimes, uint nOffTimes);
        /// <summary>
        /// 新建一個打印作業。
        /// </summary>
        /// <returns></returns>
        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern bool POS_StartDoc();
        /// <summary>
        /// 結束一個打印作業。
        /// </summary>
        /// <returns></returns>
        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern bool POS_EndDoc();
        /// <summary>
        /// 發送數據到端口或文件。通用端口打印可以使用此函數 一般不能設置字體大小樣式等
        /// </summary>
        /// <param name="hPort">端口或文件句柄。可以通過POS_Open來獲取</param>
        /// <param name="pszData">指向將要發送的數據緩沖區。</param>
        /// <param name="nBytesToWrite">指定將要發送的數據的字節數。</param>
        /// <returns></returns>
        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_WriteFile(IntPtr hPort, byte[] pszData, uint nBytesToWrite);
        /// <summary>
        /// 從串口,或USB端口或文件讀數據到指定的緩沖區。
        /// </summary>
        /// <param name="hPort">端口或文件句柄。可以通過POS_Open來獲取</param>
        /// <param name="pszData">指向將要讀取的數據緩沖區。</param>
        /// <param name="nBytesToRead">數據的字節數</param>
        /// <param name="nTimeouts">可能是讀取數據的間隔時間</param>
        /// <returns></returns>
        [DllImport("POSDLL.dll", SetLastError = true)]
        public static extern IntPtr POS_ReadFile(IntPtr hPort, byte[] pszData, uint nBytesToRead, uint nTimeouts);

        /// <summary>
        /// 打開打印設備的串口
        /// </summary>
        /// <param name="PrintSerialPort">串口對象(需要先初始化並測試參數都有效的情況下,傳進來)</param>
        /// <returns>是否打開成功</returns>
        public bool OpenComPort(ref SerialPort PrintSerialPort)
        { 
            uint i_stopbits=0;
            if (PrintSerialPort.StopBits== StopBits.One)
                i_stopbits=POS_COM_ONESTOPBIT;
            if (PrintSerialPort.StopBits== StopBits.OnePointFive)
                i_stopbits=POS_COM_ONE5STOPBITS;
            if (PrintSerialPort.StopBits== StopBits.Two)
                i_stopbits=POS_COM_TWOSTOPBITS;

            uint i_nComParity=0;
            if (PrintSerialPort.Parity== Parity.None)
                i_nComParity=POS_COM_NOPARITY;
            if (PrintSerialPort.Parity== Parity.Even)
                i_nComParity=POS_COM_EVENPARITY;
            if (PrintSerialPort.Parity== Parity.Odd)
                i_nComParity=POS_COM_ODDPARITY;
            if (PrintSerialPort.Parity== Parity.Space)
                i_nComParity=POS_COM_SPACEPARITY;
            if (PrintSerialPort.Parity== Parity.Mark)
                i_nComParity=POS_COM_MARKPARITY;

            uint i_para=0;
            if (PrintSerialPort.Handshake== Handshake.None)
                i_para=POS_COM_NO_HANDSHAKE;
            if (PrintSerialPort.Handshake== Handshake.RequestToSend)
                i_para=POS_COM_DTR_DSR;
            if (PrintSerialPort.Handshake== Handshake.RequestToSendXOnXOff)
                i_para=POS_COM_RTS_CTS;
            if (PrintSerialPort.Handshake== Handshake.XOnXOff)
                i_para=POS_COM_XON_XOFF;

            POS_IntPtr = POS_Open(PrintSerialPort.PortName, 
                                 (uint)PrintSerialPort.BaudRate,
                                 (uint)PrintSerialPort.DataBits,
                                 i_stopbits, i_nComParity, i_para);

            if ((int)POS_IntPtr != -1)
                return true;
            else
                return false;
        }
        /// <summary>
        /// 打開打印設備並口
        /// </summary>
        /// <param name="LPTPortName">並口名稱</param>
        /// <returns>是否打開成功</returns>
        public bool OpenLPTPort(string LPTPortName)
        {
            POS_IntPtr = POS_Open(LPTPortName, 0, 0, 0, 0, POS_OPEN_PARALLEL_PORT);
            if ((int)POS_IntPtr != -1)
                return true;
            else
                return false;
        }
        /// <summary>
        /// 打開打印設備的網口
        /// </summary>
        /// <param name="IPAddress">設備的IP地址</param>
        /// <returns>是否打開成功</returns>
        public bool OpenNetPort(string IPAddress)
        {
            POS_IntPtr = POS_Open(IPAddress, 0, 0, 0, 0, POS_OPEN_NETPORT);
            if ((int)POS_IntPtr != -1)
                return true;
            else
                return false;
        }
        /// <summary>
        /// 打開打印設備的USB端口
        /// </summary>
        /// <param name="USBPortName">“BYUSB-0”、“BYUSB-1”、“BYUSB-2”、“BYUSB-3”</param>
        /// <returns>是否打開成功</returns>
        public bool OpenUSBPort(string USBPortName)
        {
            POS_IntPtr = POS_Open(USBPortName, 0, 0, 0, 0, POS_OPEN_BYUSB_PORT);
            if ((int)POS_IntPtr != -1)
                return true;
            else
                return false;
        }
        /// <summary>
        /// 使用windows打印驅動程序來驅動OPOS設備
        /// </summary>
        /// <param name="PrintName">打印驅動程序對應的打印機名稱</param>
        /// <returns>是否打開成功</returns>
        public bool OpenPrinter(string PrintName)
        {
            POS_IntPtr = POS_Open(PrintName, 0, 0, 0, 0, POS_OPEN_PRINTNAME);
            if ((int)POS_IntPtr != -1)
                return true;
            else
                return false;
        }
        /// <summary>
        /// 關閉設備端口
        /// </summary>
        /// <returns>是否關閉成功</returns>
        public bool ClosePrinterPort()
        {
            IntPtr tmpIntPtr = POS_Close();
            return ((uint)tmpIntPtr == POS_SUCCESS);
        }
    }
}

tsclib.dll(GP3120條形碼打印機API)

 

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace Com.DataCool.GP3120API
{
    /// <summary>
    /// GP 3120條形碼打印機API 分辨率:203 DPI
    /// (單位換算:200 DPI,1 點=1/8 mm, 300 DPI,1 點=1/12 mm)
    /// </summary>
    public class TSC_Lib_API
    {
        /// <summary>
        /// 指定計算機端的輸出端口 單機打印時,請指定打印機驅動程序名稱,例如: TSC TDP-245
        /// 打開端口 獨占打印機
        /// </summary>
        /// <param name="PrinterName"></param>
        /// <returns></returns>
        [DllImport("tsclib.dll")]
        public static extern int openport(string PrinterName);

        /// <summary>
        /// 關閉指定的計算機端輸出端口 結束端口的獨占
        /// </summary>
        /// <returns></returns>
        [DllImport("tsclib.dll")]
        public static extern int closeport();

        /// <summary>
        /// 發送指令
        /// </summary>
        /// <param name="Command">內建指令見指令集pdf</param>
        /// <returns></returns>
        [DllImport("tsclib.dll")]
        public static extern int sendcommand(string Command);

        /// <summary>
        /// 清空打印機的緩沖區
        /// </summary>
        /// <returns></returns>
        [DllImport("tsclib.dll")]
        public static extern int clearbuffer();

        /// <summary>
        /// 跳頁,該函數需在setup 后使用
        /// </summary>
        /// <returns></returns>
        [DllImport("tsclib.dll")]
        public static extern int formfeed();

        /// <summary>
        /// 設定紙張不回吐
        /// </summary>
        /// <returns></returns>
        [DllImport("tsclib.dll")]
        public static extern int nobackfeed();

        /// <summary>
        /// 設定標簽的寬度、高度、打印速度、打印濃度、傳感器類別、gap/black mark 垂直間距、gap/black mark 偏移距離)
        /// </summary>
        /// <param name="LabelWidth">標簽寬度,單位mm</param>
        /// <param name="LabelHeight">標簽高度,單位mm</param>
        /// <param name="Speed">打印速度  1.0: 每秒1.0 英寸打印速度 1.0,1.5,2.0,3.0,4.0,5.0,6.0</param>
        /// <param name="Density">打印濃度 0~15,數字越大打印結果越黑</param>
        /// <param name="Sensor">傳感器類別 0 表示使用垂直間距傳感器(gap sensor) 1 表示使用黑標傳感器(black mark sensor) f垂直間距高度,g偏移距離 mm</param>
        //                       f: 字符串型別,設定gap/black mark 垂直間距高度,單位: mm
        //                       g: 字符串型別,設定gap/black mark 偏移距離,單位: mm,此參數若使用一般標簽 時均設為0
        /// <param name="Vertical">?</param>
        /// <param name="Offset">設定gap/black mark 偏移距離,單位: mm,此參數若使用一般標簽時均設為0</param>
        /// <returns></returns>
        [DllImport("tsclib.dll")]
        public static extern int setup(string LabelWidth, string LabelHeight, string Speed, string Density, string Sensor, string Vertical, string Offset);

        /// <summary>
        /// 下載單色PCX 格式圖文件至打印機
        /// </summary>
        /// <param name="Filename">文件名(可包含路徑)</param>
        /// <param name="ImageName">下載至打印機內存內之文件名(請使用大寫文件名)</param>
        /// <returns></returns>
        [DllImport("tsclib.dll")]
        public static extern int downloadpcx(string Filename, string ImageName);

        /// <summary>
        /// 使用條形碼機內建條形碼打印
        /// </summary>
        /// <param name="X">條形碼X 方向起始點</param>
        /// <param name="Y">條形碼Y 方向起始點</param>
        /// <param name="CodeType">一維條碼類型 128 128M EAN128 25 25C 39 39C 93 EAN13 ...</param>
        ////// </param>
        /// <param name="Height">條形碼高度,高度以點來表示</param>
        /// <param name="Readable">是否打印條形碼碼文0: 不打印碼文1: 打印碼文</param>
        /// <param name="Rotation">條形碼旋轉角度0: 旋轉0 度90: 旋轉90 度180: 旋轉180 度270: 旋轉270 度</param>
        /// <param name="Narrow">條形碼窄bar 比例因子 請參考編程手冊</param>
        /// <param name="Wide">設定條形碼窄bar 比例因子 請參考編程手冊</param>
        /// <param name="Code">條形碼內容</param>
        /// <returns></returns>
        [DllImport("tsclib.dll")]
        public static extern int barcode(string X, string Y, string CodeType, string Height, string Readable, string Rotation, string Narrow, string Wide, string Code);

        /// <summary>
        /// 使用條形碼機內建文字打印 (打印機硬字庫)
        /// </summary>
        /// <param name="X">文字X 方向起始點</param>
        /// <param name="Y">文字Y 方向起始點</param>
        /// <param name="FontName">內建字型名稱 1~5 TST24.BF2 TSS24.BF2 K</param>      
        /// <param name="Rotation">文字旋轉角度 0~270(90的倍數)</param>
        /// <param name="Xmul">文字X 方向放大倍數,1~8</param>
        /// <param name="Ymul">文字Y 方向放大倍數,1~8</param>
        /// <param name="Content">文字內容</param>
        /// <returns></returns>
        [DllImport("tsclib.dll")]
        public static extern int printerfont(string X, string Y, string FontName, string Rotation, string Xmul, string Ymul, string Content);

        /// <summary>
        /// 打印條形碼 (調用緩沖區設置的條碼)
        /// </summary>
        /// <param name="NumberOfSet">打印標簽個數(set)</param>
        /// <param name="NumberOfCopoy">打印標簽份數(copy)</param>
        /// <returns></returns>
        [DllImport("tsclib.dll")]
        public static extern int printlabel(string NumberOfSet, string NumberOfCopoy);

        /// <summary>
        /// 使用Windows TTF 字型打印文字
        /// </summary>
        /// <param name="X">X 方向起始點</param>
        /// <param name="Y">Y 方向起始點</param>
        /// <param name="FontHeight">字體高度</param>
        /// <param name="Rotation">旋轉的角度 0~270(90的倍數)</param>
        /// <param name="FontStyle">字體外形 0-> 標准(Normal) 1-> 斜體(Italic) 2-> 粗體(Bold) 3-> 粗斜體(Bold and Italic)</param>
        /// <param name="FontUnderline">底線0-> 無底線 1-> 加底線</param>
        /// <param name="FaceName">字體名稱。如: Arial, Times new Roman, 細名體, 標楷體</param>
        /// <param name="TextContect">文字內容</param>
        /// <returns></returns>
        [DllImport("tsclib.dll")]
        public static extern int windowsfont(int X, int Y, int FontHeight, int Rotation, int FontStyle, int FontUnderline, string FaceName, string TextContect);
    }
}

umf.dll(明泰非接觸式RF讀寫器)

public class S9Dll
    {
        /// <summary>
        /// 初始化通訊口
        /// </summary>
        /// <param name="port">USB通訊口,取值0-99</param>
        /// <param name="baud">通訊波特率,9600-115200</param>
        /// <returns>成功返回串口標識符值,失敗返回-1</returns>
        [DllImport("umf.dll", EntryPoint = "fw_init")]
        public static extern Int32 fw_init(Int16 port, Int32 baud);

        /// <summary>
        /// 關閉端口
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <returns></returns>
        [DllImport("umf.dll", EntryPoint = "fw_exit")]
        public static extern Int32 fw_exit(Int32 icdev);

        /// <summary>
        /// 尋卡,能返回在工作區域內某張卡的序列號
        /// </summary>
        /// <param name="icdev">通訊標識符</param>
        /// <param name="_Bcnt">尋卡模式,0---表示IDLE模式,一次只對一張卡;1---表示ALL模式,一次可對應多張卡</param>
        /// <param name="_Snr">返回的卡序列號</param>
        /// <returns>成功返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_card")]
        public static extern Int32 fw_card(Int32 icdev, Byte _Mode, ref ulong _Snr);

        /// <summary>
        /// 尋卡,能返回在工作區域內某張卡的序列號(16進制)
        /// </summary>
        /// <param name="icdev">通訊標識符</param>
        /// <param name="_Mode">尋卡模式,0---表示IDLE模式,一次只對一張卡;1---表示ALL模式,一次可對應多張卡</param>
        /// <param name="_Snr">返回的卡序列號</param>
        /// <returns>成功返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_card_hex")]
        public static extern Int32 fw_card_hex(Int32 icdev, Byte _Mode, ref Byte _Snr);

        /// <summary>
        /// 尋卡,能返回在工作區域內某張卡的序列號(10進制)
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <param name="_Mode">尋卡模式,0---表示IDLE模式,一次只對一張卡;1---表示ALL模式,一次可對應多張卡</param>
        /// <param name="_Snr">返回的卡序列號</param>
        /// <returns>成功返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_card_str")]
        public static extern Int32 fw_card_str(Int32 icdev, Byte _Mode, ref Byte _Snr);

        /// <summary>
        /// 尋卡請求
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <param name="_Mode">尋卡模式,0---表示IDLE模式,一次只對一張卡;1---表示ALL模式,一次可對應多張卡</param>
        /// <param name="_TagType">返回卡的類型值,4--MIFARE ONE(M1);2--S70;8--MIFARE PRO;68--ULTRA  LIGHT</param>
        /// <returns>成功返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_request")]
        public static extern Int32 fw_request(Int32 icdev, Byte _Mode, ref UInt32 _TagType);

        /// <summary>
        /// 防卡沖突,返回卡的序列號
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <param name="_Bcnt">防卡沖突的級別,這里值為0</param>
        /// <param name="_Snr">返回卡序列號地址</param>
        /// <returns>成功返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_anticoll")]
        public static extern Int32 fw_anticoll(Int32 icdev, Byte _Bcnt, ref ulong _Snr);

        /// <summary>
        /// 從多個卡中選取一個給定序列號的卡
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <param name="_Snr">卡序列號</param>
        /// <param name="_Size">指向返回的卡容量數據</param>
        /// <returns>成功返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_select")]
        public static extern Int32 fw_select(Int32 icdev, ulong _Snr, Byte _Size);

        /// <summary>
        /// 將密碼裝入讀寫模塊RAM中
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <param name="_Mode">裝入密碼模式,0--KEYA,4--KEYB</param>
        /// <param name="_SecNr">扇區號(M1卡:0-15;ML卡:0)</param>
        /// <param name="_NKey">寫入讀寫器中的卡密碼</param>
        /// <returns>成功返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_load_key")]
        public static extern Int32 fw_load_key(Int32 icdev, Byte _Mode, Byte _SecNr, Byte[] _NKey);

        /// <summary>
        /// 核對密碼函數
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <param name="_Mode">裝入密碼模式,0--KEYA,4--KEYB</param>
        /// <param name="_SecNr">要驗證密碼的扇區號</param>
        /// <returns>成功返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_authentication")]
        public static extern Int32 fw_authentication(Int32 icdev, Byte _Mode, Byte _SecNr);

        /// <summary>
        /// 核對密碼函數,用此函數時,可以不用執行fw_load_key函數
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <param name="_Mode">裝入密碼模式,0--KEYA,4--KEYB</param>
        /// <param name="_Addr">要驗證密碼的扇區號</param>
        /// <param name="_PassBuff">扇區密碼(6字節)</param>
        /// <returns>成功返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_authentication_pass")]
        public static extern Int32 fw_authentication_pass(Int32 icdev, Byte _Mode, Byte _Addr, Byte[] _PassBuff);

        /// <summary>
        /// 讀取卡中數據
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <param name="_Addr">M1卡---塊地址(0-63),MS70(0-255)</param>
        /// <param name="_Data">讀出數據,字符串是ASCII碼</param>
        /// <returns>成功返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_read")]
        public static extern Int32 fw_read(Int32 icdev, Byte _Addr, ref Byte _Data);

        /// <summary>
        /// 讀取卡中數據
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <param name="_Addr">M1卡---塊地址(0-63),MS70(0-255)</param>
        /// <param name="_Data">讀出數據,字符串是十六進制</param>
        /// <returns>成功返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_read_hex")]
        public static extern Int32 fw_read_hex(Int32 icdev, Byte _Addr, ref Byte _Data);

        /// <summary>
        /// 向卡中寫入數據
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <param name="_Addr">M1卡---塊地址(1-63),MS70(1-255)</param>
        /// <param name="_Data">要寫入的數據(字符串是ASCII碼)</param>
        /// <returns>成功返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_write")]
        public static extern Int32 fw_write(Int32 icdev, Byte _Addr, ref Byte _Data);

        /// <summary>
        /// 向卡中寫入數據
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <param name="_Addr">M1卡---塊地址(1-63),MS70(1-255)</param>
        /// <param name="_Data">要寫入的數據(十六進制)</param>
        /// <returns>成功返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_write_hex")]
        public static extern Int32 fw_write_hex(Int32 icdev, Byte _Addr, ref Byte _Data);

        /// <summary>
        /// 中止對該卡操作
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <returns>成功返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_halt")]
        public static extern Int32 fw_halt(Int32 icdev);

        /// <summary>
        /// DES算法加解密函數
        /// </summary>
        /// <param name="_Key">密鑰</param>
        /// <param name="_Sour">要加解密的數據</param>
        /// <param name="_Dest">加解密后的數據</param>
        /// <param name="_M">加解密模式,M=1時,為加密;M=0時,為解密</param>
        /// <returns>成功返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_des")]
        public static extern Int32 fw_des(ref Byte _Key, ref Byte _Sour, ref Byte _Dest, Int32 _M);

        /// <summary>
        /// 修改塊3的數據
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <param name="_SecNr">扇區號(M1:0-15,S70:0-39)</param>
        /// <param name="_KeyA">密碼A</param>
        /// <param name="_CtrlW">密碼控制塊</param>
        /// <param name="_Bk">保留參數,取值位0</param>
        /// <param name="_KeyB">密碼B</param>
        /// <returns>成功返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_changeb3")]
        public static extern Int32 fw_changeb3(Int32 icdev, Byte _SecNr, ref Byte _KeyA, ref Byte _CtrlW, Byte _Bk, ref Byte _KeyB);

        /// <summary>
        /// 初始化塊值
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <param name="_Addr">塊地址</param>
        /// <param name="_Value">初始值</param>
        /// <returns>成功返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_initval")]
        public static extern Int32 fw_initval(Int32 icdev, Byte _Addr, ulong _Value);

        /// <summary>
        /// 塊加值
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <param name="_Addr">塊地址</param>
        /// <param name="_Value">要增加的值</param>
        /// <returns>成功返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_increment")]
        public static extern Int32 fw_increment(Int32 icdev, Byte _Addr, ulong _Value);

        /// <summary>
        /// 讀塊值
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <param name="_Addr">塊地址</param>
        /// <param name="_Value">讀出值的地址</param>
        /// <returns>成功返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_readval")]
        public static extern Int32 fw_readval(Int32 icdev, Byte _Addr, ref ulong _Value);

        /// <summary>
        /// 塊減值
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <param name="_Addr">塊地址</param>
        /// <param name="_Value">要減值</param>
        /// <returns>成功返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_decrement")]
        public static extern Int32 fw_decrement(Int32 icdev, Byte _Addr, ulong _Value);

        /// <summary>
        /// 回傳函數,將EEPROM中的內容傳入卡的內部寄存器
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <param name="_Addr">要進行回傳的塊地址</param>
        /// <returns>成功返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_restore")]
        public static extern Int32 fw_restore(Int32 icdev, Byte _Addr);

        /// <summary>
        /// 傳送,將寄存器的內容傳送到EEPROM中
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <param name="_Addr">要傳送的塊地址</param>
        /// <returns>成功返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_transfer")]
        public static extern Int32 fw_transfer(Int32 icdev, Byte _Addr);

        /// <summary>
        /// 操作卡配置
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <param name="_Flag">設定要操作的卡類型(0x41=TYPEA,0x42=TYPEB,0x31=IS015693)</param>
        /// <returns>成功返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_config_card")]
        public static extern Int16 fw_config_card(Int32 icdev, Byte _Flag);

        /// <summary>
        /// 字符串轉換函數,十六進制字符轉普通字符
        /// </summary>
        /// <param name="_A">轉換后的無符號字節數組</param>
        /// <param name="_Hex">待轉換的16進制字符串</param>
        /// <param name="len">要轉換的無符號字節個數</param>
        /// <returns></returns>
        [DllImport("umf.dll", EntryPoint = "a_hex")]
        public static extern Int16 a_hex(Byte[] _A, Byte[] _Hex, Int16 len);

        /// <summary>
        /// 字符串轉換函數,普通字符轉十六進制字符
        /// </summary>
        /// <param name="_Hex">轉換后的無符號字節數組</param>
        /// <param name="_A">待轉換的無符號字節數組</param>
        /// <param name="len">轉換后的hex字符串的長度</param>
        [DllImport("umf.dll", EntryPoint = "hex_a")]
        public static extern void hex_a(Byte[] _Hex, Byte[] _A, Int16 len);

        /// <summary>
        /// 蜂鳴
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <param name="_Msec">蜂鳴時間,單位是10毫秒</param>
        /// <returns>成功則返回0</returns>
        [DllImport("umf.dll",EntryPoint="fw_beep")]
        public static extern Int32 fw_beep(Int32 icdev,UInt32 _Msec);

        /// <summary>
        /// 讀取硬件版本號
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <param name="_Buff">存放版本號的緩沖區,字符串形式</param>
        /// <returns>成功則返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_getver")]
        public static extern Int32 fw_getver(Int32 icdev,StringBuilder _Buff);

        /// <summary>
        /// 設置讀寫器數碼管顯示模式,關機后可保存設置值
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <param name="_Mode">顯示模式,0--日期(格式"年yy-月mm-日dd");1--時間(格式"時hh-分mm-秒ss)</param>
        /// <returns>成功則返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_disp_mode")]
        public static extern Int32 fw_disp_mode(Int32 icdev, Byte _Mode);

        /// <summary>
        /// 讀取讀寫器日期、星期、時間
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <param name="_Time">返回數據,長度為7個字節,格式"年、星期、月、日、時、分、秒"</param>
        /// <returns>成功則返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_gettime")]
        public static extern Int32 fw_gettime(Int32 icdev, ref Byte _Time);

        /// <summary>
        /// 設置讀寫器時間
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <param name="_Time">長度為7個字節,長度為7個字節,格式"年、星期、月、日、時、分、秒"</param>
        /// <returns>成功則返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_settime")]
        public static extern Int32 fw_settime(Int32 icdev, ref Byte _Time);

        /// <summary>
        /// 設置讀寫器數碼管的控制模式
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <param name="_Mode">顯示模式,0--計算機控制,1--讀寫器控制</param>
        /// <returns>成功則返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_ctl_mode")]
        public static extern Int32 fw_ctl_mode(Int32 icdev, Byte _Mode);

        /// <summary>
        /// LED數碼管顯示任意數字
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <param name="_Len">顯示數字的個數</param>
        /// <param name="_DispStr">要顯示的數字</param>
        /// <returns>成功則返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_LED_disp8")]
        public static extern Int32 fw_LED_disp8(Int32 icdev, Byte _Len, ref Byte _DispStr);

        /// <summary>
        /// 設置LCD背光點亮或熄滅
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <param name="_Bright">點亮或熄滅的標志,15-點亮,0-熄滅</param>
        /// <returns>成功則返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_lcd_setbright")]
        public static extern Int32 fw_lcd_setbright(Int32 icdev, Byte _Bright);

        /// <summary>
        /// 設置LCD顯示的字符串
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <param name="_Digit">要顯示的字符串</param>
        /// <returns>成功則返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_lcd_dispstr")]
        public static extern Int32 fw_lcd_dispstr(Int32 icdev, ref Byte _Digit);

        /// <summary>
        /// 清空LCD顯示的字符
        /// </summary>
        /// <param name="icdev">通訊設備標識符</param>
        /// <returns>成功則返回0</returns>
        [DllImport("umf.dll", EntryPoint = "fw_lcd_dispclear")]
        public static extern Int32 fw_lcd_dispclear(Int32 icdev);
    }

qnviccub.dll(一款語音盒api)

using System;
using System.Text;
using System.Runtime.InteropServices;


namespace SoftPOS
{
    class BriSDKLib
    {
        public const int NULL = 0;//c++     

        public const int QNV_FILETRANS_VER = 0x30301;

        public const string QNV_CC_LICENSE = "quniccub_x";

        //播放/錄音回調時如果返回該值,系統將自動刪除該回調模塊,下次將不會被回調
        public const int CB_REMOVELIST = -1;

        public const string MULTI_SEPA_CHAR = "|";//多個文件播放列表分割符號
        public const int PROXYDIAL_SIGN = 0x40000000;//代撥標記
        public const string PROXYDIAL_SIGN_STRU = "P";//代撥標記
        public const string PROXYDIAL_SIGN_STRL = "p";//代撥標記

        public const string RING_BEGIN_SIGN_STR = "0";
        public const string RING_END_SIGN_STR = "1";
        public const string RING_BEGIN_SIGN_CH = "0";
        public const string RING_END_SIGN_CH = "1";

        public const string RINGBACK_TELDIAL_STR = "0";
        public const string RINGBACK_PCDIAL_STR = "1";
        public const string RINGBACK_PCDIAL_CH = "1";
        public const string RINGBACK_TELDIAL_CH = "0";

        public const string DIAL_DELAY_SECOND = ",";//撥號時號碼之間延遲1秒
        public const string DIAL_DELAY_HSECOND = ".";//撥號時號碼之間延遲0.5秒
        public const string DIAL_CHECK_CITYCODE = ":";//撥號時該符號后自動過濾城市區號

        public const string CC_PARAM_SPLIT = ",";//CC參數的分隔符號


        //自動創建錄音文件時的默認目錄名
        public const string RECFILE_DIR = "recfile";
        //配置信息里的KEY
        public const string INI_QNVICC = "qnvicc";
        //默認配置文件名
        public const string INI_FILENAME = "cc301config.ini";
        //VOIP代撥標記
        public const string CC_VOIP_SIGN = "VOIP";
        //匿名登陸CC,密碼跟號碼為相同
        public const string WEB_802ID = "800002000000000000";


        public const int MAX_USB_COUNT = 64;//支持的最多USB芯片數
        public const int MAX_CHANNEL_COUNT = 128;//支持的最多通道數
        //聲卡控制有效通道ID號
        //0->255為USB設備通道號
        public const int SOUND_CHANNELID = 256;
        //遠程通信通道,HTTP上傳/下載
        public const int REMOTE_CHANNELID = 257;
        //CC控制通道
        public const int CCCTRL_CHANNELID = 258;
        ////socket 服務器端通道
        public const int SOCKET_SERVER_CHANNELID = 259;
        //socket 終端通道
        public const int SOCKET_CLIENT_CHANNELID = 260;

        public const int MAX_CCMSG_LEN = 400;//發送消息的最大長度
        public const int MAX_CCCMD_LEN = 400;//發送命令的最大長度

        public const int DEFAULT_FLASH_ELAPSE = 600;//默認拍插簧間隔時間(ms)
        public const int DEFAULT_FLASHFLASH_ELAPSE = 1000;//默認拍插簧后間隔一定時間回調事件ms
        public const int DEFAULT_RING_ELAPSE = 1000;//默認給內部話機/交換機震鈴時間ms響 1秒
        public const int DEFAULT_RINGSILENCE_ELAPSE = 4000;//默認給內部話機/交換機震鈴后停止ms 4秒
        public const int DEFAULT_RING_TIMEOUT = 12;//默認給內線震鈴超時次數,每次1秒響4秒停,總共時間就為N*5
        public const int DEFAULT_REFUSE_ELAPSE = 500;//拒接時默認使用間隔(ms)
        public const int DEFAULT_DIAL_SPEED = 75;//默認撥號速度ms
        public const int DEFAULT_DIAL_SILENCE = 75;//默認號碼之間靜音時間ms
        public const int DEFAULT_CHECKDIALTONE_TIMEOUT = 3000;//檢測撥號音超時就強制呼叫ms
        public const int DEFAULT_CALLINTIMEOUT = 5500;//來電響鈴超時ms

        //設備類型
        public const int DEVTYPE_UNKNOW = -1;//未知設備
                                             //cc301系列
        public const int DEVTYPE_T1 = 0x1009;
        public const int DEVTYPE_T2 = 0x1000;
        public const int DEVTYPE_T3 = 0x1008;
        public const int DEVTYPE_T4 = 0x1005;
        public const int DEVTYPE_T5 = 0x1002;
        public const int DEVTYPE_T6 = 0x1004;

        public const int DEVTYPE_IR1 = 0x8100;
        public const int DEVTYPE_IA1 = 0x8111;
        public const int DEVTYPE_IA2 = 0x8112;
        public const int DEVTYPE_IA4 = 0x8114;
        public const int DEVTYPE_IB2 = 0x8122;
        public const int DEVTYPE_IB3 = 0x8123;

        public const int DEVTYPE_IP1 = 0x8131;

        public const int DEVTYPE_IC2_R = 0x8200;
        public const int DEVTYPE_IC2_LP = 0x8203;
        public const int DEVTYPE_IC2_LPQ = 0x8207;

        //玻瑞器
        public const int DEVTYPE_A1 = 0x1100000;
        public const int DEVTYPE_A2 = 0x1200000;
        public const int DEVTYPE_A3 = 0x1300000;
        public const int DEVTYPE_A4 = 0x1400000;
        public const int DEVTYPE_B1 = 0x2100000;
        public const int DEVTYPE_B2 = 0x2200000;
        public const int DEVTYPE_B3 = 0x2300000;
        public const int DEVTYPE_B4 = 0x2400000;
        public const int DEVTYPE_C4_L = 0x3100000;
        public const int DEVTYPE_C4_P = 0x3200000;
        public const int DEVTYPE_C4_LP = 0x3300000;
        public const int DEVTYPE_C4_LPQ = 0x3400000;
        public const int DEVTYPE_C7_L = 0x3500000;
        public const int DEVTYPE_C7_P = 0x3600000;
        public const int DEVTYPE_C7_LP = 0x3700000;
        public const int DEVTYPE_C7_LPQ = 0x3800000;
        public const int DEVTYPE_R1 = 0x4100000;
        public const int DEVTYPE_C_PR = 0x4200000;

        //--------------------------------------------------------------
        //設備功能模塊
        //是否具有內置喇叭功能
        //可以PC播放語音到喇叭/通話時線路聲音到喇叭
        public const int DEVMODULE_DOPLAY = 0x1;
        //是否具有可接入外線獲取來電號碼(FSK/DTMF雙制式)/通話錄音功能
        //可以來電彈屏/通話錄音/通話時獲取對方按鍵(DTMF)
        public const int DEVMODULE_CALLID = 0x2;
        //是否具有可接入話機進行PSTN通話功能
        //可以使用電話機進行PSTN通話/獲取話機撥出的號碼
        public const int DEVMODULE_PHONE = 0x4;
        //是否具有繼電器切換斷開/接通話機功能
        //斷開話機后可以:來電時話機不響鈴/使用話機MIC獨立采集錄音配合DEVFUNC_RING模塊給話機模擬來電震鈴
        public const int DEVMODULE_SWITCH = 0x8;
        //PC播放語音給話機聽筒,具有 DEVMODULE_SWITCH模塊,switch后播放語音到話機聽筒
        public const int DEVMODULE_PLAY2TEL = 0x10;
        //是否具有話機摘機后撥號/放音給線路的功能
        //可以使用PC自動摘機進行撥號/通話時可以給對方播放語音/來電留言/外撥通知/來電IVR(語音答錄)
        public const int DEVMODULE_HOOK = 0x20;
        //是否具有插入MIC/耳機功能
        //可以用MIC/耳機進行PSTN通話/使用MIC獨立錄音/PC播放語音給耳機
        public const int DEVMODULE_MICSPK = 0x40;
        //是否具有讓接在phone口的設備(電話機,交換機等)模擬震鈴功能
        //可以任意時刻讓phone口的設備模擬來電震鈴.如:在來電IVR(語音答錄)之后進入工服務時給內部話機或交換機模擬震鈴
        public const int DEVMODULE_RING = 0x80;
        //是否具有接收/發送傳真功能
        //可以發送圖片,文檔到對方的傳真機/可以接收保存對方傳真機發送過來的圖片
        public const int DEVMODULE_FAX = 0x100;
        //具有級性反轉檢測對方摘機的功能
        //如果PSTN線路在當地電信部門同時開通該級性反轉檢測服務,就可以在外撥時精確檢測到對方摘機/掛機
        //如果沒有該功能,只有撥打的號碼具有標准回鈴才才能檢測到對方摘機,對手機彩鈴,IP等不具有標准回鈴線路的不能檢測對方摘機/掛機
        public const int DEVMODULE_POLARITY = 0x800;
        //----------------------------------------------------------------


        //打開設備類型
        public const int ODT_LBRIDGE = 0x0;//玻瑞器
        public const int ODT_SOUND = 0x1;//聲卡
        public const int ODT_CC = 0x2;//CC模塊
        public const int ODT_SOCKET_CLIENT = 0x4;//SOCKET終端模塊
        public const int ODT_SOCKET_SERVER = 0x8;//SOCKET服務器模塊
        public const int ODT_ALL = 0xFF;//全部
        public const int ODT_CHANNEL = 0x100;//關閉指定通道
        //

        //-----------------------------------------------------
        //linein線路選擇
        public const int LINEIN_ID_1 = 0x0;//默認正常狀態錄音,采集來電號碼等
        public const int LINEIN_ID_2 = 0x1;//電話機斷開后話柄錄音
        public const int LINEIN_ID_3 = 0x2;//hook line 軟摘機后錄音,錄音數據可以提高對方的音量,降低本地音量
        public const int LINEIN_ID_LOOP = 0x3;//內部環路測試,設備測試使用,建議用戶不需要使用
        //-----------------------------------------------------

        public const int ADCIN_ID_MIC = 0x0;//mic錄音
        public const int ADCIN_ID_LINE = 0x1;//電話線錄音

        //adc
        public const int DOPLAY_CHANNEL1_ADC = 0x0;
        public const int DOPLAY_CHANNEL0_ADC = 0x1;
        public const int DOPLAY_CHANNEL0_DAC = 0x2;
        public const int DOPLAY_CHANNEL1_DAC = 0x3;

        //------------
        public const int SOFT_FLASH = 0x1;//使用軟件調用拍插完成
        public const int TEL_FLASH = 0x2;//使用話機拍插完成
                                         //------------
                                         //拒接時使用模式
        public const int REFUSE_ASYN = 0x0;//異步模式,調用后函數立即返回,但並不表示拒接完成,拒接完成后將接收到一個拒接完成的事件
        public const int REFUSE_SYN = 0x1;//同步模式,調用后該函數被堵塞,等待拒接完成返回,系統不再有拒接完成的事件


        //拍插簧類型
        public const int FT_NULL = 0x0;
        public const int FT_TEL = 0x1;//話機拍插簧
        public const int FT_PC = 0x2;//軟拍插簧
        public const int FT_ALL = 0x3;
        //-------------------------------

        //撥號類型
        public const int DTT_DIAL = 0x0;//撥號
        public const int DTT_SEND = 0x1;//二次發碼/震鈴發送CALLID
        //-------------------------------

        //來電號碼模式
        public const int CALLIDMODE_NULL = 0x0;//未知
        public const int CALLIDMODE_FSK = 0x1;//FSK來電
        public const int CALLIDMODE_DTMF = 0x2;//DTMF來電
        //

        //號碼類型
        public const int CTT_NULL = 0x0;
        public const int CTT_MOBILE = 0x1;//移動號碼
        public const int CTT_PSTN = 0x2;//普通固話號碼
        //------------------------------

        public const int CALLT_NULL = 0x0;//
        public const int CALLT_CALLIN = 0x1;//來電
        public const int CALLT_CALLOUT = 0x2;//去電
        //-------------------

        public const int CRESULT_NULL = 0x0;
        public const int CRESULT_MISSED = 0x1;//呼入未接
        public const int CRESULT_REFUSE = 0x2;//呼入拒接
        public const int CRESULT_RINGBACK = 0x3;//呼叫后回鈴了
        public const int CRESULT_CONNECTED = 0x4;//接通
        //--------------------------------------

        public const int OPTYPE_NULL = 0x0;
        public const int OPTYPE_REMOVE = 0x1;//上傳成功后刪除本地文件

        //設備錯誤ID
        public const int DERR_READERR = 0x0;//讀取數據發送錯誤
        public const int DERR_WRITEERR = 0x1;//寫入數據錯誤
        public const int DERR_FRAMELOST = 0x2;//丟數據包
        public const int DERR_REMOVE = 0x3;//設備移除
        public const int DERR_SERIAL = 0x4;//設備序列號沖突
        //---------------------------------------

        //語音識別時的性別類型
        public const int SG_NULL = 0x0;
        public const int SG_MALE = 0x1;//男性
        public const int SG_FEMALE = 0x2;//女性
        public const int SG_AUTO = 0x3;//自動
        //--------------------------------

        //設備共享模式
        public const int SM_NOTSHARE = 0x0;
        public const int SM_SENDVOICE = 0x1;//發送語音
        public const int SM_RECVVOICE = 0x2;//接收語音
        //----------------------------------

        //----------------------------------------------
        //傳真接受/發送
        public const int FAX_TYPE_NULL = 0x0;
        public const int FAX_TYPE_SEND = 0x1;//發送傳真
        public const int FAX_TYPE_RECV = 0x2;//接收傳真
        //------------------------------------------------

        //
        public const int TTS_LIST_REINIT = 0x0;//重新初始化新的TTS列表
        public const int TTS_LIST_APPEND = 0x1;//追加TTS列表文件
        //------------------------------------------------

        //--------------------------------------------------------
        public const int DIALTYPE_DTMF = 0x0;//DTMF撥號
        public const int DIALTYPE_FSK = 0x1;//FSK撥號
        //--------------------------------------------------------

        //--------------------------------------------------------
        public const int PLAYFILE_MASK_REPEAT = 0x1;//循環播放
        public const int PLAYFILE_MASK_PAUSE = 0x2;//默認暫停
        //--------------------------------------------------------

        //播放文件回調的狀態
        public const int PLAYFILE_PLAYING = 0x1;//正在播放
        public const int PLAYFILE_REPEAT = 0x2;//准備重復播放
        public const int PLAYFILE_END = 0x3;//播放結束


        public const int CONFERENCE_MASK_DISABLEMIC = 0x100;//停止MIC,會議中其它成員不能聽到該用戶說話
        public const int CONFERENCE_MASK_DISABLESPK = 0x200;//停止SPK,不能聽到會議中其它成員說話


        public const int RECORD_MASK_ECHO = 0x1;//回音抵消后的數據
        public const int RECORD_MASK_AGC = 0x2;//自動增益后錄音
        public const int RECORD_MASK_PAUSE = 0x4;//暫停

        public const int CHECKLINE_MASK_DIALOUT = 0x1;//線路是否有正常撥號音(有就可以正常軟撥號)
        public const int CHECKLINE_MASK_REV = 0x2;//線路LINE口/PHONE口接線是否正常,不正常就表示接反了


        public const int OUTVALUE_MAX_SIZE = 260;//location返回的最大長度


        //-----------------------------------------------

        //cc 消息參數
        //具體字體參數意義請查看windows相關文檔
        public const string MSG_KEY_CC = "cc:"; //消息來源CC號
        public const string MSG_KEY_NAME = "name:";//消息來源名稱,保留
        public const string MSG_KEY_TIME = "time:";//消息來源時間
        public const string MSG_KEY_FACE = "face:";//字體名稱
        public const string MSG_KEY_COLOR = "color:";//字體顏色
        public const string MSG_KEY_SIZE = "size:";//字體尺寸
        public const string MSG_KEY_CHARSET = "charset:";//字體特征
        public const string MSG_KEY_EFFECTS = "effects:";//字體效果
        public const string MSG_KEY_LENGTH = "length:";//消息正文長度
        //CC文件參數
        public const string MSG_KEY_FILENAME = "filename:";//文件名
        public const string MSG_KEY_FILESIZE = "filesize:";//文件長度
        public const string MSG_KEY_FILETYPE = "filetype:";//文件類型

        //
        public const string MSG_KEY_CALLPARAM = "callparam:";//CC呼叫時的參數

        //
        public const string MSG_KEY_SPLIT = "\r\n";//參數之間分隔符號
        public const string MSG_TEXT_SPLIT = "\r\n\r\n";//消息參數和消息內容的分隔符號


        //----------------------------------------------------------------------
        //回調函數原型
        //----------------------------------------------------------------------
        //
        //緩沖播放回調原型
        //uChannelID:通道ID
        //dwUserData:用戶自定義的數據
        //lHandle:播放時返回的句柄
        //lDataSize:當前緩沖的語音數據
        //lFreeSize:當前緩沖的空閑長度
        //返回 CB_REMOVELIST(-1) 將被系統刪除該回調資源,下次不再回調/返回其它值保留
        //typedef Int32 (CALLBACK *PCallBack_PlayBuf)(Int16 uChannelID,UInt32 dwUserData,Int32 lHandle,Int32 lDataSize,Int32 lFreeSize);
        //type PCallBack_PlayBuf = function(uChannelID:Int16;dwUserData:longint;lHandle:longint;lDataSize:longint;lFreeSize:longint):longint;stdcall;
        ///////////////////////////////////////////////////////////////////////////////////////////////////////////

        //////////////////////////////////////////////////////////////////////////////////////////////////////////
        //設置文件播放回調原型
        //uChannelID:通道ID
        //nPlayState:文件播放的狀態,PLAYING/REPLAY/END
        //dwUserData:用戶自定義的數據
        //lHandle:播放時返回的句柄
        //lElapses:總共播放的時間(單位秒)
        //返回 CB_REMOVELIST(-1) 系統將自動停止播放該文件/返回其它值保留
        //typedef Int32 (CALLBACK *PCallBack_PlayFile)(Int16 uChannelID,UInt32 nPlayState,UInt32 dwUserData,Int32 lHandle,Int32 lElapses);
        //type PCallBack_PlayFile = function(uChannelID:Int16;nPlayState:longint;dwUserData:longint;lHandle:longint;lElapses:longint):longint;stdcall;

        //////////////////////////////////////////////////////////////////////////////////////////
        //緩沖錄音回調原型 默認格式為8K/16位/單聲道/線性
        //uChannelID:通道ID
        //dwUserData:用戶自定義數據
        //pBufData:語音數據
        //lBufSize:語音數據的內存字節長度
        //返回 CB_REMOVELIST(-1) 將被系統刪除該回調資源,下次不再回調/返回其它值保留
        //typedef Int32 (CALLBACK *PCallBack_RecordBuf)(Int16 uChannelID,UInt32 dwUserData,BRIBYTE8 *pBufData,Int32 lBufSize);
        //type PCallBack_RecordBuf = function(uChannelID:Int16;dwUserData:longint;pBufData:PChar;lBufSize:longint):longint;stdcall;
        ////////////////////////////////////////////////////////////////////////////////////////////

        //////////////////////////////////////////////////////////////////////////////////////////
        //事件發生回調原型
        //uChannelID:通道ID
        //dwUserData:用戶自定義數據
        //lType:事件類型ID 查看BRI_EVENT.lEventType Define
        //lResult:事件相關數據
        //lParam:保留數據,擴展使用
        //szData:事件相關數據
        //pDataEx:附加數據,擴展使用
        /////////////////////////////////////////////////////////////////////////////////////////
        //typedef Int32 (CALLBACK *PCallBack_Event)(Int16 uChannelID,UInt32 dwUserData,Int32    lType,Int32 lHandle,Int32 lResult,Int32 lParam,BRIPCHAR8 pData,BRIPCHAR8 pDataEx);
        //type PCallBack_Event = function(uChannelID:Int16;dwUserData:longint;lType:longint;lHandle:longint;lResult:longint;lParam:longint;pData:PChar;pDataEx:PChar):longint;stdcall;


        //數據結構
        public const int MAX_BRIEVENT_DATA = 600;//事件產生后保存的數據最大長度
        [StructLayout(LayoutKind.Sequential)]
        public struct TBriEvent_Data
        {
            public Byte uVersion;
            public Byte uReserv;
            public Int16 uChannelID;//事件來自通道ID
            public Int32 lEventType;//事件類型ID 查看BRI_EVENT.lEventType Define
            public Int32 lEventHandle;//事件相關句柄
            public Int32 lResult;//事件相關數值
            public Int32 lParam;//保留,擴展使用
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = MAX_BRIEVENT_DATA)]//事件相關數據.如:來電時,保存了來電的號碼
            public Byte[] szData;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]//保留,擴展使用
            public Byte[] szDataEx;
        }

        //type PTBriEvent_Data = ^TBriEvent_Data;


        //////////////////////////////////////////////////////////////////////
        //  BRI_EVENT.lEventType Define
        //  事件類型定義.同步與系統發出的窗口消息(請選擇其中一種方式處理)
        ///////////////////////////////////////////////////////////////////////


        // 本地電話機摘機事件
        public const int BriEvent_PhoneHook = 1;
        // 本地電話機掛機事件
        public const int BriEvent_PhoneHang = 2;

        // 外線通道來電響鈴事件
        // BRI_EVENT.lResult        為響鈴次數
        // BRI_EVENT.szData[0]="0"    開始1秒響鈴
        // BRI_EVENT.szData[0]="1"    為1秒響鈴完成,開始4秒靜音
        public const int BriEvent_CallIn = 3;

        // 得到來電號碼
        // BRI_EVENT.lResult=0        呼入來電(正常呼入來電)
        // BRI_EVENT.lResult=1        呼入中第二次來電
        // BRI_EVENT.szData[0]="0"    DTMF模式來電
        // BRI_EVENT.szData[0]="1"    FSK模式來電
        // 該事件可能在響鈴前,也可能在響鈴后
        public const int BriEvent_GetCallID = 4;

        // 對方停止呼叫(產生一個未接電話)
        public const int BriEvent_StopCallIn = 5;

        // 調用開始撥號后,全部號碼撥號結束
        public const int BriEvent_DialEnd = 6;

        // 播放文件結束事件
        // BRI_EVENT.lResult       播放文件時返回的句柄ID 
        public const int BriEvent_PlayFileEnd = 7;

        // 多文件連播結束事件
        // 
        public const int BriEvent_PlayMultiFileEnd = 8;

        //播放字符結束
        public const int BriEvent_PlayStringEnd = 9;

        // 播放文件結束准備重復播放
        // BRI_EVENT.lResult       播放文件時返回的句柄ID 
        // 
        public const int BriEvent_RepeatPlayFile = 10;

        // 給本地設備發送震鈴信號時發送號碼結束
        public const int BriEvent_SendCallIDEnd = 11;

        //給本地設備發送震鈴信號時超時
        //默認不會超時
        public const int BriEvent_RingTimeOut = 12;

        //正在內線震鈴
        //BRI_EVENT.lResult       已經響鈴的次數
        // BRI_EVENT.szData[0]="0"    開始一次響鈴
        // BRI_EVENT.szData[0]="1"    一次響鈴完成,准備靜音
        public const int BriEvent_Ringing = 13;

        // 通話時檢測到一定時間的靜音.默認為5秒
        public const int BriEvent_Silence = 14;

        // 線路接通時收到DTMF碼事件
        // 該事件不能區分通話中是本地話機按鍵還是對方話機按鍵觸發
        public const int BriEvent_GetDTMFChar = 15;

        // 撥號后,被叫方摘機事件(該事件僅做參考,原因如下:)
        // 原因:
        // 該事件只適用於撥打是標准信號音的號碼時,也就是撥號后帶有標准回鈴音的號碼。
        // 如:當撥打的對方號碼是彩鈴(彩鈴手機號)或系統提示音(179xx)都不是標准回鈴音時該事件無效。
        // 
        public const int BriEvent_RemoteHook = 16;

        // 掛機事件
        // 如果線路檢測到被叫方摘機后,被叫方掛機時會觸發該事件,不然被叫方掛機后就觸發BriEvent_Busy事件
        // 該事件或者BriEvent_Busy的觸發都表示PSTN線路已經被斷開
        public const int BriEvent_RemoteHang = 17;

        // 檢測到忙音事件,表示PSTN線路已經被斷開
        public const int BriEvent_Busy = 18;

        // 本地摘機后檢測到撥號音
        public const int BriEvent_DialTone = 19;

        // 只有在本地話機摘機,沒有調用軟摘機時,檢測到DTMF撥號
        public const int BriEvent_PhoneDial = 20;

        // 電話機撥號結束呼出事件。
        // 也就時電話機撥號后接收到標准回鈴音或者15秒超時
        // BRI_EVENT.lResult=0 檢測到回鈴音// 注意:如果線路是彩鈴是不會觸發該類型
        // BRI_EVENT.lResult=1 撥號超時
        // BRI_EVENT.lResult=2 動態檢測撥號碼結束(根據中國大陸的號碼規則進行智能分析,僅做參考)
        // BRI_EVENT.szData[0]="1" 軟摘機撥號結束后回鈴了
        // BRI_EVENT.szData[0]="0" 電話機撥號中回鈴了
        public const int BriEvent_RingBack = 21;

        // MIC插入狀態
        // 只適用具有該功能的設備
        public const int BriEvent_MicIn = 22;
        // MIC拔出狀態
        // 只適用具有該功能的設備
        public const int BriEvent_MicOut = 23;

        // 拍插簧(Flash)完成事件,拍插簧完成后可以檢測撥號音后進行二次撥號
        // BRI_EVENT.lResult=TEL_FLASH  用戶使用電話機進行拍叉簧完成
        // BRI_EVENT.lResult=SOFT_FLASH 調用StartFlash函數進行拍叉簧完成
        public const int BriEvent_FlashEnd = 24;

        // 拒接完成
        public const int BriEvent_RefuseEnd = 25;

        // 語音識別完成 
        public const int BriEvent_SpeechResult = 26;

        //PSTN線路斷開,線路進入空閑狀態
        //當前沒有軟摘機而且話機也沒摘機
        public const int BriEvent_PSTNFree = 27;

        // 接收到對方准備發送傳真的信號
        public const int BriEvent_RemoteSendFax = 30;

        // 接收傳真完成
        public const int BriEvent_FaxRecvFinished = 31;
        // 接收傳真失敗
        public const int BriEvent_FaxRecvFailed = 32;

        // 發送傳真完成
        public const int BriEvent_FaxSendFinished = 33;
        // 發送傳真失敗
        public const int BriEvent_FaxSendFailed = 34;

        // 啟動聲卡失敗
        public const int BriEvent_OpenSoundFailed = 35;

        // 產生一個PSTN呼入/呼出日志
        public const int BriEvent_CallLog = 36;

        //檢測到連續的靜音
        //使用QNV_GENERAL_CHECKSILENCE啟動后檢測到設定的靜音長度
        public const int BriEvent_RecvSilence = 37;

        //檢測到連續的聲音
        //使用QNV_GENERAL_CHECKVOICE啟動后檢測到設定的聲音長度
        public const int BriEvent_RecvVoice = 38;

        //遠程上傳事件
        public const int BriEvent_UploadSuccess = 50;
        public const int BriEvent_UploadFailed = 51;
        // 遠程連接已被斷開
        public const int BriEvent_RemoteDisconnect = 52;

        //HTTP遠程下載文件完成
        //BRI_EVENT.lResult       啟動下載時返回的本次操作的句柄
        public const int BriEvent_DownloadSuccess = 60;
        public const int BriEvent_DownloadFailed = 61;

        //線路檢測結果
        //BRI_EVENT.lResult 為檢測結果信息
        public const int BriEvent_CheckLine = 70;

        // 應用層調用軟摘機/軟掛機成功事件
        // BRI_EVENT.lResult=0 軟摘機
        // BRI_EVENT.lResult=1 軟掛機            
        public const int BriEvent_EnableHook = 100;
        // 喇叭被打開或者/關閉
        // BRI_EVENT.lResult=0 關閉
        // BRI_EVENT.lResult=1 打開            
        public const int BriEvent_EnablePlay = 101;
        // MIC被打開或者關閉    
        // BRI_EVENT.lResult=0 關閉
        // BRI_EVENT.lResult=1 打開            
        public const int BriEvent_EnableMic = 102;
        // 耳機被打開或者關閉
        // BRI_EVENT.lResult=0 關閉
        // BRI_EVENT.lResult=1 打開            
        public const int BriEvent_EnableSpk = 103;
        // 電話機跟電話線(PSTN)斷開/接通(DoPhone)
        // BRI_EVENT.lResult=0 斷開
        // BRI_EVENT.lResult=1 接通        
        public const int BriEvent_EnableRing = 104;
        // 修改錄音源 (無用/保留)
        // BRI_EVENT.lResult 錄音源數值
        public const int BriEvent_DoRecSource = 105;
        // 開始軟件撥號
        // BRI_EVENT.szData    准備撥的號碼
        public const int BriEvent_DoStartDial = 106;

        public const int BriEvent_EnablePlayMux = 107;

        // 接收到FSK信號,包括通話中FSK/來電號碼的FSK        
        public const int BriEvent_RecvedFSK = 198;
        //設備錯誤
        public const int BriEvent_DevErr = 199;

        //CCCtrl Event
        //CC控制相關事件
        public const int BriEvent_CC_ConnectFailed = 200;//連接失敗
        public const int BriEvent_CC_LoginFailed = 201;//登陸失敗
        public const int BriEvent_CC_LoginSuccess = 202;//登陸成功
        public const int BriEvent_CC_SystemTimeErr = 203;//系統時間錯誤
        public const int BriEvent_CC_CallIn = 204;//有CC呼入請求
        public const int BriEvent_CC_CallOutFailed = 205;//呼叫失敗
        public const int BriEvent_CC_CallOutSuccess = 206;//呼叫成功,正在呼叫
        public const int BriEvent_CC_Connecting = 207;//呼叫正在連接
        public const int BriEvent_CC_Connected = 208;//呼叫連通
        public const int BriEvent_CC_CallFinished = 209;//呼叫結束
        public const int BriEvent_CC_ReplyBusy = 210;//呼叫結束

        public const int BriEvent_CC_RecvedMsg = 220;//接收到用戶即時消息
        public const int BriEvent_CC_RecvedCmd = 221;//接收到用戶自定義命令

        public const int BriEvent_CC_RegSuccess = 225;//注冊CC成功
        public const int BriEvent_CC_RegFailed = 226;//注冊CC失敗

        public const int BriEvent_CC_RecvFileRequest = 230;//接收到用戶發送的文件請求
        public const int BriEvent_CC_TransFileFinished = 231;//傳輸文件結束

        public const int BriEvent_CC_AddContactSuccess = 240;//增加好友成功
        public const int BriEvent_CC_AddContactFailed = 241;//增加好友失敗
        public const int BriEvent_CC_InviteContact = 242;//接收到增加好好友邀請
        public const int BriEvent_CC_ReplyAcceptContact = 243;//對方回復同意為好友
        public const int BriEvent_CC_ReplyRefuseContact = 244;//對方回復拒絕為好友
        public const int BriEvent_CC_AcceptContactSuccess = 245;//接受好友成功
        public const int BriEvent_CC_AcceptContactFailed = 246;//接受好友失敗
        public const int BriEvent_CC_RefuseContactSuccess = 247;//拒絕好友成功
        public const int BriEvent_CC_RefuseContactFailed = 248;//拒絕好友失敗
        public const int BriEvent_CC_DeleteContactSuccess = 249;//刪除好友成功
        public const int BriEvent_CC_DeleteContactFailed = 250;//刪除好友失敗
        public const int BriEvent_CC_ContactUpdateStatus = 251;//好友登陸狀態改變
        public const int BriEvent_CC_ContactDownendStatus = 252;//獲取到所有好友改變完成

        //終端接收到的事件
        public const int BriEvent_Socket_C_ConnectSuccess = 300;//連接成功
        public const int BriEvent_Socket_C_ConnectFailed = 301;//連接失敗
        public const int BriEvent_Socket_C_ReConnect = 302;//開始重新連接
        public const int BriEvent_Socket_C_ReConnectFailed = 303;//重新連接失敗
        public const int BriEvent_Socket_C_ServerClose = 304;//服務器斷開連接
        public const int BriEvent_Socket_C_DisConnect = 305;//連接激活超時
        public const int BriEvent_Socket_C_RecvedData = 306;//接收到服務端發送過來的數據
        //服務器端接收到的事件
        public const int BriEvent_Socket_S_NewLink = 340;//有新連接進入
        public const int BriEvent_Socket_S_DisConnect = 341;//終端連接激活超時
        public const int BriEvent_Socket_S_ClientClose = 342;//終端斷開連接了
        public const int BriEvent_Socket_S_RecvedData = 343;//接收到終端發送過來的數據

        public const int BriEvent_EndID = 500;//空ID

        ///////////////////////////////////////////////////////////////
        //消息定義說明
        //////////////////////////////////////////////////////////////
        public const int WM_USER = 1024;
        public const int BRI_EVENT_MESSAGE = WM_USER + 2000;//事件消息
        public const int BRI_RECBUF_MESSAGE = WM_USER + 2001;//緩沖錄音數據消息

        //文件錄音格式
        public const int BRI_WAV_FORMAT_DEFAULT = 0; // BRI_AUDIO_FORMAT_PCM8K16B
        public const int BRI_WAV_FORMAT_ALAW8K = 1; // 8k/s
        public const int BRI_WAV_FORMAT_ULAW8K = 2; // 8k/s
        public const int BRI_WAV_FORMAT_IMAADPCM8K4B = 3; // 4k/s
        public const int BRI_WAV_FORMAT_PCM8K8B = 4; // 8k/s
        public const int BRI_WAV_FORMAT_PCM8K16B = 5; //16k/s
        public const int BRI_WAV_FORMAT_MP38K8B = 6; //~1.2k/s
        public const int BRI_WAV_FORMAT_MP38K16B = 7; //~2.4k/s
        public const int BRI_WAV_FORMAT_TM8K1B = 8; //~1.5k/s
        public const int BRI_WAV_FORMAT_GSM6108K = 9; //~2.2k/s
        public const int BRI_WAV_FORMAT_END = 255; //無效ID
        //保留最多256個
        ////////////////////////////////////////////////////////////

        //-------------------------------------------------------------------------------------
        //
        //
        //----------------------------------------------------------------------------------
        //設備信息
        public const int QNV_DEVINFO_GETCHIPTYPE = 1;//獲取USB模塊類型
        public const int QNV_DEVINFO_GETCHIPS = 2;//獲取USB模塊數量,該值等於最后一個通道的DEVID
        public const int QNV_DEVINFO_GETTYPE = 3;//獲取通道類型
        public const int QNV_DEVINFO_GETMODULE = 4;//獲取通道功能模塊
        public const int QNV_DEVINFO_GETCHIPCHID = 5;//獲取通道所在USB芯片的中的傳輸ID(0或者1)
        public const int QNV_DEVINFO_GETSERIAL = 6;//獲取通道序列號(0-n)
        public const int QNV_DEVINFO_GETCHANNELS = 7;//獲取通道數量
        public const int QNV_DEVINFO_GETDEVID = 8;//獲取通道所在的USB模塊ID(0-n)
        public const int QNV_DEVINFO_GETDLLVER = 9;//獲取DLL版本號
        public const int QNV_DEVINFO_GETCHIPCHANNEL = 10;//獲取該USB模塊第一個傳輸ID所在的通道號
        //-----------------------------------------------------------------

        //參數類型列表
        //uParamType (可以使用API自動保存/讀取)
        public const int QNV_PARAM_BUSY = 1;//檢測到幾個忙音回調
        public const int QNV_PARAM_DTMFLEVEL = 2;//dtmf檢測時允許的性噪聲比(0-5)
        public const int QNV_PARAM_DTMFVOL = 3;//dtmf檢測時允許的能量(1-100)
        public const int QNV_PARAM_DTMFNUM = 4;//dtmf檢測時允許的持續時間(2-10)
        public const int QNV_PARAM_DTMFLOWINHIGH = 5;//dtmf低頻不能超過高頻值(默認為6)
        public const int QNV_PARAM_DTMFHIGHINLOW = 6;//dtmf高頻不能超過低頻值(默認為4)
        public const int QNV_PARAM_DIALSPEED = 7;//撥號的DTMF長度(1ms-60000ms)
        public const int QNV_PARAM_DIALSILENCE = 8;//撥號時的間隔靜音長度(1ms-60000ms)
        public const int QNV_PARAM_DIALVOL = 9;//撥號音量大小
        public const int QNV_PARAM_RINGSILENCE = 10;//來電不響鈴多少時間超時算未接電話
        public const int QNV_PARAM_CONNECTSILENCE = 11;//通話時連續多少時間靜音后回調
        public const int QNV_PARAM_RINGBACKNUM = 12;//撥幾個數字以上后檢測回鈴開始有效//默認為2個,可起到忽略出局號碼后檢測的回鈴音
        public const int QNV_PARAM_SWITCHLINEIN = 13;//自動切換LINEIN選擇
        public const int QNV_PARAM_FLASHELAPSE = 14;//拍插簧間隔
        public const int QNV_PARAM_FLASHENDELAPSE = 15;//拍插簧后延遲一定時間再回調事件
        public const int QNV_PARAM_RINGELAPSE = 16;//內線震鈴時時間長度
        public const int QNV_PARAM_RINGSILENCEELAPSE = 17;//內線震鈴時靜音長度
        public const int QNV_PARAM_RINGTIMEOUT = 18;//內線震鈴時超時次數
        public const int QNV_PARAM_RINGCALLIDTYPE = 19;//內線震鈴時發送號碼的方式dtmf/fsk
        public const int QNV_PARAM_REFUSEELAPSE = 20;//拒接時間隔時間長度
        public const int QNV_PARAM_DIALTONETIMEOUT = 21;//檢測撥號音超時
        public const int QNV_PARAM_MINCHKFLASHELAPSE = 22;//拍插簧檢測時掛機至少的時間ms,掛機時間小於該值就不算拍插簧
        public const int QNV_PARAM_MAXCHKFLASHELAPSE = 23;//拍插簧檢測時掛機最長的時間ms,掛機時間大於該值就不算拍插簧
        public const int QNV_PARAM_HANGUPELAPSE = 24;//檢測電話機掛機時的至少時間長度ms,//建議掛機檢測次數在拍插簧以上,避免發生掛機后又檢測到拍插
        public const int QNV_PARAM_OFFHOOKELAPSE = 25;//檢測電話機摘機時的至少時間長度ms
        public const int QNV_PARAM_RINGHIGHELAPSE = 26;//檢測來電震鈴時響鈴的至少時間長度ms
        public const int QNV_PARAM_RINGLOWELAPSE = 27;//檢測來電震鈴時不響鈴的至少時間長度ms

        public const int QNV_PARAM_SPEECHGENDER = 30;//語音設置性別
        public const int QNV_PARAM_SPEECHTHRESHOLD = 31;//語音識別門限
        public const int QNV_PARAM_SPEECHSILENCEAM = 32;//語音識別靜音門限
        public const int QNV_PARAM_ECHOTHRESHOLD = 33;//回音抵消處理抵消門限參數
        public const int QNV_PARAM_ECHODECVALUE = 34;//回音抵消處理減少增益參數

        public const int QNV_PARAM_LINEINFREQ1TH = 40;//第一組線路雙頻模式信號音頻率
        public const int QNV_PARAM_LINEINFREQ2TH = 41;//第二組線路雙頻模式信號音頻率
        public const int QNV_PARAM_LINEINFREQ3TH = 42;//第三組線路雙頻模式信號音頻率

        public const int QNV_PARAM_ADBUSY = 45;//是否打開檢測忙音疊加時環境(只有在使用兩路外線網關時由於同時掛機才會觸發忙音被疊加的環境,普通用戶不需要使用)
        public const int QNV_PARAM_ADBUSYMINFREQ = 46;//檢測忙音疊加時最小頻率
        public const int QNV_PARAM_ADBUSYMAXFREQ = 47;//檢測忙音疊加時最大頻率

        //增益控制
        public const int QNV_PARAM_AM_MIC = 50;//MIC增益
        public const int QNV_PARAM_AM_SPKOUT = 51;//耳機spk增益
        public const int QNV_PARAM_AM_LINEIN = 52;//線路輸入能量
        public const int QNV_PARAM_AM_LINEOUT = 53;//mic到線路能量+播放語音到到線路能量
        public const int QNV_PARAM_AM_DOPLAY = 54;//喇叭輸出增益
        //

        //設備控制/狀態
        //uCtrlType
        public const int QNV_CTRL_DOSHARE = 1;//設備共享
        public const int QNV_CTRL_DOHOOK = 2;//軟件摘掛機控制
        public const int QNV_CTRL_DOPHONE = 3;//控制電話機是否可用,可控制話機震鈴,實現硬拍插簧等
        public const int QNV_CTRL_DOPLAY = 4;//喇叭控制開關
        public const int QNV_CTRL_DOLINETOSPK = 5;//線路聲音到耳機,用耳機通話時打開
        public const int QNV_CTRL_DOPLAYTOSPK = 6;//播放的語音到耳機
        public const int QNV_CTRL_DOMICTOLINE = 7;//MIC說話聲到電話線
        public const int QNV_CTRL_ECHO = 8;//打開/關閉回音抵消
        public const int QNV_CTRL_RECVFSK = 9;//打開/關閉接收FSK來電號碼
        public const int QNV_CTRL_RECVDTMF = 10;//打開/關閉接收DTMF
        public const int QNV_CTRL_RECVSIGN = 11;//打開/關閉信號音檢測
        public const int QNV_CTRL_WATCHDOG = 12;//打開關閉看門狗
        public const int QNV_CTRL_PLAYMUX = 13;//選擇到喇叭的語音通道 line1x/pcplay ch0/line2x/pcplay ch1
        public const int QNV_CTRL_PLAYTOLINE = 14;//播放的語音到line
        public const int QNV_CTRL_SELECTLINEIN = 15;//選擇輸入的線路line通道
        public const int QNV_CTRL_SELECTADCIN = 16;//選擇輸入的為線路還是MIC語音
        public const int QNV_CTRL_PHONEPOWER = 17;//打開/關閉給話機供電使能,如果不給話機供電,dophone切換后,話機將不可用,所有對話機的操作都無效
        public const int QNV_CTRL_RINGPOWER = 18;//內線震鈴使能
        public const int QNV_CTRL_LEDPOWER = 19;//LED指示燈
        public const int QNV_CTRL_LINEOUT = 20;//線路輸出使能
        public const int QNV_CTRL_SWITCHOUT = 21;//硬件回音抵消
        public const int QNV_CTRL_UPLOAD = 22;//打開/關閉設備USB數據上傳功能,關閉后將接收不到設備語音數據
        public const int QNV_CTRL_DOWNLOAD = 23;//打開/關閉設備USB數據下載功能,關閉后將不能發送語音/撥號到設備
        //以下狀態不能設置(set),只能獲取(get)
        public const int QNV_CTRL_PHONE = 30;//電話機摘掛機狀態
        public const int QNV_CTRL_MICIN = 31;//mic插入狀態
        public const int QNV_CTRL_RINGTIMES = 32;//來電響鈴的次數
        public const int QNV_CTRL_RINGSTATE = 33;//來電響鈴狀態,正在響還是不響
        //

        //放音控制
        //uPlayType
        public const int QNV_PLAY_FILE_START = 1;//開始播放文件
        public const int QNV_PLAY_FILE_SETCALLBACK = 2;//設置播放文件回調函數
        public const int QNV_PLAY_FILE_SETVOLUME = 3;//設置播放文件音量
        public const int QNV_PLAY_FILE_GETVOLUME = 4;//獲取播放文件音量
        public const int QNV_PLAY_FILE_PAUSE = 5;//暫停播放文件
        public const int QNV_PLAY_FILE_RESUME = 6;//恢復播放文件
        public const int QNV_PLAY_FILE_ISPAUSE = 7;//檢測是否已暫停播放
        public const int QNV_PLAY_FILE_SETREPEAT = 8;//設置是否循環播放
        public const int QNV_PLAY_FILE_ISREPEAT = 9;//檢測是否在循環播放
        public const int QNV_PLAY_FILE_SEEKTO = 11;//跳轉到某個時間(s)
        public const int QNV_PLAY_FILE_SETREPEATTIMEOUT = 12;//設置循環播放超時次數
        public const int QNV_PLAY_FILE_GETREPEATTIMEOUT = 13;//獲取循環播放超時次數
        public const int QNV_PLAY_FILE_SETPLAYTIMEOUT = 14;//設置播放總共超時時長(s)
        public const int QNV_PLAY_FILE_GETPLAYTIMEOUT = 15;//獲取播放總共超時時長
        public const int QNV_PLAY_FILE_TOTALLEN = 16;//總共時間(s)
        public const int QNV_PLAY_FILE_CURSEEK = 17;//當前播放的文件時間位置(s)
        public const int QNV_PLAY_FILE_ELAPSE = 18;//總共播放的時間(s),包括重復的,后退的,不包括暫停的時間
        public const int QNV_PLAY_FILE_ISPLAY = 19;//該句柄是否在播放
        public const int QNV_PLAY_FILE_ENABLEAGC = 20;//打開關閉自動增益
        public const int QNV_PLAY_FILE_ISENABLEAGC = 21;//檢測是否打開自動增益
        public const int QNV_PLAY_FILE_STOP = 22;//停止播放指定文件
        public const int QNV_PLAY_FILE_GETCOUNT = 23;//獲取正在文件播放的數量,可以用來檢測如果沒有了就可以關閉喇叭
        public const int QNV_PLAY_FILE_STOPALL = 24;//停止播放所有文件
        //--------------------------------------------------------

        public const int QNV_PLAY_BUF_START = 1;//開始緩沖播放
        public const int QNV_PLAY_BUF_SETCALLBACK = 2;//設置緩沖播放回調函數
        public const int QNV_PLAY_BUF_SETWAVEFORMAT = 3;//設置緩沖播放語音的格式
        public const int QNV_PLAY_BUF_WRITEDATA = 4;//寫緩沖數據
        public const int QNV_PLAY_BUF_SETVOLUME = 5;//設置音量
        public const int QNV_PLAY_BUF_GETVOLUME = 6;//獲取音量
        public const int QNV_PLAY_BUF_SETUSERVALUE = 7;//設置用戶自定義數據
        public const int QNV_PLAY_BUF_GETUSERVALUE = 8;//獲取用戶自定義數據
        public const int QNV_PLAY_BUF_ENABLEAGC = 9;//打開關閉自動增益
        public const int QNV_PLAY_BUF_ISENABLEAGC = 10;//檢測是否打開了自動增益
        public const int QNV_PLAY_BUF_PAUSE = 11;//暫停播放文件
        public const int QNV_PLAY_BUF_RESUME = 12;//恢復播放文件
        public const int QNV_PLAY_BUF_ISPAUSE = 13;//檢測是否已暫停播放
        public const int QNV_PLAY_BUF_STOP = 14;//停止緩沖播放
        public const int QNV_PLAY_BUF_FREESIZE = 15;//空閑字節
        public const int QNV_PLAY_BUF_DATASIZE = 16;//數據字節
        public const int QNV_PLAY_BUF_TOTALSAMPLES = 17;//總共播放的采樣數
        public const int QNV_PLAY_BUF_SETJITTERBUFSIZE = 18;//設置動態緩沖長度,當緩沖數據播放為空后下次播放前緩沖內必須大於該長度的語音,可用在播放網絡數據包,避免網絡抖動
        public const int QNV_PLAY_BUF_GETJITTERBUFSIZE = 19;//獲取動態緩沖長度
        public const int QNV_PLAY_BUF_GETCOUNT = 20;//獲取正在緩沖播放的數量,可以用來檢測如果沒有了就可以關閉喇叭
        public const int QNV_PLAY_BUF_STOPALL = 21;//停止所有播放
        //-------------------------------------------------------

        public const int QNV_PLAY_MULTIFILE_START = 1;//開始多文件連續播放
        public const int QNV_PLAY_MULTIFILE_PAUSE = 2;//暫停多文件連續播放
        public const int QNV_PLAY_MULTIFILE_RESUME = 3;//恢復多文件連續播放
        public const int QNV_PLAY_MULTIFILE_ISPAUSE = 4;//檢測是否暫停了多文件連續播放
        public const int QNV_PLAY_MULTIFILE_SETVOLUME = 5;//設置多文件播放音量
        public const int QNV_PLAY_MULTIFILE_GETVOLUME = 6;//獲取多文件播放音量
        public const int QNV_PLAY_MULTIFILE_ISSTART = 7;//是否啟動了多文件連續播放
        public const int QNV_PLAY_MULTIFILE_STOP = 8;//停止多文件連續播放
        public const int QNV_PLAY_MULTIFILE_STOPALL = 9;//停止全部多文件連續播放
        //--------------------------------------------------------

        public const int QNV_PLAY_STRING_INITLIST = 1;//初始化字符播放列表
        public const int QNV_PLAY_STRING_START = 2;//開始字符播放
        public const int QNV_PLAY_STRING_PAUSE = 3;//暫停字符播放
        public const int QNV_PLAY_STRING_RESUME = 4;//恢復字符播放
        public const int QNV_PLAY_STRING_ISPAUSE = 5;//檢測是否暫停了字符播放
        public const int QNV_PLAY_STRING_SETVOLUME = 6;//設置字符播放音量
        public const int QNV_PLAY_STRING_GETVOLUME = 7;//獲取字符播放音量
        public const int QNV_PLAY_STRING_ISSTART = 8;//是否啟動了字符播放
        public const int QNV_PLAY_STRING_STOP = 9;//停止字符播放
        public const int QNV_PLAY_STRING_STOPALL = 10;//停止全部字符播放
        //--------------------------------------------------------

        //錄音控制
        //uRecordType
        public const int QNV_RECORD_FILE_START = 1;//開始文件錄音
        public const int QNV_RECORD_FILE_PAUSE = 2;//暫停文件錄音
        public const int QNV_RECORD_FILE_RESUME = 3;//恢復文件錄音
        public const int QNV_RECORD_FILE_ISPAUSE = 4;//檢測是否暫停文件錄音
        public const int QNV_RECORD_FILE_ELAPSE = 5;//獲取已經錄音的時間長度,單位(s)
        public const int QNV_RECORD_FILE_SETVOLUME = 6;//設置文件錄音音量
        public const int QNV_RECORD_FILE_GETVOLUME = 7;//獲取文件錄音音量
        public const int QNV_RECORD_FILE_PATH = 8;//獲取文件錄音的路徑
        public const int QNV_RECORD_FILE_STOP = 9;//停止某個文件錄音
        public const int QNV_RECORD_FILE_STOPALL = 10;//停止全部文件錄音
        public const int QNV_RECORD_FILE_COUNT = 11;//獲取正在錄音的數量        
        public const int QNV_RECORD_FILE_SETROOT = 20;//設置默認錄音目錄
        public const int QNV_RECORD_FILE_GETROOT = 21;//獲取默認錄音目錄
        //----------------------------------------------------------

        public const int QNV_RECORD_BUF_HWND_START = 1;//開始緩沖錄音窗口回調
        public const int QNV_RECORD_BUF_HWND_STOP = 2;//停止某個緩沖錄音窗口回調
        public const int QNV_RECORD_BUF_HWND_STOPALL = 3;//停止全部緩沖錄音窗口回調
        public const int QNV_RECORD_BUF_CALLBACK_START = 4;//開始緩沖錄音回調
        public const int QNV_RECORD_BUF_CALLBACK_STOP = 5;//停止某個緩沖錄音回調
        public const int QNV_RECORD_BUF_CALLBACK_STOPALL = 6;//停止全部緩沖錄音回調
        public const int QNV_RECORD_BUF_SETCBSAMPLES = 7;//設置回調采樣數,每秒8K,如果需要20ms回調一次就設置為20*8=160,/默認為20ms回調一次
        public const int QNV_RECORD_BUF_GETCBSAMPLES = 8;//獲取設置的回調采樣數
        public const int QNV_RECORD_BUF_ENABLEECHO = 9;//打開關閉自動增益
        public const int QNV_RECORD_BUF_ISENABLEECHO = 10;//檢測自動增益是否打開
        public const int QNV_RECORD_BUF_PAUSE = 11;//暫停緩沖錄音
        public const int QNV_RECORD_BUF_ISPAUSE = 12;//檢測是否暫停緩沖錄音
        public const int QNV_RECORD_BUF_RESUME = 13;//恢復緩沖錄音
        public const int QNV_RECORD_BUF_SETVOLUME = 14;//設置緩沖錄音音量
        public const int QNV_RECORD_BUF_GETVOLUME = 15;//獲取緩沖錄音音量
        public const int QNV_RECORD_BUF_SETWAVEFORMAT = 16;//設置錄音回調的語音編碼格式,默認為8K,16位,wav線性
        public const int QNV_RECORD_BUF_GETWAVEFORMAT = 17;//獲取錄音回調的語音編碼格式
        public const int QNV_RECORD_BUF_GETCBMSGID = 100;//查詢緩沖錄音的窗口回調的消息ID,默認為BRI_RECBUF_MESSAGE
        public const int QNV_RECORD_BUF_SETCBMSGID = 101;//設置緩沖錄音的窗口回調的消息ID,默認為BRI_RECBUF_MESSAGE

        //--------------------------------------------------------

        //會議控制
        //uConferenceType
        public const int QNV_CONFERENCE_CREATE = 1;//創建會議
        public const int QNV_CONFERENCE_ADDTOCONF = 2;//增加通道到某個會議
        public const int QNV_CONFERENCE_GETCONFID = 3;//獲取某個通道的會議ID
        public const int QNV_CONFERENCE_SETSPKVOLUME = 4;//設置會議中某個通道放音音量
        public const int QNV_CONFERENCE_GETSPKVOLUME = 5;//獲取會議中某個通道放音音量
        public const int QNV_CONFERENCE_SETMICVOLUME = 6;//設置會議中某個通道錄音音量
        public const int QNV_CONFERENCE_GETMICVOLUME = 7;//獲取會議中某個通道錄音音量
        public const int QNV_CONFERENCE_PAUSE = 8;//暫停某個會議
        public const int QNV_CONFERENCE_RESUME = 9;//恢復某個會議
        public const int QNV_CONFERENCE_ISPAUSE = 10;//檢測是否暫停了某個會議
        public const int QNV_CONFERENCE_ENABLESPK = 11;//打開關閉會議者聽功能
        public const int QNV_CONFERENCE_ISENABLESPK = 12;//檢測會議者聽功能是否打開
        public const int QNV_CONFERENCE_ENABLEMIC = 13;//打開關閉會議者說功能
        public const int QNV_CONFERENCE_ISENABLEMIC = 14;//檢測會議者說功能是否打開
        public const int QNV_CONFERENCE_ENABLEAGC = 15;//打開關閉自動增益
        public const int QNV_CONFERENCE_ISENABLEAGC = 16;//檢測是否打開了自動增益
        public const int QNV_CONFERENCE_DELETECHANNEL = 17;//把通道從會議中刪除
        public const int QNV_CONFERENCE_DELETECONF = 18;//刪除一個會議
        public const int QNV_CONFERENCE_DELETEALLCONF = 19;//刪除全部會議
        public const int QNV_CONFERENCE_GETCONFCOUNT = 20;//獲取會議數量

        public const int QNV_CONFERENCE_RECORD_START = 30;//開始錄音
        public const int QNV_CONFERENCE_RECORD_PAUSE = 31;//暫停錄音
        public const int QNV_CONFERENCE_RECORD_RESUME = 32;//恢復錄音
        public const int QNV_CONFERENCE_RECORD_ISPAUSE = 33;//檢測是否暫停錄音
        public const int QNV_CONFERENCE_RECORD_FILEPATH = 34;//獲取錄音文件路徑
        public const int QNV_CONFERENCE_RECORD_ISSTART = 35;//檢測會議是否已經啟動了錄音
        public const int QNV_CONFERENCE_RECORD_STOP = 36;//停止指定會議錄音
        public const int QNV_CONFERENCE_RECORD_STOPALL = 37;//停止全部會議錄音
        //--------------------------------------------------------

        //speech語音識別
        public const int QNV_SPEECH_CONTENTLIST = 1;//設置識別漢字內容列表
        public const int QNV_SPEECH_STARTSPEECH = 2;//開始識別
        public const int QNV_SPEECH_ISSPEECH = 3;//檢測是否正在識別
        public const int QNV_SPEECH_STOPSPEECH = 4;//停止識別
        public const int QNV_SPEECH_GETRESULT = 5;//獲取識別后的結果
        //------------------------------------------------------------

        //傳真模塊接口
        public const int QNV_FAX_LOAD = 1;//加載啟動傳真模塊
        public const int QNV_FAX_UNLOAD = 2;//卸載傳真模塊
        public const int QNV_FAX_STARTSEND = 3;//開始發送傳真
        public const int QNV_FAX_STOPSEND = 4;//停止發送傳真
        public const int QNV_FAX_STARTRECV = 5;//開始接收傳真
        public const int QNV_FAX_STOPRECV = 6;//停止接收傳真
        public const int QNV_FAX_STOP = 7;//停止全部
        public const int QNV_FAX_PAUSE = 8;//暫停
        public const int QNV_FAX_RESUME = 9;//恢復
        public const int QNV_FAX_ISPAUSE = 10;//是否暫停
        public const int QNV_FAX_TYPE = 11;//傳真狀態是接受或者發送
        public const int QNV_FAX_TRANSMITSIZE = 12;//已經發送的圖象數據大小
        public const int QNV_FAX_IMAGESIZE = 13;//總共需要發送圖象數據大小
        //----------------------------------------------------------

        //函數event
        //ueventType
        public const int QNV_EVENT_POP = 1;//獲取后自動刪除當前事件,pValue->PBRI_EVENT
        public const int QNV_EVENT_POPEX = 2;//獲取后自動刪除當前事件,pValue->字符分隔格式:chid,type,handle,result,data
        public const int QNV_EVENT_TYPE = 3;//獲取事件類型,獲取后不會自動刪除,獲取成功后使用 QNV_GENERAL_EVENT_REMOVE刪除該事件
        public const int QNV_EVENT_HANDLE = 4;//獲取事件句柄值
        public const int QNV_EVENT_RESULT = 5;//獲取事件數值
        public const int QNV_EVENT_PARAM = 6;//獲取事件保留參數        
        public const int QNV_EVENT_DATA = 7;//獲取事件數據
        public const int QNV_EVENT_DATAEX = 8;//獲取事件附加數據
        public const int QNV_EVENT_REMOVE = 20;//刪除最老的事件
        public const int QNV_EVENT_REMOVEALL = 21;//刪除所有事件
        public const int QNV_EVENT_REGWND = 30;//注冊接收消息的窗口句柄
        public const int QNV_EVENT_UNREGWND = 31;//刪除接收消息的窗口句柄
        public const int QNV_EVENT_REGCBFUNC = 32;//注冊事件回調函數
        public const int QNV_EVENT_REGCBFUNCEX = 33;//注冊事件回調函數
        public const int QNV_EVENT_UNREGCBFUNC = 34;//刪除事件回調函數
        //-----------------------------------------------------------

        //函數general
        //uGeneralType
        public const int QNV_GENERAL_STARTDIAL = 1;//開始撥號
        public const int QNV_GENERAL_SENDNUMBER = 2;//二次撥號
        public const int QNV_GENERAL_REDIAL = 3;//重撥最后一次呼叫的號碼,程序退出后該號碼被釋放
        public const int QNV_GENERAL_STOPDIAL = 4;//停止撥號
        public const int QNV_GENERAL_ISDIALING = 5;//是否在撥號

        public const int QNV_GENERAL_STARTRING = 10;//phone口震鈴
        public const int QNV_GENERAL_STOPRING = 11;//phone口震鈴停止
        public const int QNV_GENERAL_ISRINGING = 12;//phone口是否在震鈴

        public const int QNV_GENERAL_STARTFLASH = 20;//拍插簧
        public const int QNV_GENERAL_STOPFLASH = 21;//拍插簧停止
        public const int QNV_GENERAL_ISFLASHING = 22;//是否正在拍插簧

        public const int QNV_GENERAL_STARTREFUSE = 30;//拒接當前呼入
        public const int QNV_GENERAL_STOPREFUSE = 31;//終止拒接操作
        public const int QNV_GENERAL_ISREFUSEING = 32;//是否正在拒接當前呼入

        public const int QNV_GENERAL_GETCALLIDTYPE = 50;//獲取本次呼入的來電號碼類型
        public const int QNV_GENERAL_GETCALLID = 51;//獲取本次呼入的來電號碼
        public const int QNV_GENERAL_GETTELDIALCODE = 52;//獲取本次電話機撥出的號碼類型,return buf
        public const int QNV_GENERAL_GETTELDIALCODEEX = 53;//獲取本次電話機撥出的號碼類型,outbuf
        public const int QNV_GENERAL_RESETTELDIALBUF = 54;//清空電話撥的號碼緩沖
        public const int QNV_GENERAL_GETTELDIALLEN = 55;//電話機已撥的號碼長度

        public const int QNV_GENERAL_STARTSHARE = 60;//啟動設備共享服務
        public const int QNV_GENERAL_STOPSHARE = 61;//停止設備共享服務
        public const int QNV_GENERAL_ISSHARE = 62;//是否啟用設備共享服務模塊

        public const int QNV_GENERAL_ENABLECALLIN = 70;//禁止/啟用外線呼入
        public const int QNV_GENERAL_ISENABLECALLIN = 71;//外線是否允許呼入

        public const int QNV_GENERAL_RESETRINGBACK = 80;//復位檢測到的回鈴,重新啟動檢測
        public const int QNV_GENERAL_CHECKCHANNELID = 81;//檢測通道ID是否合法
        public const int QNV_GENERAL_CHECKDIALTONE = 82;//檢測撥號音
        public const int QNV_GENERAL_CHECKSILENCE = 83;//檢測線路靜音
        public const int QNV_GENERAL_CHECKVOICE = 84;//檢測線路聲音
        public const int QNV_GENERAL_CHECKLINESTATE = 85;//檢測線路狀態(是否可正常撥號/是否接反)

        public const int QNV_GENERAL_SETUSERVALUE = 90;//用戶自定義通道數據,系統退出后自動釋放
        public const int QNV_GENERAL_SETUSERSTRING = 91;//用戶自定義通道字符,系統退出后自動釋放
        public const int QNV_GENERAL_GETUSERVALUE = 92;//獲取用戶自定義通道數據
        public const int QNV_GENERAL_GETUSERSTRING = 93;//獲取用戶自定義通道字符

        //初始化通道INI文件參數
        public const int QNV_GENERAL_READPARAM = 100;//讀取ini文件進行全部參數初始化
        public const int QNV_GENERAL_WRITEPARAM = 101;//把參數寫入到ini文件
        //

        //call log
        public const int QNV_CALLLOG_BEGINTIME = 1;//獲取呼叫開始時間
        public const int QNV_CALLLOG_RINGBACKTIME = 2;//獲取回鈴時間
        public const int QNV_CALLLOG_CONNECTEDTIME = 3;//獲取接通時間
        public const int QNV_CALLLOG_ENDTIME = 4;//獲取結束時間
        public const int QNV_CALLLOG_CALLTYPE = 5;//獲取呼叫類型/呼入/呼出
        public const int QNV_CALLLOG_CALLRESULT = 6;//獲取呼叫結果
        public const int QNV_CALLLOG_CALLID = 7;//獲取號碼
        public const int QNV_CALLLOG_CALLRECFILE = 8;//獲取錄音文件路徑

        //工具函數,跟設備無關
        //uToolType
        public const int QNV_TOOL_PSTNEND = 1;//檢測PSTN號碼是否已經結束
        public const int QNV_TOOL_CODETYPE = 2;//判斷號碼類型(內地手機/固話)
        public const int QNV_TOOL_LOCATION = 3;//獲取號碼所在地信息
        public const int QNV_TOOL_DISKFREESPACE = 4;//獲取該硬盤剩余空間(M)
        public const int QNV_TOOL_DISKTOTALSPACE = 5;//獲取該硬盤總共空間(M)
        public const int QNV_TOOL_DISKLIST = 6;//獲取硬盤列表
        public const int QNV_TOOL_RESERVID1 = 7;//保留
        public const int QNV_TOOL_RESERVID2 = 8;//保留
        public const int QNV_TOOL_CONVERTFMT = 9;//轉換語音文件格式
        public const int QNV_TOOL_SELECTDIRECTORY = 10;//選擇目錄
        public const int QNV_TOOL_SELECTFILE = 11;//選擇文件
        //------------------------------------------------------

        //存儲操作
        public const int QNV_STORAGE_PUBLIC_READ = 1;//讀取共享區域數據
        public const int QNV_STORAGE_PUBLIC_READSTR = 2;//讀取共享區域字符串數據,讀到'\0'自動結束
        public const int QNV_STORAGE_PUBLIC_WRITE = 3;//寫入共享區域數據
        public const int QNV_STORAGE_PUBLIC_SETREADPWD = 4;//設置讀取共享區域數據的密碼
        public const int QNV_STORAGE_PUBLIC_SETWRITEPWD = 5;//設置寫入共享區域數據的密碼
        public const int QNV_STORAGE_PUBLIC_GETSPACESIZE = 6;//獲取存儲空間長度



        //遠程操作
        //RemoteType
        public const int QNV_REMOTE_UPLOADFILE = 1;//上傳文件到WEB服務器(http協議)
        public const int QNV_REMOTE_DOWNLOADFILE = 2;//下載遠程文件
        public const int QNV_REMOTE_UPLOADDATA = 3;//上傳字符數據到WEB服務器(send/post)
        //--------------------------------------------------------

        //CC控制
        public const int QNV_CCCTRL_SETLICENSE = 1;//設置license
        public const int QNV_CCCTRL_SETSERVER = 2;//設置服務器IP地址
        public const int QNV_CCCTRL_LOGIN = 3;//登陸
        public const int QNV_CCCTRL_LOGOUT = 4;//退出
        public const int QNV_CCCTRL_ISLOGON = 5;//是否登陸成功了
        public const int QNV_CCCTRL_REGCC = 6;//注冊CC號碼
        //
        //語音
        public const int QNV_CCCTRL_CALL_START = 1;//呼叫CC
        public const int QNV_CCCTRL_CALL_VOIP = 2;//VOIP代撥固話
        public const int QNV_CCCTRL_CALL_STOP = 3;//停止呼叫
        public const int QNV_CCCTRL_CALL_ACCEPT = 4;//接聽來電
        public const int QNV_CCCTRL_CALL_BUSY = 5;//發送忙提示
        public const int QNV_CCCTRL_CALL_REFUSE = 6;//拒接
        public const int QNV_CCCTRL_CALL_STARTPLAYFILE = 7;//播放文件
        public const int QNV_CCCTRL_CALL_STOPPLAYFILE = 8;//停止播放文件
        public const int QNV_CCCTRL_CALL_STARTRECFILE = 9;//開始文件錄音
        public const int QNV_CCCTRL_CALL_STOPRECFILE = 10;//停止文件錄音
        public const int QNV_CCCTRL_CALL_HOLD = 11;//保持通話,不影響播放文件
        public const int QNV_CCCTRL_CALL_UNHOLD = 12;//恢復通話
        public const int QNV_CCCTRL_CALL_SWITCH = 13;//呼叫轉移到其它CC

        public const int QNV_CCCTRL_CALL_CONFHANDLE = 20;//獲取呼叫句柄所在的會議句柄
        //
        //消息/命令
        public const int QNV_CCCTRL_MSG_SENDMSG = 1;//發送消息
        public const int QNV_CCCTRL_MSG_SENDCMD = 2;//發送命令
        //
        //好友
        public const int QNV_CCCTRL_CONTACT_ADD = 1;//增加好友
        public const int QNV_CCCTRL_CONTACT_DELETE = 2;//刪除好友
        public const int QNV_CCCTRL_CONTACT_ACCEPT = 3;//接受好友
        public const int QNV_CCCTRL_CONTACT_REFUSE = 4;//拒絕好友
        public const int QNV_CCCTRL_CONTACT_GET = 5;//獲取好友狀態

        //好友信息/自己的信息
        public const int QNV_CCCTRL_CCINFO_OWNERCC = 1;//獲取本人登陸的CC
        public const int QNV_CCCTRL_CCINFO_NICK = 2;//獲取CC的昵稱,如果沒有輸入CC就表示獲取本人的昵稱

        //socket 終端控制
        public const int QNV_SOCKET_CLIENT_CONNECT = 1;//連接到服務器
        public const int QNV_SOCKET_CLIENT_DISCONNECT = 2;//斷開服務器
        public const int QNV_SOCKET_CLIENT_STARTRECONNECT = 3;//自動重連服務器
        public const int QNV_SOCKET_CLIENT_STOPRECONNECT = 4;//停止自動重連服務器
        public const int QNV_SOCKET_CLIENT_SENDDATA = 5;//發送數據



        //[Out, MarshalAs(UnmanagedType.LPTStr)] StringBuilder lpString, int nMaxCount
        public const string QNVDLLNAME = "qnviccub.dll";

        // 打開設備
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_OpenDevice(UInt32 uDevType, UInt32 uValue, string strValue);
        // 關閉設備
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_CloseDevice(UInt32 uDevType, UInt32 uValue);
        // set dev ctrl
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_SetDevCtrl(Int16 nChannelID, UInt32 uCtrlType, Int32 nValue);
        // get dev ctrl
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_GetDevCtrl(Int16 nChannelID, UInt32 uCtrlType);
        // set param
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_SetParam(Int16 nChannelID, UInt32 uParamType, Int32 nValue);
        // get param
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_GetParam(Int16 nChannelID, UInt32 uParamType);
        // play file
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_PlayFile(Int16 nChannelID, UInt32 uPlayType, Int32 nValue, Int32 nValueEx, string pValue);
        // play buf
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_PlayBuf(Int16 nChannelID, UInt32 uPlayType, Int32 nValue, Int32 nValueEx, string pValue);
        // play multifile
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_PlayMultiFile(Int16 nChannelID, UInt32 uPlayType, Int32 nValue, Int32 nValueEx, string pValue);
        // play string
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_PlayString(Int16 nChannelID, UInt32 uPlayType, Int32 nValue, Int32 nValueEx, string pValue);
        // record file
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_RecordFile(Int16 nChannelID, UInt32 uRecordType, Int32 nValue, Int32 nValueEx, string pValue);
        // record buf
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_RecordBuf(Int16 nChannelID, UInt32 uRecordType, Int32 nValue, Int32 nValueEx, string pValue);
        // conference
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_Conference(Int16 nChannelID, Int32 nConfID, UInt32 uConfType, Int32 nValue, string pValue);
        // broadcast
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_Broadcast(Int16 nChannelID, UInt32 uBroadType, Int32 nValue, string pValue);
        // speech
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_Speech(Int16 nChannelID, UInt32 uSpeechType, Int32 nValue, string pValue);
        // fax
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_Fax(Int16 nChannelID, UInt32 uFaxType, Int32 nValue, string pValue);
        // event
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_Event(Int16 nChannelID, UInt32 uEventType, Int32 nValue, string pInValue, [Out, MarshalAs(UnmanagedType.LPTStr)] StringBuilder pOutValue, Int32 nBufSize);
        // general
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_General(Int16 nChannelID, UInt32 uGeneralType, Int32 nValue, string pValue);
        // pstn call log
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_CallLog(Int16 nChannelID, UInt32 uLogType, string pValue, Int32 nValue);
        // devinfo
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_DevInfo(Int16 nChannelID, UInt32 uDevInfoType);
        // tool
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_Tool(UInt32 uToolType, Int32 nValue, string pInValue, string pInValueEx, [Out, MarshalAs(UnmanagedType.LPTStr)] StringBuilder pOutValue, Int32 nBufSize);
        // storage
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_Storage(UInt32 uDevID, Int32 nOPType, Int32 nSeek, string pPwd, string pValue, Int32 nBufSize);
        // remote
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_Remote(UInt32 uRemoteType, Int32 nValue, string pInValue, string pInValueEx, [Out, MarshalAs(UnmanagedType.LPTStr)] StringBuilder pOutValue, Int32 nBufSize);
        // CC ctrl 
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_CCCtrl(UInt32 uCtrlType, string pInValue, Int32 nValue);
        // CC Call
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_CCCtrl_Call(UInt32 uCallType, Int32 lSessHandle, string pInValue, Int32 nValue);
        // CC msg
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_CCCtrl_Msg(UInt32 uMsgType, string pDestCC, string pMsgValue, string pParam, Int32 nReserv);
        // CC contact
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_CCCtrl_Contact(UInt32 uContactType, string pDestCC, string pValue);
        // CC contact info
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_CCCtrl_CCInfo(UInt32 uInfoType, string pDestCC, [Out, MarshalAs(UnmanagedType.LPTStr)] StringBuilder pOutValue, Int32 nBufSize);
        [DllImport("qnviccub.dll")]
        public static extern Int32 QNV_Socket_Client(UInt32 uSktType, UInt32 nHandle, UInt32 nValue, string pInValue, Int32 nInValueLen);
    }
}

二代身份證閱讀器dll之termb.dll

using System.Runtime.InteropServices;
namespace SoftPOS
{
    /// <summary>
    /// 身份證閱讀類
    /// </summary>
    public class CVRSDK
    {
        [DllImport("termb.dll", EntryPoint = "CVR_InitComm", CharSet = CharSet.Auto, SetLastError = false)]
        public static extern int CVR_InitComm(int Port);//聲明外部的標准動態庫, 跟Win32API是一樣的
        [DllImport("termb.dll", EntryPoint = "CVR_Authenticate", CharSet = CharSet.Auto, SetLastError = false)]
        public static extern int CVR_Authenticate();
        [DllImport("termb.dll", EntryPoint = "CVR_Read_Content", CharSet = CharSet.Auto, SetLastError = false)]
        public static extern int CVR_Read_Content(int Active);
        [DllImport("termb.dll", EntryPoint = "CVR_CloseComm", CharSet = CharSet.Auto, SetLastError = false)]
        public static extern int CVR_CloseComm();
        [DllImport("termb.dll", EntryPoint = "GetPeopleName", CharSet = CharSet.Ansi, SetLastError = false)]
        public static extern unsafe int GetPeopleName(ref byte strTmp, ref int strLen);
        [DllImport("termb.dll", EntryPoint = "GetPeopleNation", CharSet = CharSet.Ansi, SetLastError = false)]
        public static extern int GetPeopleNation(ref byte strTmp, ref int strLen);
        [DllImport("termb.dll", EntryPoint = "GetPeopleBirthday", CharSet = CharSet.Ansi, SetLastError = false, CallingConvention = CallingConvention.StdCall)]
        public static extern int GetPeopleBirthday(ref byte strTmp, ref int strLen);
        [DllImport("termb.dll", EntryPoint = "GetPeopleAddress", CharSet = CharSet.Ansi, SetLastError = false, CallingConvention = CallingConvention.StdCall)]
        public static extern int GetPeopleAddress(ref byte strTmp, ref int strLen);
        [DllImport("termb.dll", EntryPoint = "GetPeopleIDCode", CharSet = CharSet.Ansi, SetLastError = false, CallingConvention = CallingConvention.StdCall)]
        public static extern int GetPeopleIDCode(ref byte strTmp, ref int strLen);
        [DllImport("termb.dll", EntryPoint = "GetDepartment", CharSet = CharSet.Ansi, SetLastError = false, CallingConvention = CallingConvention.StdCall)]
        public static extern int GetDepartment(ref byte strTmp, ref int strLen);
        [DllImport("termb.dll", EntryPoint = "GetStartDate", CharSet = CharSet.Ansi, SetLastError = false, CallingConvention = CallingConvention.StdCall)]
        public static extern int GetStartDate(ref byte strTmp, ref int strLen);
        [DllImport("termb.dll", EntryPoint = "GetEndDate", CharSet = CharSet.Ansi, SetLastError = false, CallingConvention = CallingConvention.StdCall)]
        public static extern int GetEndDate(ref byte strTmp, ref int strLen);
        [DllImport("termb.dll", EntryPoint = "GetPeopleSex", CharSet = CharSet.Ansi, SetLastError = false, CallingConvention = CallingConvention.StdCall)]
        public static extern int GetPeopleSex(ref byte strTmp, ref int strLen);
        [DllImport("termb.dll", EntryPoint = "CVR_GetSAMID", CharSet = CharSet.Ansi, SetLastError = false, CallingConvention = CallingConvention.StdCall)]
        public static extern int CVR_GetSAMID(ref byte strTmp);
        [DllImport("termb.dll", EntryPoint = "GetManuID", CharSet = CharSet.Ansi, SetLastError = false, CallingConvention = CallingConvention.StdCall)]
        public static extern int GetManuID(ref byte strTmp);
    }
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM