我有一个非常复杂的程序,存在COM问题。
我试图编写一个更小的SSCCE程序来减少问题。
但是,无论我尝试什么,我的SSCCE中的CoCreateInstance
都会返回
hr 0x80040154 (Class Not Registered) (For CoCreateInstance)
0x800706B5: The interface is unknown. (for ICalendarPtr constructor)
我正在使用来自较大程序的相同GUID和其他参数。
(结果发现我并没有使用相同的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;
}
CLSID_Calendar
,或者你正在创建的对象的 CoClass ID。如果头文件可用,请使用__uuidof(Calendar)
或者实际上公开该接口的 CoClass 名称。打开头文件并查找coclass
,你会找到它的。 - WhozCraigICalendarPtr pDtTm(__uuidof(Calendar));
但我把ICalendarPtr pDtTm(__uuidof(ICalendar));
复制到了我的程序中。谢谢! - abelenky