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

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

?? tapiutils.cpp

?? 利用TAPI函數建立撥打電話
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
//
// TAPIUTILS.CPP
//
// This module implements the CTapiConnection class.
//
#include "stdafx.h"
#include <string.h>
#include "TapiUtils.h"

// All TAPI line functions return 0 for SUCCESS, so define it.
#define SUCCESS 0

// TAPI version that this sample is designed to use.
#define SAMPLE_TAPI_VERSION 0x00010004

// Early TAPI version
#define EARLY_TAPI_VERSION 0x00010003

// Possible return error for resynchronization functions.
#define WAITERR_WAITABORTED  1

// A pointer to my class because TAPI needs a callback
CTapiConnection *MyThis;

#if FALSE
// Structures needed to handle special non-dialable characters.
#define g_sizeofNonDialable (sizeof(g_sNonDialable)/sizeof(g_sNonDialable[0]))

typedef struct {
    LONG lError;
    DWORD dwDevCapFlag;
    LPSTR szToken;
    LPSTR szMsg;
} NONDIALTOKENS;

NONDIALTOKENS g_sNonDialable[] = {
    {LINEERR_DIALBILLING,  LINEDEVCAPFLAGS_DIALBILLING,  "$", 
            "Wait for the credit card bong tone" },
    {LINEERR_DIALDIALTONE, LINEDEVCAPFLAGS_DIALDIALTONE, "W", 
            "Wait for the second dial tone" },
    {LINEERR_DIALDIALTONE, LINEDEVCAPFLAGS_DIALDIALTONE, "w", 
            "Wait for the second dial tone" },
    {LINEERR_DIALQUIET,    LINEDEVCAPFLAGS_DIALQUIET,    "@", 
            "Wait for the remote end to answer" },
    {LINEERR_DIALPROMPT,   0,                            "?", 
            "Press OK when you are ready to continue dialing"},
};
#endif

// 
// Constructor
//
CTapiConnection::CTapiConnection()
{
    m_bShuttingDown = FALSE;
    m_bStoppingCall = FALSE;
    m_bInitializing = FALSE;
    m_bTapiInUse = FALSE;
    m_dwNumDevs = 0;
    m_hCall = NULL;
    m_hLine = NULL;
    m_dwDeviceID = 0;
    m_hLineApp = NULL;

    MyThis = this;

};

//
// Destructor
//
CTapiConnection::~CTapiConnection()
{
    m_bInitialized = FALSE;
};

//
//  FUNCTION: BOOL Create()
//
//  PURPOSE: Initializes TAPI
//
BOOL CTapiConnection::Create(char *szPhoneNumber)
{
    long lReturn;

    // If we're already initialized, then initialization succeeds.
    if (m_hLineApp)
        return TRUE;

    // If we're in the middle of initializing, then fail, we're not done.
    if (m_bInitializing)
        return FALSE;

    m_bInitializing = TRUE;

    // Initialize TAPI
    do
    {
        lReturn = ::lineInitialize(&m_hLineApp, 
            AfxGetInstanceHandle(), 
            lineCallbackFunc, 
            "DialIt", 
            &m_dwNumDevs);

        if (m_dwNumDevs == 0)
        {
            AfxMessageBox("There are no telephony devices installed.");
            m_bInitializing = FALSE;
            return FALSE;
        }

        if (HandleLineErr(lReturn))
            continue;
        else
        {
            OutputDebugString("lineInitialize unhandled error\n");
            m_bInitializing = FALSE;
            return FALSE;
        }
    }
    while(lReturn != SUCCESS);

    OutputDebugString("Tapi initialized.\n");

    // If the user furnished a phone number copy it over.
    if (szPhoneNumber)
        strcpy(m_szPhoneNumber, szPhoneNumber);

    m_bInitializing = FALSE;
    return TRUE;
}

