亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tapi14.cpp

?? VisualC實踐與提高——串口通信與工程應用篇代碼
?? CPP
字號:
// Tapi14.cpp : implementation file
//

#include "stdafx.h"
#include "Tapi14.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


// A pointer to my class because TAPI needs a callback
CTapi14* CTapi14::MyThis = NULL;
CString strStatus;                         //用于向主窗口傳遞顯示信息

/////////////////////////////////////////////////////////////////////////////
// CTapi14

CTapi14::CTapi14()
{
	MyThis = this;                        //使MyThis指向當前的類實例
	m_LineHandle = NULL;                  //線路句柄初始化為NULL
}

void CTapi14::Create(HWND& hWnd)
{
	m_hWnd = hWnd;                //主程序的窗口句柄
	m_hInst =(HINSTANCE)::GetWindowLong(m_hWnd, GWL_HINSTANCE);

	//將一些必要的屬性設置為NULL
	SetProp( m_hWnd, "HCALL", NULL );
	SetProp( m_hWnd, "HLINE", NULL );
	SetProp( m_hWnd, "HCOMM", NULL );
}


CTapi14::~CTapi14()
{
	//清除保存的屬性值
	RemoveProp( m_hWnd, "HCALL" );
	RemoveProp( m_hWnd, "HLINE" );
	RemoveProp( m_hWnd, "HCOMM" );
}

//***********************************************
// 呼叫函數
//***********************************************
LONG CTapi14::DialCall(CString  PhoneNumber )
{
	LONG	retcode =  0;			
	DWORD	i;						
	DWORD	RetApiVersion;			
	LINEEXTENSIONID	ExtensionID;	

	//檢查電話號碼是否為空
	if( lstrlen( PhoneNumber ) < 1 )
		return( ERRORS );	

	//初始化線路,并注冊回調函數
	if( m_LineHandle == NULL ) {
		retcode = ::lineInitialize( 
							&m_LineHandle,
							m_hInst, 
							(LINECALLBACK)lineCallbackFunc, 
							"FELIX TAPI", 
							&m_dwLines );
		if( retcode < 0 )  {
			TapiStatus("Tapi出錯..." );
			return (retcode);
		}
		else
			TapiStatus("Tapi初始化完畢..." );
	}
	//
	// 遍歷API線路
	// 若發現正確的屬性,則跳出,繼續向下執行 
	//
	m_hLine = (HLINE)GetProp( m_hWnd, "HLINE" );
	if( m_hLine == NULL )
	{
		for( i=0; i < m_dwLines; i++ )
		{
			// 對每條線路協商TAPI版本
			retcode = ::lineNegotiateAPIVersion(
							m_LineHandle,
							i, 
							EARLY_TAPI_VERSION, 
							WIN2KTAPIVERSION,
							&RetApiVersion,
							&ExtensionID );

			retcode = ::lineOpen( m_LineHandle, 
							i, 
							&m_hLine, 
							RetApiVersion,
							0,
							(DWORD)m_hWnd,
							LINECALLPRIVILEGE_MONITOR | 
							LINECALLPRIVILEGE_OWNER,
							LINEMEDIAMODE_DATAMODEM, 
							NULL );
			if( retcode == 0 )
				break;
		}
		if( retcode != 0 )
			return( ERRORS );
	}
	//
	// 找到可用的線路
	SetProp( m_hWnd, "HLINE",(HANDLE)(HLINE)m_hLine );

	//
	// 設置線路屬性,以便撥打外線
	memset( &m_LineParams, 0, sizeof( LINECALLPARAMS ) );
	m_LineParams.dwTotalSize = sizeof( LINECALLPARAMS );
	m_LineParams.dwMinRate = 9600;	
	m_LineParams.dwMaxRate = 28800;	
    m_LineParams.dwBearerMode = LINEBEARERMODE_VOICE; 
	m_LineParams.dwMediaMode  = LINEMEDIAMODE_DATAMODEM;
	//
	// 最后,呼叫電話!
	retcode = ::lineMakeCall( m_hLine, 
					&m_hCall, 
					PhoneNumber,
					0, 
					&m_LineParams );
	if( retcode < 0 ) 
			return (retcode);	
	else
		//等待5s,該時間可以根據實際情況重新設定
		Delay(5000);               
	return( retcode );	
}

