我有一个有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;
}
答案 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()
。