//
//  FUNCTION: DialCall()
//
//  PURPOSE: Get a number from the user and dial it.
//
BOOL CTapiConnection::DialCall(char *szPhoneNumber)
{
    long lReturn;
    LPLINEDEVCAPS lpLineDevCaps = NULL;

    if (m_bTapiInUse)
    {
        AfxMessageBox("A call is already being handled.");
        return FALSE;
    }

    // Make sure TAPI is initialized properly
    if (!m_hLineApp)
    {
        if (!Create(NULL))
            return FALSE;
    }

    // If there are no line devices installed on the machine, quit.
    if (m_dwNumDevs < 1)
        return FALSE;

    // We now have a call active.  Prevent future calls.
    m_bTapiInUse = TRUE;

    // Get a phone number from the user.
    if (szPhoneNumber == (char *)NULL)
    {
        if (m_szPhoneNumber == (char *)NULL)
        {
            HangupCall();
            goto DeleteBuffers;
        }
    }
    else 
        strcpy(m_szPhoneNumber, szPhoneNumber);

    // Get the line to use
    lpLineDevCaps = GetDeviceLine(&m_dwAPIVersion, lpLineDevCaps);

    // Need to check the DevCaps to make sure this line is usable.
    if (lpLineDevCaps == NULL)
    {
        OutputDebugString("Error on Requested line\n");
        goto DeleteBuffers;
    }

    if (!(lpLineDevCaps->dwBearerModes & LINEBEARERMODE_VOICE ))
    {
        AfxMessageBox("The selected line doesn't support VOICE capabilities");
        goto DeleteBuffers;
    }

    // Does this line have the capability to make calls?
    if (!(lpLineDevCaps->dwLineFeatures & LINEFEATURE_MAKECALL))
    {
        AfxMessageBox("The selected line doesn't support MAKECALL capabilities");
        goto DeleteBuffers;
    }

    // Does this line have the capability for interactive voice?
    if (!(lpLineDevCaps->dwMediaModes & LINEMEDIAMODE_INTERACTIVEVOICE))
    {
        AfxMessageBox("The selected line doesn't support INTERACTIVE VOICE capabilities");
        goto DeleteBuffers;
    }

    // Open the Line for an outgoing call.
    do
    {
        lReturn = ::lineOpen(m_hLineApp, m_dwDeviceID, &m_hLine,
            m_dwAPIVersion, 0, 0,
            LINECALLPRIVILEGE_NONE, 0, 0);

        if((lReturn == LINEERR_ALLOCATED)||(lReturn == LINEERR_RESOURCEUNAVAIL))
        {
            HangupCall();
            OutputDebugString("Line is already in use by a non-TAPI application "
                "or by another TAPI Service Provider.\n");
            goto DeleteBuffers;
        }

        if (HandleLineErr(lReturn))
            continue;
        else
        {
            OutputDebugString("Unable to Use Line\n");
            HangupCall();
            goto DeleteBuffers;
        }
    }
    while(lReturn != SUCCESS);

    // Start dialing the number
    if( MakeTheCall(lpLineDevCaps, m_szPhoneNumber))
        OutputDebugString("lineMakeCall succeeded.\n");
    else
    {
        OutputDebugString("lineMakeCall failed.\n");
        HangupCall();
    }

DeleteBuffers:

    if (lpLineDevCaps)
        LocalFree(lpLineDevCaps);

    return m_bTapiInUse;
}

//
//  FUNCTION: void GetDeviceLine()
//
//  PURPOSE: Gets the first available line device.
//
//
LPLINEDEVCAPS CTapiConnection::GetDeviceLine(DWORD *pdwAPIVersion, LPLINEDEVCAPS lpLineDevCaps)
{
    DWORD dwDeviceID;
    char szLineUnavail[] = "Line Unavailable";
    char szLineUnnamed[] = "Line Unnamed";
    char szLineNameEmpty[] = "Line Name is Empty";
    LPSTR lpszLineName;
    long lReturn;
    char buf[MAX_PATH];
    LINEEXTENSIONID lineExtID;
    BOOL bDone = FALSE;

    for (dwDeviceID = 0; (dwDeviceID < m_dwNumDevs) && !bDone; dwDeviceID ++)
    {

        lReturn = ::lineNegotiateAPIVersion(m_hLineApp, dwDeviceID, 
            EARLY_TAPI_VERSION, SAMPLE_TAPI_VERSION,
            pdwAPIVersion, &lineExtID);

        if ((HandleLineErr(lReturn))&&(*pdwAPIVersion))
        {
            lpLineDevCaps = MylineGetDevCaps(lpLineDevCaps, dwDeviceID, *pdwAPIVersion);

            if ((lpLineDevCaps -> dwLineNameSize) &&
                (lpLineDevCaps -> dwLineNameOffset) &&
                (lpLineDevCaps -> dwStringFormat == STRINGFORMAT_ASCII))
            {
                // This is the name of the device.
                lpszLineName = ((char *) lpLineDevCaps) + 
                    lpLineDevCaps -> dwLineNameOffset;
                sprintf(buf, "Name of device is: %s\n", lpszLineName);
                OutputDebugString(buf);

            }
            else  // DevCaps doesn't have a valid line name.  Unnamed.
                lpszLineName = szLineUnnamed;
        }
        else  // Couldn't NegotiateAPIVersion.  Line is unavail.
            lpszLineName = szLineUnavail;

        // If this line is usable and we don't have a default initial
        // line yet, make this the initial line.
        if ((lpszLineName != szLineUnavail) && 
            (lReturn == SUCCESS )) 
        {          
            m_dwDeviceID = dwDeviceID;
            bDone = TRUE;
        }
        else 
            m_dwDeviceID = MAXDWORD;
    }
    return (lpLineDevCaps);
}

