Ошибка 424 с C ++ ATL OleAutomation

0

Я неожиданно получаю ошибку 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"?

  • 0
    возможный дубликат проверки ошибок для NULL в VBScript
  • 0
    Это просто плохой синтаксис, Null - это не то же самое, что Nothing. Поместите Option Strict On вверху файла с исходным кодом.
Показать ещё 1 комментарий
Теги:
com
atl

1 ответ

1
Лучший ответ

Ошибка "Требуется объект" и относится исключительно к стороне VBA (не связанной с C++ и ATL). Вы не должны тестировать Null ness таким образом, так как это то, что порождает ошибку.

См. Ответ на проверку ошибок для NULL в вариантах VBScript для Null, которые у вас есть.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню