-1

我正在从事一个涉及 Microsoft 统一通信客户端 API 的项目;uccapi.dll。我也在使用 Codegear C++Builder 2010,而不是 Visual Studio。使用 regsvr32 注册 dll 并将其作为类型库导入 C++Builder 2010 后,生成了 uccapi_tlb- 和 uccapi_ocx- 文件。将这些导入到我的新项目中后,我正在尝试遵循msdn 指南来创建能够登录到 Office 通信服务器的 Office Communicator 客户端。

在这方面,我有两个问题:

  • 访问通过 ocx 提供的 com 接口的正确方法是什么?

到目前为止,我已经找到了几种创建接入点的方法,例如。

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));

前三个似乎运作良好。后者会给我一个 Assertion failed: intf!=0 error with 0×40000015 exception。使用前三个中的任何一个,我都可以访问方法并初始化平台接口。

但是,当尝试任何相同的策略来访问任何其他接口时,例如IUccContextIUccUriManagerIUccUri,所有这些接口都在 _tlb.h 文件中定义了一个 clsid,我要么在前两个中得到一个“类未注册”错误情况下,或在第三种情况下 hresult 失败。这让我想到了下一个问题。

  • 使用 ole-viewer,所有接口都按应有的方式注册。为什么注册dll时不会注册dll中的所有可共同创建的类?他们为什么不采取类似行动的原因可能是什么?

来自 UCCAPILib_tlb.h 的 Edit1:

// 
// 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;
4

1 回答 1

1

Embarcadero 论坛已经详细讨论了这个问题。

于 2010-07-28T22:22:13.197 回答