متى تعود E_POINTER ومتى E_INVALIDARG؟
-
07-07-2019 - |
سؤال
يمكن لطرق واجهات 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 :)