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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? tapicode.c

?? 一份有用的TAPI編程源碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
        if (HandleLineErr(lReturn))
            continue;
        else
        {
            OutputDebugLineError(lReturn, 
                "lineInitialize unhandled error: ");
            g_bInitializing = FALSE;
            return FALSE;
        }
    }
    while(lReturn != SUCCESS);

    // if hWndParent is a valid hWnd, we keep it as the parent for
    // all dialogs.
    if (IsWindow(hWndParent))
    {
        g_hDlgParentWindow = g_hWndMainWindow = hWndParent;
    }
    else
    {
        // Has the old g_hWndMainWindow gone away?
        if (!IsWindow(g_hWndMainWindow))
        {
            OutputDebugString("Main window unavailable.\n");
            g_hDlgParentWindow = g_hWndMainWindow = NULL;
        }
    }

    g_hCall = (HCALL)((ULONG_PTR)NULL);
    g_hLine = (HLINE)((ULONG_PTR)NULL);

    OutputDebugString("Tapi initialized.\n");
    g_bInitializing = FALSE;
    return TRUE;
}


//
//  FUNCTION: BOOL ShutdownTAPI()
//
//  PURPOSE: Shuts down all use of TAPI
//
//  PARAMETERS:
//    None
//
//  RETURN VALUE:
//    True if TAPI successfully shut down.
//
//  COMMENTS:
//
//    If ShutdownTAPI fails, then its likely either a problem
//    with the service provider (and might require a system
//    reboot to correct) or the application ran out of memory.
//
//

BOOL ShutdownTAPI()
{
    long lReturn;

    // If we aren't initialized, then Shutdown is unnecessary.
    if (g_hLineApp == (HLINE)((ULONG_PTR)NULL))
        return TRUE;

    // Prevent ShutdownTAPI re-entrancy problems.
    if (g_bShuttingDown)
        return TRUE;

    g_bShuttingDown = TRUE;

    HangupCall();
    
    do
    {
        lReturn = lineShutdown(g_hLineApp);
        if (HandleLineErr(lReturn))
            continue;
        else
        {
            OutputDebugLineError(lReturn, "lineShutdown unhandled error: ");
            break;
        }
    }
    while(lReturn != SUCCESS);

    g_bTapiInUse = FALSE;
    g_bConnected = FALSE;
    g_hLineApp = (HLINE)((ULONG_PTR)NULL);
    g_hCall = (HCALL)((ULONG_PTR)NULL);
    g_hLine = (HLINE)((ULONG_PTR)NULL);
    g_bShuttingDown = FALSE;
    OutputDebugString("TAPI uninitialized.\n");
    return TRUE;
}



//
//  FUNCTION: BOOL HangupCall()
//
//  PURPOSE: Hangup the call in progress if it exists.
//
//  PARAMETERS:
//    none
//
//  RETURN VALUE:
//    TRUE if call hung up successfully.
//
//  COMMENTS:
//
//    If HangupCall fails, then its likely either a problem
//    with the service provider (and might require a system
//    reboot to correct) or the application ran out of memory.
//
//

