gpt4 book ai didi

c++ - _com_ptr_t CreateInstance 返回 REGDB_E_CLASSNOTREG

转载 作者:行者123 更新时间:2023-11-28 05:39:10 24 4
gpt4 key购买 nike

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

我看过 this post,可以观察到类似的行为。但是,我似乎找不到类上下文影响 FinalConstruct 返回值的任何原因。这是有意的并且可能在某处记录了吗?

最佳答案

CoCreateInstance API 不 promise 将内部故障代码转发给调用方。该实现更喜欢以自己的方式指示问题的根源,通过返回 REGDB_E_CLASSNOTREG 表示它无法完成实例化。这反过来又是正确的:它确实无法创建实例(并且问题与丢失接口(interface)、编码(marshal)处理、权限等无关)。也就是说,API 倾向于抑制内部故障代码,以将其替换为已记录的故障代码。

如果您更愿意指示特定的实例化失败,您最好在初始创建实例时成功,然后您可以实现一个具有属性或方法公开状态的接口(interface),或提供相关的 HRESULT 错误(有或没有 IErrorInfo 支持等)。

关于c++ - _com_ptr_t CreateInstance 返回 REGDB_E_CLASSNOTREG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37546120/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com