拨打电话的步骤:
1. 初始化
初始化的时候,应用程序会建立于TAPI之间的通信。使用lineInitialize函数来进行初始化动作,应用程序会提交一个回调函数给TAPI,同样也可以使用更高级的lineInitializeEx函数,它不仅能使用回调函数,还可以利用Windows系统的时间消息通知进行处理。利用事件消息机制,应用程序可以接受TAPI发送的消息,当事件到达时,使用TAPI提供的lineGetMessage函数来获得具体消息。
LONG WINAPI lineInitializeEx(
LPHLINEAPP lphLineApp,
HINSTANCE hInstance,
LINECALLBACK lpfnCallback,
LPCWSTR lpszFriendlyAppName,
LPDWORD lpdwNumDevs,
LPDWORD lpdwAPIVersion,
LPLINEINITIALIZEEXPARAMS lpLineInitializeExParams
)
;
该函数包含有7个参数,LPLINEINITIALIZEEXPARAMS指向一个 LINEINITIALIZEEXPARAMS结构。第一个参数 lphLineApp是应用程序的TAPI句柄;hInstance是程序的实例句柄, lpfnCallback是回调函数指针,如果值设为NULL或应用程序使用时间通知机制那么将忽略这个参数。
回调函数的CallBack结构如下
VOID FAR PASCAL lineCallbackFunc(
DWORD hDevice,
DWORD dwMsg,
DWORD dwCallbackInstance,
DWORD dwParam1,
DWORD dwParam2,
DWORD dwParam3
);
参数 hDevice 是线路设备句柄或是一个呼叫相关联的呼叫句柄。 dwMsg 是对应的消息,
dwCallbackInstance 是回调实例, dwParam1~ dwParam3 参数是消息的具体参数细节, 在回调
函数里可以监测一个呼叫的各个状态。
第 4 个参数 lpszFriendlyAppName 指向一个字符串, 包含一个应用提供的名称, 这个名称出
现在 LINECALLINFO 结构中用以显示是哪个应用程序的结果。如果 lpszFriendlyAppName 设置
为 NULL , 那么使用 GetModuleFileName 得到的文件名, 就是程序的模块文件名称。 lpdwNumDevs
参数得到设备上有多少个可以使用线路设备, 它指向一个 DWORD 类型的指针, lpdwAPIVersion
说明了 TAPI 支持的最高的版本号, LPLINEINITIALIZEEXPARAMS 指向了一个 LPLINEINITIA-
LIZEEXPARAMS 结构, 该结构定义如下:
typedef struct lineinitializeexparams_tag {
DWORD dwTotalSize;
DWORD dwNeededSize;
DWORD dwUsedSize;
DWORD dwOptions;
union {
HANDLE hEvent;
HANDLE hCompletionPort;
} Handles;
DWORD dwCompletionKey;
} LINEINITIALIZEEXPARAMS;
LINEINITIALIZEEXPARAMS 的第一个和第二个字段分别是结构的大小和需要结构的
大小, dwUsedSize 说明了有用信息所占有的大小。 dwOptions 定义了使用何种通知消息机制,
这个字段可以使用以下标志:
LINEINITIALIZEEXOPTION_USECOMPLETIONPORT 使用完备端口事件通知
LINEINITIALIZEEXOPTION_USEEVENT 使用事件通知机
LINEINITIALIZEEXOPTION_USEHIDDENWINDOW 使用隐藏窗口 事件通知机制。
使用 lineInitialize初始化线路的代码如下:
DWORD InitializeTAPI ()
{
HLINEAPP g_hLineApp; (这个是全局变量)
HINSTANCE g_hDialCallBackInst = NULL; // Local copy of hInstance
DWORD dwReturn = lineInitialize(&g_hLineApp,g_hDialCallBackInst,(LINECALLBACK) lineCallbackFunc,
NULL,&g_dwNumDevs);/*
使用这个函数可以让我获取应用程序 的TAPI句柄,以及线路设备的个数。其中有一个是Cellular Line
*/
switch(dwReturn)
{
case LINEERR_INVALAPPNAME:
MessageBox(NULL,_T("Invalid application name."),_T("Error"),MB_OK);
break;
case LINEERR_OPERATIONFAILED:
MessageBox(NULL,_T("The operation failed."),_T("Error"),MB_OK);
break;
case LINEERR_INIFILECORRUPT:
MessageBox(NULL,_T("The INI file is corrupted."),_T("Error"),MB_OK);
break;
case LINEERR_RESOURCEUNAVAIL:
MessageBox(NULL,_T("The resource is unavailable."),_T("Error"),MB_OK);
break;
case LINEERR_INVALPOINTER:
MessageBox(NULL,_T("Invalid pointer."),_T("Error"),MB_OK);
break;
case LINEERR_REINIT:
MessageBox(NULL,_T("The application attempted to initialize TAPI twice."),_T("Error"),MB_OK);
break;
case LINEERR_NODRIVER:
MessageBox(NULL,_T("No driver was found."),_T("Error"),MB_OK);
break;
case LINEERR_NODEVICE:
MessageBox(NULL,_T("No device was found."),_T("Error"),MB_OK);
break;
case LINEERR_NOMEM:
MessageBox(NULL,_T("No memory is available."),_T("Error"),MB_OK);
break;
case LINEERR_NOMULTIPLEINSTANCE:
MessageBox(NULL,_T("Multiple instances were not found."),_T("Error"),MB_OK);
break;
default:
break;
}
/* 其他处理…… */
}