outgoing.cpp
来自「一个基于com的电话检测和回复程序。程序使用tapi3.0实现」· C++ 代码 · 共 1,059 行 · 第 1/2 页
CPP
1,059 行
/*++
Copyright (c) 1999 - 2000 Microsoft Corporation. All Rights Reserved.
--*/
#define UNICODE
#include <windows.h>
#include <tapi3.h>
#include <strmif.h>
#include <control.h>
#include "resource.h"
//////////////////////////////////////////////////////////
// T3OUT.EXE
//
// Example of making an outgoing call with TAPI 3.0
//
// This application will allow a user to make a call
// by using TAPI 3.0. The application will simply look
// for the first TAPI line that support Audio, and can
// dial a phone number. It will then use that line to
// make calls.
//
// This application does not handle incoming calls, and
// does not process incoming messages.
//
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
// Constants
//////////////////////////////////////////////////////////
const DWORD ADDRESSLENGTH = 128;
const DWORD MAXTERMINALS = 5;
const WCHAR * const gszTapi30 = L"TAPI 3.0 Outgoing Call Sample";
const WCHAR * const gszConferenceName = L"Conference Name";
const WCHAR * const gszEmailName = L"Email Name";
const WCHAR * const gszMachineName = L"Machine Name";
const WCHAR * const gszPhoneNumber = L"Phone Number";
const WCHAR * const gszIPAddress = L"IP Address";
//////////////////////////////////////////////////////////
// GLOBALS
//////////////////////////////////////////////////////////
HINSTANCE ghInst;
HWND ghDlg = NULL;
ITTAPI * gpTapi;
ITAddress * gpAddress = NULL;
ITBasicCallControl * gpCall;
//////////////////////////////////////////////////////////
// PROTOTYPES
//////////////////////////////////////////////////////////
INT_PTR
CALLBACK
MainDialogProc(
HWND hDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
HRESULT
FindAnAddress(
DWORD dwAddressType,
BSTR * ppName
);
HRESULT
GetTerminal(
ITStream * pStream,
ITTerminal ** ppTerminal
);
HRESULT
GetVideoRenderTerminal(
ITTerminal ** ppTerminal
);
HRESULT
MakeTheCall(
DWORD dwAddressType,
PWCHAR szAddressToCall
);
HRESULT
DisconnectTheCall();
void
DoMessage(
LPWSTR pszMessage
);
HRESULT
InitializeTapi();
void
ShutdownTapi();
void
EnableButton(
HWND hDlg,
int ID
);
void
DisableButton(
HWND hDlg,
int ID
);
BOOL
AddressSupportsMediaType(
ITAddress * pAddress,
long lMediaType
);
//////////////////////////////////////////////////////////
// WinMain
//////////////////////////////////////////////////////////
int
WINAPI
WinMain(
HINSTANCE hInst,
HINSTANCE hPrevInst,
LPSTR lpCmdLine,
int nCmdShow
)
{
ghInst = hInst;
// need to coinit
if ( FAILED( CoInitialize(NULL) ) )
{
return 0;
}
if ( FAILED( InitializeTapi() ) )
{
return 0;
}
// everything is initialized, so
// start the main dialog box
DialogBox(
ghInst,
MAKEINTRESOURCE(IDD_MAINDLG),
NULL,
MainDialogProc
);
ShutdownTapi();
CoUninitialize();
return 1;
}
//////////////////////////////////////////////////////////////
// InitializeTapi
//
// Various initializations
///////////////////////////////////////////////////////////////
HRESULT
InitializeTapi()
{
HRESULT hr;
// cocreate the TAPI object
hr = CoCreateInstance(
CLSID_TAPI,
NULL,
CLSCTX_INPROC_SERVER,
IID_ITTAPI,
(LPVOID *)&gpTapi
);
if ( FAILED(hr) )
{
DoMessage(L"CoCreateInstance on TAPI failed");
return hr;
}
// call initialize. this must be called before
// any other tapi functions are called.
hr = gpTapi->Initialize();
if (S_OK != hr)
{
DoMessage(L"TAPI failed to initialize");
gpTapi->Release();
gpTapi = NULL;
return hr;
}
return S_OK;
}
///////////////////////////////////////////////////////////////
// ShutdownTapi
///////////////////////////////////////////////////////////////
void
ShutdownTapi()
{
// if there is still a call,
// release it
if (NULL != gpCall)
{
gpCall->Release();
gpCall = NULL;
}
// if we have an address object
// release it
if (NULL != gpAddress)
{
gpAddress->Release();
gpAddress = NULL;
}
// release main object.
if (NULL != gpTapi)
{
gpTapi->Shutdown();
gpTapi->Release();
gpTapi = NULL;
}
}
///////////////////////////////////////////////////////////////////////////
// InitAddressTypeComboBox
//
// Put address type string in the combo box
// and save the addresstype with the string
//
///////////////////////////////////////////////////////////////////////////
void
InitAddressTypeComboBox(
HWND hComboBox
)
{
int i;
i = (int)SendMessage( hComboBox, CB_ADDSTRING, 0, (LONG_PTR)gszConferenceName );
SendMessage(
hComboBox,
CB_SETITEMDATA ,
i,
(LONG_PTR)LINEADDRESSTYPE_SDP
);
i = (int)SendMessage( hComboBox, CB_ADDSTRING, 0, (LONG_PTR)gszEmailName );
SendMessage(
hComboBox,
CB_SETITEMDATA ,
i,
(LONG_PTR)LINEADDRESSTYPE_EMAILNAME
);
i = (int)SendMessage( hComboBox, CB_ADDSTRING, 0, (LONG_PTR)gszMachineName );
SendMessage(
hComboBox,
CB_SETITEMDATA ,
i,
(LONG_PTR)LINEADDRESSTYPE_DOMAINNAME
);
i = (int)SendMessage( hComboBox, CB_ADDSTRING, 0, (LONG_PTR)gszPhoneNumber );
SendMessage(
hComboBox,
CB_SETITEMDATA ,
i,
(LONG_PTR)LINEADDRESSTYPE_PHONENUMBER
);
SendMessage( hComboBox, CB_SETCURSEL, i, 0 );
i = (int)SendMessage( hComboBox, CB_ADDSTRING, 0, (LONG_PTR)gszIPAddress );
SendMessage(
hComboBox,
CB_SETITEMDATA ,
i,
(LONG_PTR)LINEADDRESSTYPE_IPADDRESS
);
}
///////////////////////////////////////////////////////////////////////////
// MainDlgProc
///////////////////////////////////////////////////////////////////////////
INT_PTR
CALLBACK
MainDialogProc(
HWND hDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch (uMsg)
{
case WM_INITDIALOG:
{
HWND hComboBox;
// set up dialog
ghDlg = hDlg;
EnableButton( hDlg, IDOK );
DisableButton( hDlg, IDC_DISCONNECT );
hComboBox = GetDlgItem( hDlg, IDC_ADDRESSTYPE );
InitAddressTypeComboBox(hComboBox);
SetFocus( hComboBox );
return 0;
}
case WM_COMMAND:
{
if ( LOWORD(wParam) == IDCANCEL )
{
// quit
EndDialog( hDlg, 0 );
return 1;
}
// dial request
if ( LOWORD(wParam) == IDOK )
{
HWND hComboBox;
DWORD dwIndex;
DWORD dwAddressType;
WCHAR szAddressToCall[ADDRESSLENGTH];
// get the address type the user selected.
hComboBox = GetDlgItem( hDlg, IDC_ADDRESSTYPE );
dwIndex = (DWORD)SendMessage( hComboBox, CB_GETCURSEL, 0, 0 );
dwAddressType = (DWORD)SendMessage(
hComboBox,
CB_GETITEMDATA,
dwIndex,
0
);
// get the address the user wants to call
GetDlgItemText(
hDlg,
IDC_ADDRESS,
szAddressToCall,
ADDRESSLENGTH
);
// make the call
if ( S_OK == MakeTheCall(dwAddressType, szAddressToCall) )
{
EnableButton( hDlg, IDC_DISCONNECT );
DisableButton( hDlg, IDOK );
}
else
{
DoMessage(L"The call failed to connect");
}
return 1;
}
// disconnect request
if ( LOWORD( wParam ) == IDC_DISCONNECT )
{
// disconnect
if (S_OK == DisconnectTheCall())
{
EnableButton( hDlg, IDOK );
DisableButton( hDlg, IDC_DISCONNECT );
}
else
{
DoMessage(L"The call failed to disconnect");
}
return 1;
}
return 0;
}
default:
return 0;
}
}
////////////////////////////////////////////////////////////////////////
// FindAnAddress
//
// Finds an address object that this application will use to make calls on.
//
// This function finds an address that supports the addresstype passed
// in, as well as the audioin and audioout media types.
//
// Return Value
// S_OK if it finds an address
// E_FAIL if it does not find an address
////////////////////////////////////////////////////////////////////////
HRESULT
FindAnAddress(
DWORD dwAddressType,
BSTR * ppName
)
{
HRESULT hr = S_OK;
BOOL bFoundAddress = FALSE;
IEnumAddress * pEnumAddress;
ITAddress * pAddress;
ITAddressCapabilities * pAddressCaps;
long lType = 0;
// if we have an address object
// release it
if (NULL != gpAddress)
{
gpAddress->Release();
gpAddress = NULL;
}
// enumerate the addresses
hr = gpTapi->EnumerateAddresses( &pEnumAddress );
if ( FAILED(hr) )
{
return hr;
}
while ( !bFoundAddress )
{
// get the next address
hr = pEnumAddress->Next( 1, &pAddress, NULL );
if (S_OK != hr)
{
break;
}
hr = pAddress->QueryInterface(IID_ITAddressCapabilities, (void**)&pAddressCaps);
if ( SUCCEEDED(hr) )
{
hr = pAddressCaps->get_AddressCapability( AC_ADDRESSTYPES, &lType );
pAddressCaps->Release();
if ( SUCCEEDED(hr) )
{
// is the type we are looking for?
if ( dwAddressType & lType )
{
// does it support audio?
if ( AddressSupportsMediaType(pAddress, TAPIMEDIATYPE_AUDIO) )
{
// does it have a name?
if ( SUCCEEDED( pAddress->get_AddressName(ppName) ) )
{
// save it in the global variable
// since we break out of the loop, this one won't
// get released
gpAddress = pAddress;
bFoundAddress = TRUE;
break;
}
}
}
}
}
pAddress->Release();
} // end while loop
pEnumAddress->Release();
if (!bFoundAddress)
{
return E_FAIL;
}
return S_OK;
}
/////////////////////////////////////////////////////////////////
// IsVideoCaptureStream
//
// Returns true if the stream is for video capture
/////////////////////////////////////////////////////////////////
BOOL
IsVideoCaptureStream(
ITStream * pStream
)
{
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?