先把最主要的3个开发文档给大家说一下
1.
文件名:globalcall_api_v8.pdf
标题:<<Dialogic Globall Call APT>>
说明:主要介绍Globall Call相关函数的说明和使用,简称GC函数,以及作为参数使用的特定Struct。初始化通道,等待电话,接受应答等等。
2.
文件名:srl_api_v6.pdf
标题:<<Dialogic Standard Runtime Library API>>
说明:主要是介绍SR相关函数,SR相关函数主要是用来捕获通道动作(如摘机动作,挂机动作等)事件的以及相关处理的函数。
3.
文件名:voice_api_v2.pdf
标题:<<Voice API>>
说明:主要是介绍语音相关函数(基本函数命名都是DX开头),主要用来在通道上放音,停止放音等等。
在.NET中调用DLL函数的具体方式我就不写了,我直接写我在.NET中的应用,和C++对应,便于大家先看明白后理解,按照我使用的顺序来.
GC FUNCTION Example:
C++中的函数声明
int
GC_CDECL gc_Start(GC_START_STRUCT
*
startp);
int GC_CDECL gc_Close(LINEDEV linedev);
int GC_CDECL gc_OpenEx(LINEDEV * linedevp, char * devicename, int mode, void * usrattr);
int GC_CDECL gc_GetResourceH(LINEDEV linedev, int * resourcehp, int resourcetype);
int GC_CDECL gc_GetMetaEventEx(METAEVENT * metaeventp, unsigned long evt_handle );
int GC_CDECL gc_ResultInfo(METAEVENT * a_Metaevent, GC_INFO * a_Info);
int GC_CDECL gc_ErrorInfo(GC_INFO * a_Info);
int GC_CDECL gc_GetCallInfo(CRN crn, int info_id, char * valuep);
int GC_CDECL gc_ResetLineDev(LINEDEV linedev, unsigned long mode);
int GC_CDECL gc_WaitCall(LINEDEV linedev, CRN * crnp, GC_WAITCALL_BLK * waitcallp, int timeout, unsigned long mode);
int GC_CDECL gc_AcceptCall(CRN crn, int rings, unsigned long mode);
int GC_CDECL gc_AnswerCall(CRN crn, int rings, unsigned long mode);
int GC_CDECL gc_UnListen(LINEDEV linedev, unsigned long mode);
int GC_CDECL gc_Listen(LINEDEV linedev, SC_TSINFO * sctsinfop, unsigned long mode);
int GC_CDECL gc_Close(LINEDEV linedev);
int GC_CDECL gc_OpenEx(LINEDEV * linedevp, char * devicename, int mode, void * usrattr);
int GC_CDECL gc_GetResourceH(LINEDEV linedev, int * resourcehp, int resourcetype);
int GC_CDECL gc_GetMetaEventEx(METAEVENT * metaeventp, unsigned long evt_handle );
int GC_CDECL gc_ResultInfo(METAEVENT * a_Metaevent, GC_INFO * a_Info);
int GC_CDECL gc_ErrorInfo(GC_INFO * a_Info);
int GC_CDECL gc_GetCallInfo(CRN crn, int info_id, char * valuep);
int GC_CDECL gc_ResetLineDev(LINEDEV linedev, unsigned long mode);
int GC_CDECL gc_WaitCall(LINEDEV linedev, CRN * crnp, GC_WAITCALL_BLK * waitcallp, int timeout, unsigned long mode);
int GC_CDECL gc_AcceptCall(CRN crn, int rings, unsigned long mode);
int GC_CDECL gc_AnswerCall(CRN crn, int rings, unsigned long mode);
int GC_CDECL gc_UnListen(LINEDEV linedev, unsigned long mode);
int GC_CDECL gc_Listen(LINEDEV linedev, SC_TSINFO * sctsinfop, unsigned long mode);
C#中对应的声明
[DllImport(
"
libgc.dll
"
, CharSet
=
CharSet.Ansi, CallingConvention
=
CallingConvention.Cdecl)]
public static extern int gc_Start(IntPtr startp);
[DllImport( " libgc.dll " , CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int gc_Close( int chdev);
[DllImport( " libgc.dll " , CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int gc_OpenEx( ref int linedevp, string devicename, int mode, [MarshalAs(UnmanagedType.AsAny)] Object usrattr);
[DllImport( " libgc.dll " , CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int gc_GetResourceH( int linedevp, ref int resourcehp, int resourcetype);
[DllImport( " libgc.dll " , CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int gc_GetMetaEventEx( ref METAEVENT metaeventp, int ev_handle);
[DllImport( " libgc.dll " , CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int gc_ResultInfo( ref METAEVENT a_Metaevent, ref GC_INFO a_Info);
[DllImport( " libgc.dll " , CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public unsafe static extern int gc_ErrorInfo( ref GC_INFO a_Info);
[DllImport( " libgc.dll " , CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int gc_GetCallInfo( int crn, int info_id, StringBuilder valuep);
[DllImport( " libgc.dll " , CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int gc_ResetLineDev( int linedev, int flag);
[DllImport( " libgc.dll " , CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int gc_WaitCall( int linedev, IntPtr crnp, IntPtr waitcallp, int timeout, int mode);
[DllImport( " libgc.dll " , CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int gc_AcceptCall( int crn, int rings, int mode);
[DllImport( " libgc.dll " , CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int gc_AnswerCall( int crn, int rings, int mode);
[DllImport( " libgc.dll " , CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int gc_UnListen( int linedev, int mode);
[DllImport( " libgc.dll " , CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public unsafe static extern int gc_Listen( int linedev, SC_TSINFO * sctsinfop, uint mode);
public static extern int gc_Start(IntPtr startp);
[DllImport( " libgc.dll " , CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int gc_Close( int chdev);
[DllImport( " libgc.dll " , CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int gc_OpenEx( ref int linedevp, string devicename, int mode, [MarshalAs(UnmanagedType.AsAny)] Object usrattr);
[DllImport( " libgc.dll " , CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int gc_GetResourceH( int linedevp, ref int resourcehp, int resourcetype);
[DllImport( " libgc.dll " , CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int gc_GetMetaEventEx( ref METAEVENT metaeventp, int ev_handle);
[DllImport( " libgc.dll " , CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int gc_ResultInfo( ref METAEVENT a_Metaevent, ref GC_INFO a_Info);
[DllImport( " libgc.dll " , CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public unsafe static extern int gc_ErrorInfo( ref GC_INFO a_Info);
[DllImport( " libgc.dll " , CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int gc_GetCallInfo( int crn, int info_id, StringBuilder valuep);
[DllImport( " libgc.dll " , CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int gc_ResetLineDev( int linedev, int flag);
[DllImport( " libgc.dll " , CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int gc_WaitCall( int linedev, IntPtr crnp, IntPtr waitcallp, int timeout, int mode);
[DllImport( " libgc.dll " , CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int gc_AcceptCall( int crn, int rings, int mode);
[DllImport( " libgc.dll " , CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int gc_AnswerCall( int crn, int rings, int mode);
[DllImport( " libgc.dll " , CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int gc_UnListen( int linedev, int mode);
[DllImport( " libgc.dll " , CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public unsafe static extern int gc_Listen( int linedev, SC_TSINFO * sctsinfop, uint mode);
C#开发Dialogic语音卡应用程序正确的数据封送很重要,正确的封送能够正确调用DLL,专注于业务流程开发。但是恰恰这里,是个难点,各种情况足够写一本书的,对于没有相关经验的人来说,太痛苦了。还好我们拥有MSDN和搜索引擎。想要了解的人在MSDN中搜索“数据封送”和“Marshall类”。