【发布时间】:2016-09-29 11:47:00
【问题描述】:
我有一个 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 的帖子,其中可以观察到类似的行为。但是,我似乎找不到任何原因说明类上下文会影响FinalConstruct 的返回值。这是否有意并可能记录在某处?
【问题讨论】: