_com_ptr_t 创建实例 returns REGDB_E_CLASSNOTREG
_com_ptr_t CreateInstance returns REGDB_E_CLASSNOTREG
我有一个 ATL 项目,我需要在其中执行各种初始化例程 CComObjectRootEx::FinalConstruct
。出于演示目的,请考虑以下实现:
HRESULT FinalConstruct()
{
return m_bInit ? S_OK : E_FAIL;
}
这应该 return 适当的 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;
}
然而,当我将 class 上下文更改为 CLSCTX_INPROC_SERVER
时,预期的 HRESULT return 已正确编辑:
// Returns E_FAIL
hr = p.CreateInstance(__uuidof(finalconstructtestLib::FCClass), nullptr, CLSCTX_INPROC_SERVER);
我已经看到 this post,其中可以观察到类似的行为。但是,我似乎找不到 class 上下文影响 FinalConstruct
的 return 值的任何原因。这是有意的并且可能在某处记录了吗?
CoCreateInstance
API 不承诺将内部故障代码转发给调用方。该实现更喜欢以自己的方式指示问题的根源,通过返回 REGDB_E_CLASSNOTREG
意味着它无法完成实例化。这反过来又是正确的:它确实无法创建实例(并且问题与丢失接口、封送处理、权限等无关)。也就是说,API 更喜欢抑制内部故障代码以将其替换为已记录的故障代码。
如果您更愿意指示特定的实例化失败,您最好在初始创建实例时成功,然后您可以使用 属性 或公开状态的方法实现接口,或提供相关的 HRESULT
错误(有或没有 IErrorInfo
支持等)。
我有一个 ATL 项目,我需要在其中执行各种初始化例程 CComObjectRootEx::FinalConstruct
。出于演示目的,请考虑以下实现:
HRESULT FinalConstruct()
{
return m_bInit ? S_OK : E_FAIL;
}
这应该 return 适当的 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;
}
然而,当我将 class 上下文更改为 CLSCTX_INPROC_SERVER
时,预期的 HRESULT return 已正确编辑:
// Returns E_FAIL
hr = p.CreateInstance(__uuidof(finalconstructtestLib::FCClass), nullptr, CLSCTX_INPROC_SERVER);
我已经看到 this post,其中可以观察到类似的行为。但是,我似乎找不到 class 上下文影响 FinalConstruct
的 return 值的任何原因。这是有意的并且可能在某处记录了吗?
CoCreateInstance
API 不承诺将内部故障代码转发给调用方。该实现更喜欢以自己的方式指示问题的根源,通过返回 REGDB_E_CLASSNOTREG
意味着它无法完成实例化。这反过来又是正确的:它确实无法创建实例(并且问题与丢失接口、封送处理、权限等无关)。也就是说,API 更喜欢抑制内部故障代码以将其替换为已记录的故障代码。
如果您更愿意指示特定的实例化失败,您最好在初始创建实例时成功,然后您可以使用 属性 或公开状态的方法实现接口,或提供相关的 HRESULT
错误(有或没有 IErrorInfo
支持等)。