COM错误:类未注册(我确定是)

时间:2013-11-13 17:05:18

标签: c++ com registry

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

然而,无论我尝试什么,我的SSCCE中的CoCreateInstance都会继续回来

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

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

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

我不是注册表专家,但通过注册表查找,我发现接口和类GUID看起来是正确注册的,TypeLib-key引用了一个存在且可访问的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;
}

1 个答案:

答案 0 :(得分:8)

  

CLSID classID = __uuidof(ICalendar);

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

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

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

ICalendarPtr pDtTm(CLSID_Calendar);

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

相关问题