//
//  回調函數lineCallbackFunc(..)
//
//  異步接收TAPI的事件
//
void CALLBACK CTapi14::lineCallbackFunc(
					DWORD dwDevice,
					DWORD dwMessage,
					DWORD dwCallbackInstance, 
					DWORD dwParam1, 
					DWORD dwParam2,
					DWORD dwParam3)
{
	MyThis->SetCallbackParams(
					dwDevice, 
					dwMessage, 
					dwCallbackInstance, 
					dwParam1,
					dwParam2, 
					dwParam3);
}
//設置回調函數參數
void CTapi14::SetCallbackParams(
					DWORD dwDevice, 
					DWORD dwMessage, 
					DWORD dwCallbackInstance, 
					DWORD dwParam1,
					DWORD dwParam2, 
					DWORD dwParam3)
{
	m_dwDevice = dwDevice;
	m_dwMessage = dwMessage;
	m_dwCallbackInstance = dwCallbackInstance;
	m_dwParam1 = dwParam1;
	m_dwParam2 = dwParam2; 
	m_dwParam3 = dwParam3;
	
	//調用具體功能的回調函數
	TapiCallBack();		
}	

// *******************************************
// 處理TAPI消息的回調函數
//
void CTapi14::TapiCallBack()
{   
	
    switch (m_dwMessage) 
        { 
        case LINE_LINEDEVSTATE:	
            switch (m_dwParam1)
            {
            	case LINEDEVSTATE_REINIT:
					TapiStatus("重新初始化線路..." );
            		break;
            	case LINEDEVSTATE_RINGING:
					TapiStatus("振鈴..." );
            		break;
            } 
			break; 

        case LINE_CALLSTATE:	
            HandleCallState();
            break;
       
		case LINE_CLOSE: 
			{
			TapiStatus("線路已關閉..." );

			break; 
			}
		case LINE_REPLY:	
		{
			TapiStatus("線路有回應..." );
			::PostMessage(m_hWnd, 
						WM_TAPI_LINE_REPLY, 
						m_dwParam2,  
						(LPARAM)(HCALL)m_dwDevice );
            break;
		}
        case LINE_REQUEST:
        case LINE_ADDRESSSTATE:
            break;
        case LINE_CALLINFO:
            break;
        case LINE_DEVSPECIFIC:
            break;
        case LINE_DEVSPECIFICFEATURE:
            break;
        case LINE_GATHERDIGITS:
            break;
        case LINE_GENERATE:
            break;
        case LINE_MONITORDIGITS:
            break;
        case LINE_MONITORMEDIA:
            break;
        case LINE_MONITORTONE:
            break;
        } /* switch */ 
        
} /* TapiCallBack() */

