سؤال

يمكن لطرق واجهات COM إرجاع مختلف HRESULT القيم للإشارة إلى تمرير قيم وسيطة غير صالحة.متى أعود E_POINTER وعندما E_INVALIDARG?

كما أفهم إذا تلقت إحدى الطرق فهرسًا في مجموعة مغلفة وهي خارج الحدود E_INVALIDARG.إذا تلقت الطريقة ملف Interface** المؤشر حيث يُقصد منه تخزين مؤشر لكائن تم إنشاؤه حديثًا E_POINTER.

HRESULT CImpl::GetItem( long index; Interface** result )
{
    if( result == 0 ) {
        return E_POINTER;
    }
    if( index < 0 || index >= internalArray.size() ) {
        return E_INVALIDARG;
    }
    *result = CreateWrapperObject( internalArray[index] );
    return S_OK;
}

ولكن ماذا لو تلقى أ WCHAR* buffer باسم ملف كمعلمة "in" وهذا WCHAR* باطل؟هذا هو E_POINTER أو E_INVALIDARG?

أو تتلقى الطريقة مؤشرًا لبعض البنية ومن المتوقع أن تملأ البنية من خلال هذا المؤشر وهذا المؤشر فارغ - هل هذا E_POINTER أو E_INVALIDARG?

HRESULT CImpl::SaveToFile( WCHAR* fileName )
{
    if( fileName == 0 ) {
       return // what to return here?
    }
    //... do actual work here
}

HRESULT CImpl::GetAttributes( Attributes* to )
{
    if( to == 0 ) {
       return // what to return here?
    }
    attributes->IsCool = getIsCool();
    attributes->Color = RGB( 0, 255, 0 );
    return S_OK;
}

ما هي القواعد عند العودة E_POINTER وعندما E_INVALIDARG عند التحقق من معلمات نوع المؤشر؟

هل كانت مفيدة؟

المحلول

لقد عدت E_POINTER عند الإشارة إلى مؤشر خارج المعلمة فارغة، وهذا يعتبر رمز خطأ يشير إلى وجود خطأ في البرنامج أو في طبقة التشغيل المتداخل.

لقد عدت E_INVALIDARG عندما يكون هناك مستوى تطبيق مع المعلمة، على سبيل المثال، مشكلة خارج النطاق أو معلمة تتعارض مع بعضها البعض.

في حالتك، في SaveToFile(...) يجب عليك العودة E_INVLIADARG نظرًا لأنه غير صالح لتمرير اسم ملف فارغ، وفي GetAttributes(...) يجب عليك العودة E_POINTER (إذا كانت معلمة خارجية) لأنه لا يمكنك ملء القيمة.

ونعم، نحن جميعا L-O-V-E com :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top