//
//  FUNCTION: MylineGetDevCaps(LPLINEDEVCAPS, DWORD , DWORD)
//
//  PURPOSE: Gets a LINEDEVCAPS structure for the specified line.
//
//  COMMENTS:
//
//    This function is a wrapper around lineGetDevCaps to make it easy
//    to handle the variable sized structure and any errors received.
//    
//    The returned structure has been allocated with LocalAlloc,
//    so LocalFree has to be called on it when you're finished with it,
//    or there will be a memory leak.
//
//    Similarly, if a lpLineDevCaps structure is passed in, it *must*
//    have been allocated with LocalAlloc and it could potentially be 
//    LocalFree()d.
//
//    If lpLineDevCaps == NULL, then a new structure is allocated.  It is
//    normal to pass in NULL for this parameter unless you want to use a 
//    lpLineDevCaps that has been returned by a previous I_lineGetDevCaps
//    call.
//
//

LPLINEDEVCAPS CTapiConnection::MylineGetDevCaps(
    LPLINEDEVCAPS lpLineDevCaps,
    DWORD dwDeviceID, DWORD dwAPIVersion)
{
    // Allocate enough space for the structure plus 1024.
    size_t sizeofLineDevCaps = sizeof(LINEDEVCAPS) + 1024;
    long lReturn;
    
    // Continue this loop until the structure is big enough.
    while(TRUE)
    {
        // Make sure the buffer exists, is valid and big enough.
        lpLineDevCaps = 
            (LPLINEDEVCAPS) CheckAndReAllocBuffer(
                (LPVOID) lpLineDevCaps, // Pointer to existing buffer, if any
                sizeofLineDevCaps);      // Minimum size the buffer should be

        if (lpLineDevCaps == NULL)
            return NULL;

        // Make the call to fill the structure.
        do
        {            

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
蜜桃av一区二区三区| 99热99精品| 蜜桃av噜噜一区| 蜜臀国产一区二区三区在线播放| 亚洲小说春色综合另类电影| 亚洲一二三四区| 亚洲一区在线观看免费观看电影高清 | 国产suv精品一区二区6| 丁香六月久久综合狠狠色| 国产成人午夜高潮毛片| 国产成人精品一区二区三区网站观看 | 国产mv日韩mv欧美| 成人av在线电影| 色综合天天天天做夜夜夜夜做| 91麻豆免费在线观看| 欧洲一区二区三区在线| 欧美午夜精品电影| 欧美日韩视频在线观看一区二区三区 | 国产一区二区三区国产| 国产精品亚洲成人| 丁香六月综合激情| 一本大道av一区二区在线播放| 欧美少妇bbb| 91精品国产福利| 国产偷国产偷亚洲高清人白洁| 中文字幕一区二区5566日韩| 亚洲图片有声小说| 麻豆91免费观看| www.视频一区| 欧美二区三区的天堂| 精品久久久三级丝袜| 国产精品国产自产拍在线| 亚洲国产美女搞黄色| 久久精品国产亚洲高清剧情介绍| 成人综合日日夜夜| 欧美日韩五月天| 久久久久99精品一区| 一区二区不卡在线视频 午夜欧美不卡在| 亚洲国产视频一区| 国产揄拍国内精品对白| 99精品久久久久久| 日韩午夜在线观看| 日韩毛片高清在线播放| 蜜桃精品在线观看| 91网址在线看| 精品黑人一区二区三区久久| 亚洲精品日韩综合观看成人91| 麻豆精品视频在线观看免费| 99久久精品免费看| 日韩亚洲欧美一区二区三区| 亚洲摸摸操操av| 韩国理伦片一区二区三区在线播放| 99精品黄色片免费大全| 欧美一区二区三区在| 国产精品护士白丝一区av| 日本在线不卡视频| 色8久久人人97超碰香蕉987| 欧美成人三级电影在线| 一区二区三区免费| 国产一区二区三区不卡在线观看| 欧美色精品在线视频| 国产欧美在线观看一区| 日本va欧美va精品| 91久久精品一区二区| 久久精品一区二区三区av| 亚洲成av人在线观看| zzijzzij亚洲日本少妇熟睡| 精品国产免费视频| 亚洲成人综合视频| 91色视频在线| 国产日韩欧美不卡在线| 麻豆精品在线播放| 欧美精选在线播放| 伊人色综合久久天天人手人婷| 国产不卡免费视频| www国产精品av| 免费高清在线一区| 3d动漫精品啪啪1区2区免费| 亚洲精品国产精品乱码不99 | 精品国产91乱码一区二区三区 | 久久久久久久久久久99999| 亚洲成av人片一区二区梦乃| 91亚洲精品久久久蜜桃网站| 久久日一线二线三线suv| 免费观看91视频大全| 在线不卡欧美精品一区二区三区| 亚洲精品视频免费看| 91麻豆产精品久久久久久| 国产精品美女一区二区三区| 国产高清成人在线| 久久久噜噜噜久久人人看| 久久国产三级精品| 日韩欧美专区在线| 蜜臂av日日欢夜夜爽一区| 4438亚洲最大| 日本在线不卡一区| 日韩欧美一区在线| 奇米亚洲午夜久久精品| 日韩午夜激情电影| 美日韩一级片在线观看| 日韩三级视频在线看| 美女久久久精品| 精品国产凹凸成av人网站| 国产一区二区三区在线观看免费 | 91毛片在线观看| 亚洲人精品午夜| 欧美最新大片在线看| 亚洲自拍另类综合| 欧美日韩免费电影| 免费高清不卡av| 精品福利一二区| 国产成人亚洲精品狼色在线| 国产欧美久久久精品影院| 成人午夜精品一区二区三区| 亚洲天堂精品在线观看| 色婷婷综合久色| 亚洲电影一区二区三区| 制服丝袜亚洲色图| 狠狠色伊人亚洲综合成人| 久久你懂得1024| 99精品国产热久久91蜜凸| 亚洲电影在线免费观看| 日韩女同互慰一区二区| 国产风韵犹存在线视精品| 成人欧美一区二区三区小说| 91搞黄在线观看| 日韩电影一二三区| 久久这里只有精品视频网| av亚洲精华国产精华精华| 亚洲自拍欧美精品| 日韩欧美激情一区| www.欧美.com| 日韩av高清在线观看| 久久精品无码一区二区三区| 93久久精品日日躁夜夜躁欧美| 亚洲国产精品一区二区www| 日韩免费高清av| 99久久99久久久精品齐齐| 天天射综合影视| 中文字幕免费不卡在线| 欧美日韩精品一区二区天天拍小说| 极品美女销魂一区二区三区| 中文字幕欧美三区| 在线观看91av| 成人综合日日夜夜| 日欧美一区二区| 欧美国产日韩亚洲一区| 在线看国产一区| 久久精品理论片| 一区二区三区四区乱视频| 欧美不卡123| 色妞www精品视频| 精品影视av免费| 亚洲永久精品国产| 国产欧美在线观看一区| 4438x亚洲最大成人网| 成人黄动漫网站免费app| 日本成人在线网站| ●精品国产综合乱码久久久久| 3d动漫精品啪啪一区二区竹菊| 成人av电影在线观看| 免费不卡在线观看| 一区二区三区美女视频| 久久久不卡影院| 欧美一区二区免费观在线| 色综合天天狠狠| 国产不卡高清在线观看视频| 青青草97国产精品免费观看 | 国产精一区二区三区| 亚洲国产精品影院| 中文字幕一区二区三区不卡 | 视频一区二区不卡| 亚洲精品中文字幕乱码三区| 久久蜜桃一区二区| 91精品国产综合久久蜜臀| 色狠狠一区二区| www.成人在线| 丰满白嫩尤物一区二区| 久久精品久久精品| 日韩在线一区二区三区| 一区二区三区欧美久久| 一区二区中文字幕在线| 久久久久久久久久久久电影| 91精品麻豆日日躁夜夜躁| 欧美午夜精品久久久久久超碰| 91无套直看片红桃| 99精品欧美一区二区三区小说 | 美日韩一级片在线观看| 亚洲国产裸拍裸体视频在线观看乱了 | 亚洲国产精品一区二区www在线 | 亚洲国产美女搞黄色| 亚洲色图在线播放| 国产精品天干天干在线综合| 久久久久久久精| 久久久精品蜜桃| 久久欧美中文字幕| 26uuu精品一区二区| 欧美成人精品3d动漫h| 日韩精品中文字幕在线不卡尤物| 777午夜精品视频在线播放|