Pull to refresh

Использование Skype API в С++

Reading time 3 min
Views 23K
Не так давно понадобилась написать приложение которое бы автоматически отправляло сообщение по Skype определенному пользователю, который есть в списке контактов. Задача была не много сложнее, но дело не в этом. Решил написать маленькую статейку по использованию Skype API.

Всем известно, что у Skype есть свое API, причем для разных языков. Я хотел начать описания с Skype4COM для С++.
Скачать Skype4COM можно с официального сайта.
В архиве находятся три файлика:
  • Skype4COM.chm
  • Skype4COM.dll
  • Skype4COM.msm

Нам нужен собственно Skype4COM.dll.

Hello world для Skype


За первый пример я решил взять пример с сайта скайпа, который выводит версию текущего скайп клиента.
#import "Skype4COM.dll" 
 
int _tmain(int argc, _TCHAR* argv[]) { 
  // Инициализмруем COM соединение 
  CoInitialize(NULL); 
 
  // Создаем Skype объект 
  SKYPE4COMLib::ISkypePtr pSkype(__uuidof(SKYPE4COMLib::Skype)); 
 
  // Соединяемся с Skype API 
  pSkype->Attach(6,VARIANT_TRUE); 

  // Получаем версию клиента и выводим ее 
  _bstr_t bstrSkypeVersion = pSkype->GetVersion(); 
  printf("Skype client version %s\n", (char*)bstrSkypeVersion); 
  
  //Печатаем версию COM "обертки" 
  _bstr_t bstrWrapperVersion = pSkype->GetApiWrapperVersion(); 
  printf("COM wrapper version %s\n", (char*)bstrWrapperVersion); 
  
  // Удаляем соединения со скайп 
  pSkype = NULL; 
  CoUninitialize(); 

  return 0; 


В целом все просто и понятно. Правда есть один момен не много не приятный, как всегда связанный с безопасностью, что на строке:
pSkype->Attach(6, VARIANT_TRUE);

скайп запросить разрешение на использования ресурсов скайпа нашим приложением. Со стороны безопасности оно то правильно, но есть мелкий вариант обхода, но о нем не в формате текущего поста ))))

Отправить сообщение пользователю из списка контактов


Продолжаем набор банальных примеров, теперь собственно разберемся с отправкой сообщения:
#import "Skype4COM.dll" 
using namespace SKYPE4COMLib; 

int _tmain(int argc, _TCHAR* argv[]) { 
  CoInitialize(NULL); 
  ISkypePtr pSkype(__uuidof(Skype)); 
  pSkype->Attach(6,VARIANT_TRUE); 
 
  IChatMessage *message; 
  message = pSkype->SendMessage(_bstr_t(L"user_name"), _bstr_t(L"Привет")); 
  printf("%s sent message", (char *)message->FromHandle); 
 
  pSkype = NULL; 
  CoUninitialize(); 
  return 0; 


Для того, что бы набрать пользователя, нужно вызвать метод PlaceCall:
ICallPtr pCall = pSkype->PlaceCall(_bstr_t(L"user_name"), L"", L"", L"");

Получить список контактов


IUserCollectionPtr contactList = pSkype->GetFriends();
for(int i = 1; i <= contactList->GetCount(); i++) {
  _bstr_t bstrHandle = contactList->GetItem(i)->GetHandle();
  _bstr_t bstrFullname = contactList->GetItem(i)->GetFullName();
  printf("Friend login %s and name %s \n", (char*)bstrHandle, (char*)bstrFullname);
}


Исходники

Если тема интересна могу написать более интересные примеры использования Skype4COM…
Tags:
Hubs:
+37
Comments 20
Comments Comments 20

Articles