【问题标题】:Error 424 with C++ ATL OleAutomationC++ ATL OleAutomation 出现错误 424
【发布时间】:2014-01-31 22:47:30
【问题描述】:

我意外地从一个有效的对象收到错误 424。

我有许多使用 ATL 用 C++ 编写的 OleAutomation 类。

我可以使用早期或后期绑定来实例化它们。 我可以调用它们的方法和属性并获得预期的结果。

但是,如果我测试它们是否为空,我会收到错误 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 与 Nothing 不同。将Option Strict On放在源代码文件的顶部。
  • 我喜欢你期望得到一个错误代码,如果它有效!

标签: c++ vba com atl


【解决方案1】:

错误为"Object Required",仅与 VBA 端相关(与 C++ 和 ATL 无关)。您不应该以这种方式测试Nullness,因为这是产生错误的原因。

请参阅Error checking for NULL in VBScript 上的答案以了解您实际拥有的 Null 测试选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多