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

abe*_*nky 2 c++ com registry

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

然而,无论我尝试什么CoCreateInstance,我的SSCCE一直在回来

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

我正在使用相同的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;
}
Run Code Online (Sandbox Code Playgroud)

Rem*_*eau 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);
Run Code Online (Sandbox Code Playgroud)

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

ICalendarPtr pDtTm(CLSID_Calendar);
Run Code Online (Sandbox Code Playgroud)

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