Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > TAPI- кто разбираеться?


Автор: dandy77 18.7.2008, 19:42
не могу разобраться по MSDN в TAPI (телефония, кто знает). мне нужно написать программу- диалоговое окно на котором одна всего кнопка- "Позвонить" называеться. когда я нажимаю эту кнопку модем должен набирать номер телефона с которым я хочу поговорить, и когда будут слышны длинные гудки я снимаю трубку реального телефона и разговариваю, а точнее жду когда ответят на мои длинные гудки- вызов, и начинаю разговор. как это реализовать? кто- то вобще шарит? пожалуйста подскажите. в интернете нашел какой- то код по этому вопросу- он у меня не работает. 
Код

void CPhoneDlg::OnButton1() 
{
    // TODO: Add your control notification handler code here
       
    // Initialize COM
CoInitializeEx(
    NULL,
    COINIT_MULTITHREADED
    );

// Create a TAPI entry point object.
ITTAPI *gpTapi;
CoCreateInstance(
    CLSID_TAPI,
    NULL,
    CLSCTX_INPROC_SERVER,
    IID_ITTAPI,
    (LPVOID *)&gpTapi
    );

// Initialize TAPI
gpTapi->Initialize();

HRESULT hr;
ITAddress *pAddress = NULL;  
ITBasicCallControl *pBasicCall = NULL; 
IEnumAddress *pIEnumAddress = NULL; 

   gpTapi->_EnumerateAddresses(&pIEnumAddress); 
  //DWORD dwAddressType = LINEADDRESSTYPE_PHONENUMBER; 
  //unsigned short * dwMediaType = TAPIMEDIATYPE_DATAMODEM;   
  OLECHAR wAddressCall [5]; 
  CString strTemp;
  strTemp="41615";
  MultiByteToWideChar(CP_ACP, 0, (LPCTSTR) strTemp, -1, &wAddressCall[0], 5); 

  ITMediaSupport *pMediaSupport = NULL;  
  VARIANT_BOOL bSupport;// = FALSE; 
  bool isSuccessAddress = false; 
  
  BSTR bstrAddressToCall = SysAllocString(&wAddressCall[0]); 

  while(S_OK == pIEnumAddress->Next(1, &pAddress, NULL) ) 
  {  
    hr = pAddress->QueryInterface(IID_ITMediaSupport, (void **)&pMediaSupport); 
    if(hr == S_OK) 
    {      
      //hr = pMediaSupport->QueryMediaType(dwMediaType, &bSupport);        
    //ошибка в следующей строке. ошибка времени исполнения "Acces violation"
    hr = pMediaSupport->QueryMediaType(TAPIMEDIATYPE_String_DataModem, &bSupport);    
        
      if(bSupport) 
      { 
        hr = pAddress->CreateCall(bstrAddressToCall,  &pBasicCall);              
        if(hr == S_OK) 
        {  
          isSuccessAddress = true; 
          break;          
        } 
      } 
    } 
  } 

    hr = pBasicCall->Connect(FALSE);      
    
    /*
    if(isSuccessAddress) 
  { 
    HANDLE hCurrentProcess = GetCurrentProcess(); 
    for(int i=0; i<iCount; ++i) 
    { 
      hr = pBasicCall->Connect(FALSE);      
      if(m_isHangup) 
      { 
        pBasicCall->Disconnect(DC_NORMAL); 
        break; 
      } 
      WaitForInputIdle(hCurrentProcess, iInterval); 
    } 
  }
 */
    
}

Автор: AndreySol 21.7.2008, 07:36
Судя по коду Ваш пример с использованием TAPI 3.0 или выше.
Я могу дать подсказку по TAPI 2.2. Разница у них существенная, поэтому решайте - разбираться с более новой версией (что должно быть правильно) или воспользоваться моей подсказкой по устаревшей версии ?

Автор: dandy77 21.7.2008, 14:51
если можешь AndreySol давай что есть, потом разберусь и с новой версией.

Автор: AndreySol 23.7.2008, 07:21
Держи, проект в VC++ 6.0 (уж извиняйте за старую студию).
Думаю разберешься, если нет - спрашивай.

Автор: dandy77 8.8.2008, 19:30
Спасибо уже скачал, сейчас посмотрю.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)