ATL/COM:为什么 CComSafeArray::GetCount() 会为空数组抛出异常

ATL/COM: Why does CComSafeArray::GetCount() throw an exception for an empty array?

本文关键字:数组 抛出异常 GetCount COM 为什么 CComSafeArray ATL      更新时间:2023-10-16

我正在使用 ATL CComSafeArray 类,但如果数组为空,似乎GetCount()会抛出异常,例如此代码会抛出异常:

CComSafeArray<MyStruct> array;
// array.Add(item); // There won't be an exception if I uncomment this line.
array.GetCount();

这是构造函数和 GetCount() 的代码(来自 ATL 源):

CComSafeArray() throw() : m_psa(NULL)
{
}
ULONG GetCount(UINT uDim = 0) const
{
    ATLASSUME(m_psa != NULL);
    ATLASSERT(uDim < GetDimensions());
    LONG lLBound, lUBound;
    HRESULT hRes = SafeArrayGetLBound(m_psa, uDim+1, &lLBound);
    ATLASSERT(SUCCEEDED(hRes));
    if(FAILED(hRes))
        AtlThrow(hRes);
    hRes = SafeArrayGetUBound(m_psa, uDim+1, &lUBound);
    ATLASSERT(SUCCEEDED(hRes));
    if(FAILED(hRes))
        AtlThrow(hRes);
    return (lUBound - lLBound + 1);
}

如您所见,构造函数给m_psa一个 NULL 值,并且在 GetCount() 中,这会导致SafeArrayGetLBound()返回错误 HRESULT,从而导致调用 AtlThrow()。

但我不明白为什么如果数组为空GetCount()应该抛出异常。这是预期的行为吗?

您有一个用于 SAFEARRAY 的未绑定包装器,而不是一个空数组。

如果你想要一个空的 SAFEARRAY,你可以声明一个:

CComSafeArray<MyStruct> array((ULONG)0);