Я неожиданно получаю ошибку 424 от объекта, который работает.
У меня есть ряд классов OleAutomation, написанных на C++ с использованием ATL.
Я могу создать их с ранней или поздней привязкой. Я могу называть их методы и свойства и получать ожидаемые результаты.
Однако я получаю ошибку 424, если я проверяю, являются ли они нулевыми.
Есть ли какие-либо предложения относительно проблемы?
Код Excel VBA, который вызывает ошибку:
Sub ObjectTest()
Dim o As About
Set o = New About
' this works - prints 1.4
Debug.Print "Version ", o.Version
' generates Error 424
Debug.Print "About ", o Is Null
End Sub
IDL
[
object,
oleautomation,
uuid(...),
dual,
nonextensible,
pointer_default(unique),
public
]
interface IAbout : IDispatch
{
...
[propget, id(3), helpstring("Library version string")]
HRESULT Version([out, retval] BSTR* pResult);
...
};
[
uuid(...)
]
coclass About
{
[default] interface IAbout;
};
Регистрация
HKCR
{
MyLibrary.About.1 = s 'About MyLibrary'
{
CLSID = s '{...}'
}
MyLibrary.About = s 'About MyLibrary'
{
CLSID = s '{...}'
CurVer = s 'MyLibrary.About.1'
}
NoRemove CLSID
{
ForceRemove {...} = s 'Class About'
{
ProgID = s 'MyLibrary.About.1'
VersionIndependentProgID = s 'MyLibrary.About'
ForceRemove Programmable
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Apartment'
}
TypeLib = s '{...}'
Version = s '1.0'
}
}
}
И класс
class ATL_NO_VTABLE CAbout :
public ATL::CComObjectRootEx<ATL::CComSingleThreadModel>,
public ATL::CComCoClass<CAbout, &CLSID_About>,
public ATL::ISupportErrorInfoImpl<&CLSID_About>,
public ATL::IDispatchImpl<IAbout, &IID_IAbout, &LIBID_MyLibrary, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
CAbout()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_ABOUT)
DECLARE_NOT_AGGREGATABLE(CAbout)
BEGIN_COM_MAP(CAbout)
COM_INTERFACE_ENTRY(IAbout)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
}
public:
...
STDMETHOD(get_Version)( /* [out, retval] */ BSTR* pResult );
...
};
OBJECT_ENTRY_AUTO(__uuidof(About), CAbout)
Любая помощь в том, почему она генерирует ошибку 424 для теста "null"?
Ошибка "Требуется объект" и относится исключительно к стороне VBA (не связанной с C++ и ATL). Вы не должны тестировать Null
ness таким образом, так как это то, что порождает ошибку.
См. Ответ на проверку ошибок для NULL в вариантах VBScript для Null, которые у вас есть.
Option Strict On
вверху файла с исходным кодом.