我有一个有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)
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().