Проблемы с доступом к uccapi.dll COM-интерфейс C ++ - PullRequest
0 голосов
/ 20 июля 2010

Я работаю над проектом с использованием клиентского API Microsoft Unified Communications;uccapi.dll.Я также использую Codegear C ++ Builder 2010, а не Visual Studio.После регистрации библиотеки DLL в regsvr32 и ее импорта в качестве библиотеки типов в C ++ Builder 2010 были созданы файлы uccapi_tlb- и uccapi_ocx.Импортируя их в мой новый проект, я пытаюсь следовать руководству msdn для создания клиента Office Communicator, способного выполнять вход на сервер Office Communication.

В связи с этим у меня есть двавопросы:

  • Как правильно получить доступ к com-интерфейсам, доступным через ocx?

До сих пор я нашел несколько способов создания точек доступа,такие как

TCOMIUccPlatform plat;
plat = CoUccPlatform::Create();

и

IUccPlatformPtr im;
im = CreateComObject(CLSID_UccPlatform);

и

IUccPlatform* pIUccPlatform;
hr = CoCreateInstance(CLSID_UccPlatform, 
                      NULL, 
                      CLSCTX_INPROC_SERVER, 
                      __uuidof(IUccPlatform), 
                     (void**)&pIUccPlatform);

и

IUccPlatformPtr pIPlat;
pIPlat.CreateInstance(__uuidof(IUccPlatform));

Три первых, кажется, работают хорошо.Последнее даст мне утверждение не удалось: intf! = 0 ошибка с исключением 0 × 40000015.Используя любой из трех лучших, я могу получить доступ к методам и инициализировать интерфейс platform .

Однако при попытке любой из тех же тактик получить доступ к любому другому интерфейсу, например, IUccContext , IUccUriManager или IUccUri , все из которых имеютв clsid, определенном в файле _tlb.h, я либо получаю ошибку «класс не зарегистрирован» в первых двух случаях, либо ошибку hresult в третьем случае.Это подводит меня к следующему вопросу.

  • При использовании ole-viewer все интерфейсы регистрируются так, как должны.Почему не все совместимые классы в dll регистрируются при регистрации dll?И какие могут быть причины, по которым они не действуют аналогично?

Edit1 от UCCAPILib_tlb.h:

// 
// COCLASS DEFAULT INTERFACE CREATOR
// CoClass  : UccPlatform
// Interface: TCOMIUccPlatform
//
typedef TCoClassCreatorT<TCOMIUccPlatform, IUccPlatform, &CLSID_UccPlatform, &IID_IUccPlatform> CoUccPlatform;
// 
// COCLASS DEFAULT INTERFACE CREATOR
// CoClass  : UccUriManager
// Interface: TCOMIUccUriManager
// 
typedef TCoClassCreatorT<TCOMIUccUriManager, IUccUriManager, &CLSID_UccUriManager, &IID_IUccUriManager> CoUccUriManager;

1 Ответ

1 голос
/ 29 июля 2010

Этот вопрос уже подробно обсуждается на форумах Embarcadero .

...