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

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

?? simpletapi.c

?? Simple usage of TAPI
?? C
字號:
//
//  MODULE: SimpleTAPI.c
//
//  PURPOSE: Demonstrates basic TAPI programming model
//

#include <stdio.h>
#include <windows.h>
#include <winbase.h>

#define TAPI_CURRENT_VERSION 0x00020000
#include <tapi.h>

#include "TapiInfo.h"

HLINEAPP	g_hLineApp;

// Buffers used for pretty printing stuff...
CHAR	strAddress[512];
CHAR	strText[512], strText2[512];

// Various flags...
BOOL	g_bIncoming;		// Waits for Incoming Calls
BOOL	g_bTranslate;		// Perform Address Translation
BOOL	g_bTranslateDialog;	// Display Translation Dialog
BOOL	g_bForce;			// Force specified device
BOOL	g_bQuit;			// Session terminating.
DWORD	g_dwMediaMode;		// MediaMode for calls.
BOOL	g_bTerminate;		// Flag to tell message thread to terminate
DWORD	g_dwDevId;			// TAPI device used.

// Handles and Messages
HANDLE g_hTAPIEvent;	// Created by TAPI
HANDLE g_hEvReply;		// Used for Asynch Reply
HLINE g_hLine;			// Line handle
HCALL g_hCall;			// Call handle

DWORD g_dwTAPIMsg;		// TAPI Message
DWORD g_dwNumDevs;		// Total number of TAPI devices
DWORD g_dwTAPIVer;		// TAPI Version

HANDLE	hEventThread;	// TAPI Event monitoring thread.


// Stuff defined somewhere else
extern DWORD WINAPI CallProc(LPVOID lpThreadParam);
extern DWORD WINAPI zTapiEventThread (LPVOID lpThreadParam);
extern BOOL ParseCommandLine(int ac, char * av[]);

// Stuff defined here...
BOOL WINAPI zControlHandlerRoutine (DWORD dwCtrlType);
DWORD SelectLine(HLINEAPP hLineApp, DWORD dwTAPIVersion, DWORD dwNumDevs,	DWORD dwMediaMode);
void EndSession();