BOOL HangupCall()
{         
    LPLINECALLSTATUS pLineCallStatus = NULL;
    long lReturn;

    // Prevent HangupCall re-entrancy problems.
    if (g_bStoppingCall)
        return TRUE;

    // if the 'Call' dialog is up, dismiss it.
    if (g_hDialog)
        PostMessage(g_hDialog, WM_COMMAND, IDCANCEL, 0);

    // If Tapi is not being used right now, then the call is hung up.
    if (!g_bTapiInUse)
        return TRUE;

    g_bStoppingCall = TRUE;
    OutputDebugString("Stopping Call in progress\n");

    // Disable the 'hangup call' user interface.
    EnableHangupCall(g_hWndMainWindow, FALSE);

    // Stop any data communications on the comm port.
    StopComm();

    // If there is a call in progress, drop and deallocate it.
    if (g_hCall)
    {
        // I_lineGetCallStatus returns a LocalAlloc()d buffer
        pLineCallStatus = I_lineGetCallStatus(pLineCallStatus, g_hCall);
        if (pLineCallStatus == NULL)
        {
            ShutdownTAPI();
            g_bStoppingCall = FALSE;
            return FALSE;
        }

        // Only drop the call when the line is not IDLE.
        if (!((pLineCallStatus -> dwCallState) & LINECALLSTATE_IDLE))
        {
            do
            {
                lReturn = WaitForReply(lineDrop(g_hCall, NULL, 0));

                if (lReturn == WAITERR_WAITTIMEDOUT)
                {
                    OutputDebugString("Call timed out in WaitForReply.\n");
                    break;
                }

                if (lReturn == WAITERR_WAITABORTED)
                {
                    OutputDebugString("lineDrop: WAITERR_WAITABORTED.\n");
                    break;
                }

                // Was the call already in IDLE?
                if (lReturn == LINEERR_INVALCALLSTATE)
                    break;

                if (HandleLineErr(lReturn))
                    continue;
                else
                {
                    OutputDebugLineError(lReturn, 
                        "lineDrop unhandled error: ");
                    break;
                }
            }
            while(lReturn != SUCCESS);

            // Wait for the dropped call to go IDLE before continuing.
            lReturn = WaitForCallState(LINECALLSTATE_IDLE);

            if (lReturn == WAITERR_WAITTIMEDOUT)
                OutputDebugString("Call timed out waiting for IDLE state.\n");

            if (lReturn == WAITERR_WAITABORTED)
                OutputDebugString(
                    "WAITERR_WAITABORTED while waiting for IDLE state.\n");

            OutputDebugString("Call Dropped.\n");
        }

        // The call is now idle.  Deallocate it!
        do
        {
            lReturn = lineDeallocateCall(g_hCall);
            if (HandleLineErr(lReturn))
                continue;
            else
            {
                OutputDebugLineError(lReturn,
                    "lineDeallocateCall unhandled error: ");
                break;
            }
        }
        while(lReturn != SUCCESS);
            
        OutputDebugString("Call Deallocated.\n");
    }


    // if we have a line open, close it.
    if (g_hLine)
    {
        do
        {
            lReturn = lineClose(g_hLine);
            if (HandleLineErr(lReturn))
                continue;
            else
            {
                OutputDebugLineError(lReturn, 
                    "lineClose unhandled error: ");
                break;
            }
        }
        while(lReturn != SUCCESS);
        
        OutputDebugString("Line Closed.\n");
    }

    // Call and Line are taken care of.  Finish cleaning up.

    // If there is device configuration information, free the memory.
    if (g_lpDeviceConfig)
        LocalFree(g_lpDeviceConfig);
    g_lpDeviceConfig = NULL;

    g_hCall = (HCALL)((ULONG_PTR)NULL);
    g_hLine = (HLINE)((ULONG_PTR)NULL);
    g_bConnected = FALSE;

    g_bTapiInUse = FALSE;
    g_bStoppingCall = FALSE; // allow HangupCall to be called again.
    OutputDebugString("Call stopped\n");

    // Update the user interface.
    UpdateStatusBar("Ready to make a call.",1,0);
    EnableMakeCall(g_hWndMainWindow, TRUE);

    // Need to free LocalAlloc()d buffer returned from I_lineGetCallStatus
    if (pLineCallStatus)
        LocalFree(pLineCallStatus);  
        
    return TRUE;
}


//
//  FUNCTION: PostHangupCall()
//
//  PURPOSE: Posts a message to the main TAPI thread to hangup the call.
//
//  PARAMETERS:
//    none
//
//  RETURN VALUE:
//    none
//
//  COMMENTS:
//
//    TAPI is thread specific, meaning that only the thread that does the
//    lineInitialize can get asynchronous messages through the callback.
//    Since the HangupCall can potentially go into a loop waiting for 
//    specific events, any other threads that call HangupCall can cause
//    timing confusion.  Best to just have other threads 'ask' the main thread
//    to hangup the call.
//

void PostHangupCall()
{
    PostMessage(g_hWndMainWindow, WM_COMMAND, IDM_HANGUPCALL, 0);
}



//
//  FUNCTION: DialCall()
//
//  PURPOSE: Get a number from the user and dial it.
//
//  PARAMETERS:
//    none
//
//  RETURN VALUE:
//    TRUE if able to get a number, find a line, and dial successfully.
//
//  COMMENTS:
//
//    This function makes several assumptions:
//    - The number dialed will always explicitly come from the user.
//    - There will only be one outgoing address per line.
//

