_com_ptr_t CreateInstance returns REGDB_E_CLASSNOTREG

_com_ptr_t CreateInstance returns REGDB_E_CLASSNOTREG

本文关键字:REGDB CLASSNOTREG returns CreateInstance com ptr      更新时间:2023-10-16

我有一个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支持等)。

相关文章:
  • 没有找到相关文章