2014-01-13 4 views
0

Я неожиданно получаю ошибку 424 от объекта, который работает.Ошибка 424 с C++ ATL OleAutomation

У меня есть ряд классов 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] (http://stackoverflow.com/questions/14507526/error-checking-for-null-in-vbscript) –

+0

Это просто плохой синтаксис, Null не является То же самое, что и Ничто. Поместите «Option Strict On» в начало файла исходного кода. –

+0

Мне нравится, что вы ожидаете получить код ошибки, если он будет работать! –

ответ

1

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

См. Ответ на Error checking for NULL in VBScript для вариантов опций нулевого тестирования.

Смежные вопросы