//********************************
//****處理呼叫狀態的函數****
//********************************
void CTapi14::HandleCallState()
{
    if ((HCALL) m_dwDevice != m_hCall) {
		TapiStatus("無效的設備ID ...");
        return;
    }

	switch( m_dwParam1 )
	{
        case LINECALLSTATE_IDLE:
			{
			TapiStatus("線路空閑...");
			::SendMessage(m_hWnd, WM_TAPI_IDLE, 0, 0); 
			HangupCall();
			break;
			}													     
		case LINECALLSTATE_ACCEPTED:	
			{
			SetVarProps( (HWND)m_dwCallbackInstance, m_dwDevice );
			::PostMessage( m_hWnd,
						WM_TAPI_CALL_ACCEPTED, 
						0, 
						(LPARAM)(HCALL)m_dwDevice );
		 	break;
			}
		case LINECALLSTATE_PROCEEDING:	
			{
			SetVarProps( (HWND)m_dwCallbackInstance, m_dwDevice );
			::PostMessage( m_hWnd, 
						WM_TAPI_CALL_PROCEEDING, 
						0, 
						(LPARAM)(HCALL)m_dwDevice );
			break;
			}
		case LINECALLSTATE_CONNECTED:	
			{
				LineStateConnected();
				break;
			}
		case LINECALLSTATE_OFFERING:	
			{
			TapiStatus("線路已提供...");
			break;
			}
		case LINECALLSTATE_DIALTONE:
			{
			TapiStatus("撥號音...");
            break;
			}
        case LINECALLSTATE_DIALING:		
			{
			TapiStatus("正在撥號...");
			::SendMessage(m_hWnd, WM_TAPI_DIALING, 0, 0); 
            break;
			}
        case LINECALLSTATE_BUSY:
			{
			TapiStatus("線路忙,掛機...");
            HangupCall();
            break;
			}
        case LINECALLSTATE_SPECIALINFO:
			{
			TapiStatus("特殊的信息,可能無法撥號...");
            HangupCall();
            break;
			}
        case LINECALLSTATE_DISCONNECTED:
        {
            LPSTR pszReasonDisconnected;

            switch (m_dwParam2)
            {
                case LINEDISCONNECTMODE_NORMAL:
                    pszReasonDisconnected = "遠端斷線";
					::SendMessage(m_hWnd, WM_TAPI_DISCONNECT, 0, 0); 
                    break;
                case LINEDISCONNECTMODE_UNKNOWN:
                    pszReasonDisconnected = "連接解除:未知原因";
                    break;

                case LINEDISCONNECTMODE_REJECT:
                    pszReasonDisconnected = "遠端退出通話";
                    break;

                case LINEDISCONNECTMODE_PICKUP:
                    pszReasonDisconnected = 
                        "連接解除: 本地電話摘機";
                    break;

                case LINEDISCONNECTMODE_FORWARDED:
                    pszReasonDisconnected = "連接解除: Forwarded";
                    break;

                case LINEDISCONNECTMODE_BUSY:
                    pszReasonDisconnected = "連接解除: 線路忙";
                    break;

                case LINEDISCONNECTMODE_NOANSWER:
                    pszReasonDisconnected = "連接解除:無應答";
                    break;

                case LINEDISCONNECTMODE_BADADDRESS:
                    pszReasonDisconnected = "連接解除: 地址無效";
                    break;

                case LINEDISCONNECTMODE_UNREACHABLE:
                    pszReasonDisconnected = "連接解除: 不可到達";
                    break;

                case LINEDISCONNECTMODE_CONGESTION:
                    pszReasonDisconnected = "連接解除: 堵塞";
                    break;

                case LINEDISCONNECTMODE_INCOMPATIBLE:
                    pszReasonDisconnected = "連接解除: 不兼容";
                    break;

                case LINEDISCONNECTMODE_UNAVAIL:
                    pszReasonDisconnected = "連接解除: 不再有效";
                    break;

                case LINEDISCONNECTMODE_NODIALTONE:
                    pszReasonDisconnected = "連接解除:無撥號音";
                    break;

                default:
                    pszReasonDisconnected = 
                        "連接解除: LINECALLSTATE; Bad Reason";
                    break;

            }
			TapiStatus(pszReasonDisconnected);
            HangupCall();
            break;
        }
	}	/* switch */ 
}

LONG CTapi14::LineStateConnected()
{
	TapiStatus("Hey I am connected!");
	//
	// 本地變量的處理
	LPVARSTRING lpVarStringStruct = NULL;
	size_t sizeofVarStringStruct = sizeof( VARSTRING ) + 1024;

	long lreturn;
	lpVarStringStruct = ( LPVARSTRING )LocalAlloc( 0, sizeofVarStringStruct );
	do
	{
		memset( lpVarStringStruct, 0, sizeofVarStringStruct );
		lpVarStringStruct->dwTotalSize = (DWORD)sizeofVarStringStruct;
		lreturn = lineGetID(0, 
							0, 
							(HCALL)m_dwDevice, 
							LINECALLSELECT_CALL, 
							lpVarStringStruct, 
							"comm/datamodem" );
	} while( lreturn != 0 );
	//
	// 獲取comm句柄并將其存入屬性區
	m_hComm = *((LPHANDLE )( ( LPBYTE )lpVarStringStruct + lpVarStringStruct->dwStringOffset ) );
	SetProp( (HWND)m_dwCallbackInstance, "HCOMM", m_hComm );
	SetVarProps( (HWND)m_dwCallbackInstance, m_dwDevice );

	::SendMessage(m_hWnd,
				WM_TAPI_CONNECT, 
				TAPI_LINECALLSTATE_CONNECTED, 
				(LPARAM)(HANDLE)m_hComm );
	LocalFree( lpVarStringStruct ); 

	return lreturn;
}

