我正在从事一个涉及 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。使用前三个中的任何一个,我都可以访问方法并初始化平台接口。
但是,当尝试任何相同的策略来访问任何其他接口时,例如IUccContext、IUccUriManager或IUccUri,所有这些接口都在 _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;