BOOL DialCall()
{
    long lReturn;
    LPLINEADDRESSSTATUS lpLineAddressStatus = NULL;
    LPLINEDEVCAPS lpLineDevCaps = NULL;

    if (g_bTapiInUse)
    {
        OutputDebugString("A call is already being handled\n");
        return FALSE;
    }

    // If TAPI isn't initialized, its either because we couldn't initialize
    // at startup (and this might have been corrected by now), or because
    // a REINIT event was received.  In either case, try to init now.

    if (!g_hLineApp)
    {
        if (!InitializeTAPI(NULL))
            return FALSE;
    }

    // If there are no line devices installed on the machine, lets give
    // the user the opportunity to install one.
    if (g_dwNumDevs < 1)
    {
        if (!HandleNoDevicesInstalled())
            return FALSE;
    }

    // We now have a call active.  Prevent future calls.
    g_bTapiInUse = TRUE;
    EnableMakeCall(g_hWndMainWindow, FALSE);


    // Get a phone number from the user.
    // Phone number will be placed in global variables if successful
    if (!GetAddressToDial())
    {
        HangupCall();
        goto DeleteBuffers;
    }

    // Negotiate the API version to use for this device.
    g_dwAPIVersion = I_lineNegotiateAPIVersion(g_dwDeviceID);
    if (g_dwAPIVersion == 0)
    {
        MessageBox(g_hDlgParentWindow,
            "Line Version unsupported by this Sample",
            "Unable to Use Line",MB_OK);
        HangupCall();
        goto DeleteBuffers;
    }

    // Need to check the DevCaps to make sure this line is usable.
    // The 'Dial' dialog checks also, but better safe than sorry.
    lpLineDevCaps = I_lineGetDevCaps(lpLineDevCaps,
        g_dwDeviceID, g_dwAPIVersion);
    if (lpLineDevCaps == NULL)
    {
        HangupCall();
        MessageBox(g_hDlgParentWindow,
            "Error on Requested line",
            "Unable to Use Line",MB_OK);
        goto DeleteBuffers;
    }

    if (!(lpLineDevCaps->dwBearerModes & LINEBEARERMODE_VOICE ))
    {
        HangupCall();
        MessageBox(g_hDlgParentWindow,
            "Error on Requested line",
            "The selected line doesn't support VOICE capabilities",
            MB_OK);
        goto DeleteBuffers;
    }

    if (!(lpLineDevCaps->dwMediaModes & LINEMEDIAMODE_DATAMODEM))
    {
        HangupCall();
        MessageBox(g_hDlgParentWindow,
            "Error on Requested line",
            "The selected line doesn't support DATAMODEM capabilities",
            MB_OK);
        goto DeleteBuffers;
    }

    // Does this line have the capability to make calls?
    // It is possible that some lines can't make outbound calls.

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一区国产视频| 日韩欧美国产综合在线一区二区三区| 精品sm捆绑视频| 国产一区二区三区四| 精品国内片67194| 国产精品一区二区三区乱码| 日韩视频一区在线观看| 激情另类小说区图片区视频区| 日韩精品一区二区三区中文不卡 | 欧美一区二区免费| 丝袜美腿亚洲一区| 精品女同一区二区| 成人性生交大片免费看视频在线| 国产精品久久久久婷婷二区次 | 在线观看亚洲一区| 日韩影院免费视频| 国产精品久久久久久久浪潮网站| 波多野结衣中文字幕一区二区三区 | 成人欧美一区二区三区小说 | 欧美日韩精品免费| 久久99久久精品| 国产精品乱码久久久久久| 欧美性猛片aaaaaaa做受| 日本不卡中文字幕| 国产精品天干天干在观线| 欧美日韩精品一区二区| 国产一区 二区| 一区二区高清免费观看影视大全| 欧美一区二区三区在| 成人免费观看视频| 日本欧美在线观看| 亚洲天堂a在线| 2022国产精品视频| 欧美色爱综合网| 国产乱码精品一区二区三区五月婷| 国产精品妹子av| 91麻豆精品国产91久久久久久| 国产一区二区三区美女| 一区二区高清视频在线观看| 欧美α欧美αv大片| 色综合视频在线观看| 麻豆91免费观看| 一区二区三区欧美亚洲| 精品奇米国产一区二区三区| 久久国产日韩欧美精品| 亚洲丝袜自拍清纯另类| 色久综合一二码| 国产suv精品一区二区三区| 亚洲精品乱码久久久久久日本蜜臀| 精品国产一区二区三区忘忧草| 91免费国产在线观看| 国产一区二区三区在线观看免费| 亚洲人成精品久久久久久| 久久久精品日韩欧美| 欧美色倩网站大全免费| 成人av影视在线观看| 麻豆精品一区二区av白丝在线| 亚洲精品国产精品乱码不99 | 欧美三级欧美一级| www.99精品| 国产精品综合视频| 麻豆国产欧美日韩综合精品二区| 亚洲免费高清视频在线| 中文字幕高清不卡| 欧美videos大乳护士334| 欧美美女黄视频| 91毛片在线观看| 国产曰批免费观看久久久| 亚洲va韩国va欧美va精品| 久久精品在这里| 久久你懂得1024| 日韩免费一区二区三区在线播放| 91精品国产一区二区| 91国产福利在线| 91老司机福利 在线| 国产成人综合在线播放| 懂色av一区二区夜夜嗨| 国产在线精品一区二区三区不卡 | 久久99国产精品麻豆| 亚洲二区在线观看| 一区二区三区精品视频在线| 一区在线中文字幕| 精品国产成人系列| 7777精品久久久大香线蕉| 欧美无乱码久久久免费午夜一区 | 欧美体内she精高潮| 91九色最新地址| 欧美中文字幕一区二区三区亚洲| 成人91在线观看| 国产精品一区在线| 久久精品999| 国产精品亚洲一区二区三区妖精 | 色一区在线观看| 欧洲人成人精品| 91国内精品野花午夜精品| 99国产精品视频免费观看| 91丨九色丨蝌蚪丨老版| 国产美女精品在线| 成人av电影在线网| 国产美女一区二区| 色成年激情久久综合| 欧美日韩中文字幕精品| 日韩欧美色电影| www精品美女久久久tv| 国产精品久久久久久亚洲伦| 国产精品久久久久三级| 亚洲电影你懂得| 日本欧美大码aⅴ在线播放| 国产激情一区二区三区| 国产福利一区二区三区在线视频| 成人午夜伦理影院| 色狠狠一区二区三区香蕉| 欧美日韩一本到| 91精品国产综合久久福利| 欧美r级在线观看| 日韩毛片精品高清免费| 亚洲高清免费观看高清完整版在线观看| 日本aⅴ精品一区二区三区| 国内不卡的二区三区中文字幕| 91热门视频在线观看| 欧美另类videos死尸| 国产日韩欧美电影| 一区二区免费视频| 国产在线播放一区三区四| 色综合欧美在线| 久久久久成人黄色影片| 亚洲黄色av一区| 国产成人免费在线视频| 一本高清dvd不卡在线观看| 日韩精品一区二区在线观看| 中文字幕一区二区三区四区不卡| 日本欧美韩国一区三区| 99国产精品99久久久久久| 欧美岛国在线观看| 亚洲人成在线播放网站岛国| 黄色日韩三级电影| 91免费版pro下载短视频| 久久综合五月天婷婷伊人| 亚洲精品视频在线| 粉嫩高潮美女一区二区三区| 欧美日韩国产中文| 亚洲人成亚洲人成在线观看图片 | 日韩欧美三级在线| 亚洲免费毛片网站| 不卡av电影在线播放| 日韩一区二区三区视频在线观看| 亚洲精品成人精品456| 国产在线精品免费| 精品久久一区二区| 性感美女久久精品| 在线亚洲人成电影网站色www| 久久久久久97三级| 精品一区二区三区免费视频| 精品视频全国免费看| 1区2区3区欧美| 成人综合婷婷国产精品久久蜜臀 | 波多野结衣的一区二区三区| 久久精品欧美一区二区三区麻豆| 久久99精品久久久久久国产越南 | 亚洲国产成人一区二区三区| 亚洲婷婷国产精品电影人久久| 国产成人精品免费一区二区| 久久久久青草大香线综合精品| 日韩国产在线一| 欧美一区2区视频在线观看| 一区二区高清在线| 欧美撒尿777hd撒尿| 亚洲男人的天堂av| 欧美在线免费观看视频| 亚洲欧美日韩综合aⅴ视频| 91免费观看视频在线| 中文字幕亚洲区| 色一情一乱一乱一91av| 国产亚洲一区字幕| av电影天堂一区二区在线观看| 精品久久五月天| 国产最新精品免费| 欧美经典一区二区| 国产精品亚洲第一区在线暖暖韩国 | 欧美一级黄色大片| 久久99热国产| 精品三级av在线| 国产成人精品免费| 国产夜色精品一区二区av| 福利电影一区二区三区| 91网站视频在线观看| 亚洲欧美日韩精品久久久久| 99视频精品全部免费在线| 亚洲色图欧洲色图婷婷| 成人黄页在线观看| 中文字幕视频一区二区三区久| 欧美午夜精品免费| 丝袜亚洲精品中文字幕一区| 日韩视频免费观看高清完整版在线观看 | 丰满少妇在线播放bd日韩电影| 欧美高清在线一区二区| 成人av在线网站| 亚洲一区中文在线| 欧美成人精品高清在线播放| 精品一区二区三区久久|