_com_ptr_t CreateInstance returns REGDB_E_CLASSNOTREG
_com_ptr_t CreateInstance returns REGDB_E_CLASSNOTREG
我有一个ATL项目,我需要在CComObjectRootEx::FinalConstruct
中执行各种初始化例程。出于演示目的,请考虑以下实现:
HRESULT FinalConstruct()
{
return m_bInit ? S_OK : E_FAIL;
}
这应该将相应的 HRESULT 返回给调用方,指示对象的初始化是否成功。
但是,在尝试创建服务器时,客户端始终会收到REGDB_E_CLASSNOTREG
而不是E_FAIL
,以防出现故障:
#include <Windows.h>
#import <finalconstructtest.dll>
int main()
{
HRESULT hr = CoInitialize(0);
{
finalconstructtestLib::IFCClassPtr p;
// Returns REGDB_E_CLASSNOTREG
hr = p.CreateInstance(__uuidof(finalconstructtestLib::FCClass));
}
CoUninitialize();
return 0;
}
但是,当我将类上下文更改为CLSCTX_INPROC_SERVER
时,将正确返回预期的 HRESULT:
// Returns E_FAIL
hr = p.CreateInstance(__uuidof(finalconstructtestLib::FCClass), nullptr, CLSCTX_INPROC_SERVER);
我看过这篇文章,其中可以观察到类似的行为。但是,我似乎找不到类上下文影响FinalConstruct
返回值的任何原因。这是有意的,也许记录在某处吗?
CoCreateInstance
API 不承诺将内部故障代码转发给调用方。该实现倾向于以自己的方式指示问题的根源,通过返回REGDB_E_CLASSNOTREG
表示它无法完成实例化。这反过来是正确的:它确实无法创建实例(例如,问题与缺少接口、封送处理、权限等无关)。也就是说,API 倾向于禁止显示内部故障代码,以将其替换为记录的代码。
如果您希望指示特定的实例化失败,则最好成功创建实例,然后可以使用属性或方法实现接口,以公开状态,或给出相关的HRESULT
错误(有或没有IErrorInfo
支持等)。
相关文章:
- 没有找到相关文章