Ich habe ein ATL-Projekt, wo ich verschiedene Initialisierungsroutinen innerhalb CComObjectRootEx::FinalConstruct
ausführen muss. Zu Demonstrationszwecken betrachten wir die folgende Umsetzung:_com_ptr_t CreateInstance gibt REGDB_E_CLASSNOTREG zurück
HRESULT FinalConstruct()
{
return m_bInit ? S_OK : E_FAIL;
}
Dies sollte die entsprechende HRESULT an den Aufrufer zurückgeben, der angibt, ob die Initialisierung des Objekts erfolgreich war.
jedoch immer der Kunde erhält REGDB_E_CLASSNOTREG
statt E_FAIL
im Fall des Scheiterns, wenn man versucht, den Server zu erstellen:
#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;
}
Wenn ich den Klassenkontext zu CLSCTX_INPROC_SERVER
jedoch ändern, die beabsichtigten HRESULT korrekt zurückgegeben:
// Returns E_FAIL
hr = p.CreateInstance(__uuidof(finalconstructtestLib::FCClass), nullptr, CLSCTX_INPROC_SERVER);
ich habe this Post gesehen, wo ein ähnliches Verhalten beobachtet werden kann. Ich kann jedoch keinen Grund finden, warum der Klassenkontext den Rückgabewert von FinalConstruct
beeinflusst. Ist das beabsichtigt und vielleicht irgendwo dokumentiert?