//
//  掛機函數
//
LONG CTapi14::HangupCall()
{         

	LONG retcode = 0;		

	TapiStatus("正在停止通話...");	

	m_hCall = (HCALL)GetProp( m_hWnd, "HCALL" );
	m_hComm = (HANDLE)GetProp( m_hWnd, "HCOMM" );

	if( m_hComm != NULL )
	{
		CloseHandle( m_hComm );
		SetProp( m_hWnd, "HCALL", NULL );
	}

	if( m_hCall != NULL )
	{
		retcode = lineDrop( m_hCall, 
							NULL, 
							0 );
		TapiStatus("電話已經掛機...");
		SetProp( m_hWnd, "HCALL", NULL );
	}

	LINECALLINFO LineCallInfo;
	//
	// 裝載呼叫信息到結構中
	memset( &LineCallInfo, 0, sizeof( LINECALLINFO ) );
	LineCallInfo.dwTotalSize = sizeof( LINECALLINFO );
	lineGetCallInfo( (HCALL)m_dwDevice, &LineCallInfo );
	//
	// 收回電話資源
	retcode = lineDeallocateCall( (HCALL)m_dwDevice );
	TapiStatus("收回電話資源...");
	//
	// 電話空閑,清除
	m_hLine = (HLINE)GetProp( m_hWnd, "HLINE" ); 
	//
	// 關閉活動的線路
	if( m_hLine != NULL )
	{
		retcode = lineClose( m_hLine );
		TapiStatus("線路已關閉...");
		SetProp( m_hWnd, "HLINE", (HANDLE)NULL );
	}
	TapiStatus("呼叫已停止...");
    return retcode;
}

//****************************************************
//****通過LINECALLINFO結構設置線路句柄****
//***************************************************
void CTapi14::SetVarProps(HWND hWnd, DWORD hDevice )
{
	LINECALLINFO LineCallInfo;

	memset( &LineCallInfo, 0, sizeof( LINECALLINFO ) );
	SetProp( hWnd, "HCALL", (HANDLE)(HCALL)hDevice );
	LineCallInfo.dwTotalSize = sizeof( LINECALLINFO );
	lineGetCallInfo( (HCALL)hDevice, &LineCallInfo );
 	SetProp(m_hWnd, "HLINE", (HANDLE)(HLINE)LineCallInfo.hLine );
	return;
}

//****************************************************
//****通信狀態顯示函數***
//***************************************************

void CTapi14::TapiStatus(LPSTR lpszError, BOOL bShowMsgBox)
{
	strcpy(m_szMessage, lpszError);
	strStatus=m_szMessage;
	::SendMessage(m_hWnd, WM_TAPI_STATUS, 0, 0); 
	
	Delay(400);

	//想以對話框形式顯示. 
	if(bShowMsgBox)
		AfxMessageBox(m_szMessage);
	
	// 輸出到調試窗口
	OutputDebugString(m_szMessage);
	OutputDebugString("\n");
}