int main (int argc, char * argv[])
{
LINEINITIALIZEEXPARAMS lineInitializeExParams;
LONG lRes;
LINETRANSLATEOUTPUT *lpTranslateOutput;

	g_dwTAPIVer = 0x00020000;

	g_bIncoming = FALSE;
	g_hCall = NULL;
	g_bQuit = FALSE;

	ParseCommandLine(argc, argv);

	SetConsoleCtrlHandler(zControlHandlerRoutine, TRUE);

	g_hEvReply = CreateEvent(NULL, FALSE, FALSE, NULL);

	// Clear the structure before using...
	memset(&lineInitializeExParams, 0, sizeof(LINEINITIALIZEEXPARAMS));
	// Populate the options...
	lineInitializeExParams.dwTotalSize = sizeof(LINEINITIALIZEEXPARAMS);
	lineInitializeExParams.dwOptions = LINEINITIALIZEEXOPTION_USEEVENT;
	// Initialize TAPI.
	lRes = lineInitializeEx(&g_hLineApp, NULL, NULL, 
		"CallTest", &g_dwNumDevs, &g_dwTAPIVer, &lineInitializeExParams);
	if(lRes != 0)  //Oops!
	{
		FormatLineError(lRes, strText);
		printf("TAPI Error: %s on lineInitializeEx.\r\n", strText);
		CloseHandle(g_hEvReply);
		return -1;
	}

	// Got the event handle...
	g_hTAPIEvent = lineInitializeExParams.Handles.hEvent;
	// Start event monitoring...
	hEventThread = CreateThread(NULL, 0, zTapiEventThread, NULL, 0, 0);
	if(hEventThread == NULL)  // Bummer...
	{
		printf("Win32 Error %d on CreateThread (event thread).\r\n", GetLastError());
		g_bTerminate = TRUE;
		WaitForSingleObject(hEventThread,  INFINITE);
		CloseHandle(hEventThread);
		CloseHandle(g_hEvReply);
		lineShutdown(g_hLineApp);
		return -1;
	}
	if(! g_bForce) // Select the device that supports specified media modes.
		g_dwDevId = SelectLine(g_hLineApp, g_dwTAPIVer, g_dwNumDevs, g_dwMediaMode);
	if(g_dwDevId == 0xffffffff) 
	{
		printf("No suitable line found.\r\n");
		g_bTerminate = TRUE;
		WaitForSingleObject(hEventThread,  INFINITE);
		CloseHandle(hEventThread);
		CloseHandle(g_hEvReply);
		lineShutdown(g_hLineApp);
		ExitProcess(0);
	}

	// Open the line...
	lRes = lineOpen(g_hLineApp, g_dwDevId, &g_hLine, 0x00020000, 0x00000000, 1, 
			LINECALLPRIVILEGE_OWNER, g_dwMediaMode, NULL);
	if(lRes != 0)
	{	//  Doh!
		FormatLineError(lRes, strText);
		printf("TAPI Error: %s on lineOpen.\r\n", strText);
		g_bTerminate = TRUE;
		WaitForSingleObject(hEventThread,  INFINITE);
		CloseHandle(hEventThread);
		CloseHandle(g_hEvReply);
		return -1;
	}

	// We want to be notified for everything
	lRes = lineSetStatusMessages(g_hLine, 0x1ffffff, 0);
	if(lRes != 0)
	{	
		FormatLineError(lRes, strText);
		printf("TAPI Error: %s on lineOpen.\r\n", strText);
	}

	if(g_bIncoming)
	{
		printf("Waiting for incoming call.\r\n");
		while (1)
		{
			// Now we wait for notification...
			WaitForSingleObject(g_hEvReply, INFINITE);
			if(g_dwTAPIMsg == LINECALLSTATE_OFFERING)
			{
				printf("Answering.\r\n");
				lRes = lineAnswer(g_hCall, NULL, 0);
				if(lRes != 0)
				{	//  Doh!
					FormatLineError(lRes, strText);
					printf("TAPI Error: %s on lineMakeCall.\r\n", strText);
					EndSession();
				}
				break;
			}
		}
	}
	else
	{
		if(g_bTranslateDialog) 
		{
			lRes = lineTranslateDialog(g_hLineApp, g_dwDevId, g_dwTAPIVer, NULL, strAddress);
			if(lRes != 0)
			{	
				FormatLineError(lRes, strText);
				printf("TAPI Error: %s on lineTranslateDialog.\r\n", strText);
			}
		}

		
		if(g_bTranslate)
		{
			printf("Performing translation\r\nSource: %s\r\n", strAddress);
			lpTranslateOutput = (LINETRANSLATEOUTPUT *)malloc(sizeof(LINETRANSLATEOUTPUT)+1000);
			lpTranslateOutput->dwTotalSize = sizeof(LINETRANSLATEOUTPUT)+1000;
			while (1)
			{
				lRes = lineTranslateAddress(g_hLineApp, g_dwDevId, g_dwTAPIVer, strAddress, 0, 0, lpTranslateOutput);
				if(lRes != 0)
					{	
					FormatLineError(lRes, strText);
					printf("TAPI Error: %s on lineTranslateAddress.\r\n", strText);
					}
				if(lpTranslateOutput->dwTotalSize < lpTranslateOutput->dwNeededSize)
					lpTranslateOutput = (LINETRANSLATEOUTPUT *)realloc(lpTranslateOutput, lpTranslateOutput->dwNeededSize);
				else break;
			} 
			strcpy(strAddress, (LPSTR)((DWORD)lpTranslateOutput+(DWORD)lpTranslateOutput->dwDialableStringOffset));
			printf("Results: %s\r\n",(LPSTR)((DWORD)lpTranslateOutput+(DWORD)lpTranslateOutput->dwDisplayableStringOffset)); 
		}
		printf("Calling %s\r\n", strAddress);
		lRes = lineMakeCall(g_hLine, &g_hCall, strAddress, 0, NULL);
		if(lRes != 0)
		{	//  Doh!
			FormatLineError(lRes, strText);
			printf("TAPI Error: %s on lineMakeCall.\r\n", strText);
		}
	}


	// All done.  Wait for the event thread to finish.
	WaitForSingleObject(hEventThread, INFINITE);
	CloseHandle(hEventThread);
	if(!g_bQuit)
	{
		EndSession();
	}

}


