3

我有一个存在 COM 问题的大型复杂程序。
我正在尝试编写一个更小的SSCCE程序来减少问题。

但是,无论我尝试什么,CoCreateInstance我的 SSCCE 中的

hr 0x80040154 (Class Not Registered)  (For CoCreateInstance)
0x800706B5: The interface is unknown. (for ICalendarPtr constructor)

我正在使用更大程序中的相同 GUID 和其他参数。
(结果我没有使用相同的指南。只是类似的)

我链接到相同的库,并且有相同的 DLL 可用(在本地和在 Program Files 中正确注册)。

我不是注册表专家,但通过注册表,我发现接口和类 GUID 看起来已正确注册,TypeLib 键引用了一个存在且可访问的 DLL。

你能想到一些我可能遗漏的东西会导致一个程序成功创建一个 COM 对象,但另一个说这个类没有注册?

代码:

_COM_SMARTPTR_TYPEDEF(ICalendar, __uuidof(ICalendar));

int _tmain(int argc, _TCHAR* argv[])
{
    CoInitialize(NULL);

    CLSID classID = __uuidof(ICalendar);
    REFIID iid = __uuidof(IUnknown);
    LPVOID pRet;
    HRESULT hr = CoCreateInstance(classID, NULL, CLSCTX_INPROC_SERVER, iid, &pRet);
    // Result: 0x80040154 Class not registered

    GUID guid = __uuidof(ICalendar);
    ICalendarPtr pDtTm(guid);
    // Result: First-chance exception at 0x773dc41f in COMTest.exe: 0x800706B5: The interface is unknown.


    return 0;
}
4

1 回答 1

9

CLSID 类 ID = __uuidof(ICalendar);

这是错误的。 __uuidof()检索接口的 IID,而不是其 CLSID。调用时CoCreateInstance(),需要在第 1 个参数中使用 CLSID,在第 4 个参数中使用 IID,例如:

ICalendar *pRet;
HRESULT hr = CoCreateInstance(CLSID_Calendar, NULL, CLSCTX_INPROC_SERVER, __uuidof(ICalendar), (void**)&pRet);

使用接口智能包装器的构造函数时,需要使用 CLSID,例如:

ICalendarPtr pDtTm(CLSID_Calendar);

没有用于检索接口的 CLSID 的编译器语法。您必须导入接口的 TypeLibrary,然后使用生成的 .h 文件来获取定义,或者在运行时查找注册表,例如使用 .h 文件CLSIDFromProgID()

于 2013-11-13T17:18:54.400 回答