void CTapi14::Delay(UINT lFactor)
{
	MSG msg;
	DWORD dwTimeStarted;
	dwTimeStarted = GetTickCount();

	//取得消息循環的控制
    while(GetTickCount() - dwTimeStarted < lFactor)
	{ 
		if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
        {
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产原创一区二区| 国产一区二区在线观看免费 | 亚洲午夜久久久久| 日韩视频免费直播| 蓝色福利精品导航| 国产精品午夜免费| 色一情一伦一子一伦一区| 亚洲国产一区视频| 蓝色福利精品导航| 国产欧美日产一区| 日韩欧美电影一区| av亚洲精华国产精华| 精品一区二区三区欧美| 亚洲18色成人| 五月天久久比比资源色| 亚洲色图在线看| 久久天天做天天爱综合色| 欧美日精品一区视频| 国产一区欧美日韩| 黄一区二区三区| 日韩av网站在线观看| 亚洲国产精品一区二区www在线| 久久精品亚洲国产奇米99| 日韩欧美美女一区二区三区| 欧美久久久久久久久久| 欧美老肥妇做.爰bbww| 91麻豆.com| 久久久不卡网国产精品二区| 在线日韩av片| 日韩亚洲欧美中文三级| 日韩一级在线观看| 久久综合色一综合色88| 国产亚洲欧美激情| 欧美国产一区在线| 国产精品天美传媒沈樵| 亚洲色图19p| 日韩精品成人一区二区三区| 视频一区免费在线观看| 美脚の诱脚舐め脚责91| 国产精品综合在线视频| 成人av在线资源网站| 日本乱人伦aⅴ精品| 欧美一区二区视频网站| 亚洲免费视频中文字幕| 亚洲色图一区二区三区| 蓝色福利精品导航| 不卡的av在线| 日韩精品在线网站| 亚洲人成人一区二区在线观看| 亚洲va欧美va人人爽| 成人免费的视频| 精品国精品国产尤物美女| 一区2区3区在线看| 大桥未久av一区二区三区中文| 欧美性淫爽ww久久久久无| 国产精品不卡一区二区三区| 九九国产精品视频| 91麻豆精品国产无毒不卡在线观看| 国产午夜精品福利| 国产尤物一区二区| 日韩一二在线观看| 热久久一区二区| 欧美久久久一区| 亚洲综合在线五月| 91麻豆产精品久久久久久 | 久久蜜桃香蕉精品一区二区三区| 一区二区成人在线| 欧美性色黄大片| 亚洲超丰满肉感bbw| 欧美日免费三级在线| 亚瑟在线精品视频| 欧美日韩午夜在线视频| 亚洲第四色夜色| 91精品国产免费| 狠狠v欧美v日韩v亚洲ⅴ| 日韩视频一区二区三区| 国产剧情av麻豆香蕉精品| 精品久久久久久无| 91在线观看美女| 亚洲综合一区二区精品导航| 欧美亚洲日本国产| 亚洲v精品v日韩v欧美v专区| 精品三级av在线| 色哟哟一区二区在线观看| 日韩电影一区二区三区四区| 久久亚洲欧美国产精品乐播| 欧美专区日韩专区| 午夜成人免费电影| 国产精品乱人伦中文| 欧洲激情一区二区| 国产成人亚洲综合色影视| 一区二区三区中文字幕电影| 欧美电影精品一区二区| 91高清视频在线| 成人国产在线观看| 国产一区二区三区| 奇米影视一区二区三区小说| 亚洲乱码精品一二三四区日韩在线 | 欧美日韩中文字幕一区二区| 国产成人av网站| 国产一区二区三区电影在线观看| 午夜精品久久久久久久久久| 久久久久久久久久久电影| 欧美一区二视频| 欧美另类久久久品| 7777精品伊人久久久大香线蕉超级流畅 | 91精品免费观看| 欧美网站一区二区| 欧美日本在线观看| 911精品国产一区二区在线| 99久久精品国产毛片| 成人av动漫在线| 成人av在线资源网| 色先锋资源久久综合| 91视频国产资源| 欧洲一区在线电影| 欧美一区二区在线免费观看| 日韩视频在线永久播放| 久久久久国产免费免费| 亚洲色图欧美激情| 亚洲综合精品自拍| 日韩激情一区二区| 久久精品国产77777蜜臀| 免费观看在线综合| 国产成人精品一区二| 99riav一区二区三区| 欧美精品粉嫩高潮一区二区| 88在线观看91蜜桃国自产| 久久综合99re88久久爱| 丝袜脚交一区二区| 久久精品国产99久久6| 国产mv日韩mv欧美| 在线不卡一区二区| 欧美激情在线一区二区| 一区二区理论电影在线观看| 国产精品资源网| 欧美日韩专区在线| 亚洲日本一区二区| 国产999精品久久久久久绿帽| 欧美三级电影网站| 亚洲综合色噜噜狠狠| 久久不见久久见免费视频1| 成人h版在线观看| 国产女主播在线一区二区| 天堂成人国产精品一区| 日本久久一区二区三区| 国产亚洲精品超碰| 国产精品电影一区二区| 国产一区二区精品在线观看| 国产亚洲制服色| 一区二区三区欧美激情| 国内精品久久久久影院一蜜桃| 欧美人xxxx| 视频一区二区中文字幕| 日韩一区二区精品| 丁香六月久久综合狠狠色| 精品国产一区二区三区久久久蜜月 | 色婷婷av一区二区| 中文字幕在线观看不卡| 日本韩国一区二区| 午夜精品123| 亚洲精品大片www| 91精品国产一区二区人妖| 日韩中文字幕91| 国产丝袜欧美中文另类| 99久久婷婷国产精品综合| 一区二区三区视频在线看| 欧美老年两性高潮| 国产一区二区三区免费播放| 国产精品伦一区| 91精品国产全国免费观看| 国产大陆a不卡| 日韩成人一级大片| 国产日韩欧美a| 欧美日韩另类国产亚洲欧美一级| 日韩激情在线观看| 国产精品超碰97尤物18| 欧美成人video| 欧美人与禽zozo性伦| 国产精品一二一区| 伊人色综合久久天天| 精品精品国产高清一毛片一天堂| 欧美在线小视频| 一本大道久久a久久综合婷婷| 久久99久久精品| 日韩国产在线观看一区| 一区二区三区四区精品在线视频| 久久久久九九视频| 久久久综合激的五月天| 日韩精品一区二区三区视频播放 | 亚洲视频免费观看| 国产精品免费久久| 久久久久国产一区二区三区四区| 欧美成人官网二区| 日韩精品资源二区在线| 欧美成人午夜电影| 亚洲精品一区二区精华| 日韩精品中文字幕一区| 久久久午夜精品理论片中文字幕| 久久九九全国免费|