BOOL WINAPI zControlHandlerRoutine (DWORD dwCtrlType) 
{ 

  // Got an control handler event
  switch (dwCtrlType) 
  { 
    case CTRL_C_EVENT:        // Handle any event that will cause
    case CTRL_BREAK_EVENT:    // a termination of our program
    case CTRL_CLOSE_EVENT:
    case CTRL_LOGOFF_EVENT:
    case CTRL_SHUTDOWN_EVENT:
    {
		g_bQuit = TRUE;
		EndSession();
		break;
    }

    default:
      break;
  } 

  return(FALSE);

} // End of zControlHandlerRoutine

// SelectLine function returns the ID of last line device that supports requested MediaMode
// If not found, It will return 0xFFFFFFFF
DWORD SelectLine(
			HLINEAPP hLineApp,	// Valid LineApp Handle 
			DWORD dwTAPIVersion,	// TAPI Version to be used.
			DWORD dwNumDevs,	// Number of line devices
			DWORD dwMediaMode) // MediaMode to look for.
{
DWORD dwResult = 0xFFFFFFFF;
DWORD dwAPIVersion;
LINEEXTENSIONID ExtentionId;
LINEDEVCAPS *lpDevCaps;
DWORD	i;
LONG lRes;
BOOL bDone;

	for(i = 0 ; i < dwNumDevs ; i++)
		{

		lRes = lineNegotiateAPIVersion(hLineApp, i, dwTAPIVersion, dwTAPIVersion, 
										&dwAPIVersion, &ExtentionId);
		if(lRes != 0)  //Oops!
			{
			FormatLineError(lRes, strText);
			printf("TAPI Error: %s on lineNegotiateAPIVersion.\r\n", strText);
			}
		else
			{
			lpDevCaps = (LINEDEVCAPS *)malloc(sizeof(LINEDEVCAPS)+1000);	// Allocate a little extra memory...
			if(lpDevCaps == NULL) return dwResult;	// No luck allocating memory...

			memset(lpDevCaps, 0, sizeof(LINEDEVCAPS)+1000);
			lpDevCaps->dwTotalSize = sizeof(LINEDEVCAPS)+1000;
			bDone = FALSE;
			do // Go around and keep trying until there's enough memory
				{
				lRes = lineGetDevCaps(hLineApp, i, dwAPIVersion, 0, lpDevCaps);
				if(lRes != 0)  //Oops!
					{
					FormatLineError(lRes, strText);
					printf("TAPI Error: %s on lineGetDevCaps.\r\n", strText);
					free(lpDevCaps);
					break;
					}
				if(lpDevCaps->dwNeededSize > lpDevCaps->dwTotalSize)
					// Reallocate for dwNeededSize
					lpDevCaps = (LINEDEVCAPS *)realloc(lpDevCaps, lpDevCaps->dwNeededSize);
				else bDone = TRUE;
				}
			while (!bDone);

			printf("Line %d is %s.\r\n", i, (LPBYTE)((DWORD)lpDevCaps+(DWORD)lpDevCaps->dwLineNameOffset));
			if(lpDevCaps->dwMediaModes & dwMediaMode)
				{
				dwResult = i;
				printf("Line device %d selected.\r\n", i);
				}
			else printf("Line device %d rejected.\r\n", i);
			free(lpDevCaps);
			}
	}
	return dwResult;
}

void EndSession()
{
LINECALLSTATUS CallStatus;
LONG	lRes;
	if(g_hCall != NULL)  // Call might be in progress...
	{
		memset(&CallStatus, 0, sizeof(LINECALLSTATUS));

		lRes = lineGetCallStatus(g_hCall, &CallStatus); 
			// Technically, lineGetCallStatus returns more info than 
			// there is in the structure.  Since we don't care about it,
			// We just go on our merry way...
		if(lRes == 0) // If it didn't fail, there's at least a call that needs
			// to be droped.
		{
			printf("Call is still in progress.  Droping it.\r\n");
			lineDrop(g_hCall, NULL, 0);
		}
	}

	printf("Closing line. (Ctrl Handler)\r\n");
	lRes = lineClose(g_hLine);
	if(lRes != 0)
	{
		FormatLineError(lRes, strText);
		printf("TAPI Error: %s on lineClose.\r\n", strText);
	}

	g_bTerminate = TRUE;  // Tell the event thread that it's time to go...
	WaitForSingleObject(hEventThread, INFINITE); // Wait for it to comit suicide..
	CloseHandle(hEventThread);
	printf("Shutting down TAPI.\r\n");
	lRes = lineShutdown(g_hLineApp);
	if(lRes != 0)
	{
		FormatLineError(lRes, strText);
		printf("TAPI Error: %s on lineShutdown.\r\n", strText);
	}
	ExitProcess(0);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
韩国理伦片一区二区三区在线播放| 国产日韩欧美精品在线| 精品国产一区二区三区忘忧草 | 亚洲成a人片在线观看中文| av电影在线观看完整版一区二区| 国产欧美视频一区二区三区| 国产激情一区二区三区| 成人欧美一区二区三区在线播放| 国产精品1024| 亚洲丰满少妇videoshd| 欧美一级艳片视频免费观看| 美女在线观看视频一区二区| 久久久精品影视| 一本大道av一区二区在线播放| 亚洲国产精品尤物yw在线观看| 欧美成人vps| 欧美色图12p| 99久久久久免费精品国产 | 91国偷自产一区二区开放时间| 亚洲国产日韩精品| 日韩一区在线免费观看| 日韩欧美一级二级| 欧美性xxxxxxxx| 成人综合在线视频| 国产在线国偷精品免费看| 一区二区三区精品在线| 国产精品午夜春色av| 欧美xxxxx牲另类人与| 欧美精品色一区二区三区| av综合在线播放| gogogo免费视频观看亚洲一| 久草精品在线观看| 久久成人羞羞网站| 三级欧美在线一区| 日韩电影免费在线观看网站| 亚洲一区二区视频| 肉肉av福利一精品导航| 一个色在线综合| 视频一区视频二区中文| 人禽交欧美网站| 美女视频一区在线观看| 久久国产福利国产秒拍| 精品一区二区三区视频 | 日韩经典一区二区| 日韩中文字幕一区二区三区| 久久er精品视频| 成人精品一区二区三区中文字幕| 国产精品资源在线看| 高清av一区二区| 色综合久久88色综合天天免费| 在线一区二区观看| 久久久久免费观看| 亚洲色欲色欲www| 免费在线一区观看| 成人激情开心网| 欧美视频一区二区| 久久久精品人体av艺术| 亚洲免费观看视频| 免费的国产精品| 91久久精品一区二区三区| 精品电影一区二区| 日韩高清一区二区| 色综合久久久久久久久久久| 欧美电视剧免费全集观看| 国产精品毛片高清在线完整版| 午夜av一区二区| 欧美体内she精高潮| 中文字幕一区二区三区不卡在线| 日本欧美久久久久免费播放网| av在线播放一区二区三区| 国产精品看片你懂得| 成人av在线资源网站| 亚洲人成精品久久久久久| 777色狠狠一区二区三区| www久久精品| 国产在线精品国自产拍免费| 91精品国产综合久久精品图片 | 黄色成人免费在线| 日韩三级视频中文字幕| 日韩国产欧美视频| 欧美一区二区视频网站| 肉色丝袜一区二区| 久久久www成人免费毛片麻豆 | 一区二区三区精品视频在线| 在线视频亚洲一区| 免费国产亚洲视频| 国产人妖乱国产精品人妖| 99久久久国产精品| 亚洲最新在线观看| 欧美精品一区二区在线播放| 成人一道本在线| 午夜欧美在线一二页| 精品少妇一区二区三区在线播放 | 不卡欧美aaaaa| 亚洲二区在线观看| 国产亚洲一区字幕| 欧美无乱码久久久免费午夜一区| 九九九精品视频| 亚洲美女少妇撒尿| 久久久亚洲精华液精华液精华液| 色综合久久天天综合网| 国产精品77777| 日韩高清一区在线| 亚洲自拍偷拍av| 日本一区二区成人在线| 欧美日韩成人在线一区| 成人av在线资源网| 精品亚洲免费视频| 日产精品久久久久久久性色| 亚洲日本在线看| 亚洲同性gay激情无套| 国产亚洲精品资源在线26u| 欧美日韩国产系列| 欧美美女黄视频| 欧美一区二区三区四区五区 | 日韩欧美国产综合一区| 欧美影院一区二区三区| 99vv1com这只有精品| 国产黄色精品视频| 国产激情一区二区三区桃花岛亚洲| 日本午夜精品视频在线观看| 亚洲第一综合色| 精品在线播放免费| 国产一区二区三区四| 高清国产一区二区三区| 成人免费黄色在线| 欧美四级电影在线观看| 91麻豆精品国产自产在线 | 日韩免费观看2025年上映的电影| 欧美色爱综合网| 欧美一区二区三区视频| 久久―日本道色综合久久| 中文久久乱码一区二区| 亚洲精品综合在线| 精品一区二区影视| 99精品视频在线免费观看| 欧美性xxxxx极品少妇| 精品动漫一区二区三区在线观看| 国产精品少妇自拍| 日韩不卡手机在线v区| 国产一区二区三区观看| 91久久精品国产91性色tv| 日韩欧美在线网站| 亚洲精品中文在线观看| 久久精品国产第一区二区三区| 99精品国产一区二区三区不卡| 3d成人动漫网站| 亚洲激情五月婷婷| 成人小视频在线| 久久久久高清精品| 免费看日韩精品| 欧美精品第1页| 亚洲精品乱码久久久久久| 成人丝袜视频网| 久久精品在这里| 日韩精品色哟哟| 欧美一区二区三区免费观看视频| 亚洲男人的天堂av| 色婷婷久久综合| 亚洲成人av一区二区三区| 欧美日韩一区二区三区四区五区| 国产精品乱人伦中文| 99re视频精品| 亚洲精品网站在线观看| 91美女在线视频| 亚洲午夜在线视频| 日韩欧美电影一区| 国内精品国产三级国产a久久| 精品播放一区二区| 激情综合五月婷婷| 亚洲欧洲综合另类| 91国内精品野花午夜精品| 亚洲美女视频在线| 日韩欧美亚洲国产另类| 国产aⅴ综合色| 日韩影视精彩在线| 国产亚洲人成网站| 在线中文字幕不卡| 国模一区二区三区白浆| 亚洲人成伊人成综合网小说| 欧美区在线观看| 91麻豆福利精品推荐| 日韩精品福利网| 一区二区三区在线视频观看| 日韩一级免费观看| 在线亚洲一区观看| 成人av动漫网站| 国产精品18久久久| 美国一区二区三区在线播放| 亚洲三级视频在线观看| 久久久另类综合| 精品欧美久久久| 欧美老人xxxx18| 在线亚洲高清视频| 一本色道久久综合精品竹菊| 高清国产一区二区三区| 国产精品一区二区久激情瑜伽 | 久久精品视频免费| 久久精品夜夜夜夜久久| 欧美大片日本大片免费观看|