هل يستحق التحقق من وجود مؤشر فارغ في تطبيق QueryInterface()؟
-
07-07-2019 - |
سؤال
IUnknown::QueryInterface() يتم تمرير معلمة void** تشير إلى عنوان حيث سيتم وضع الواجهة المستردة.
STDMETHOD QueryInterface(/* [in] */ REFIID riid, /* [iid_is][out] */ void** ppvObject)
هل يجب على تطبيق QueryInterface() التحقق من كون هذا المؤشر خاليًا (ثم إرجاع E_POINTER على الفور) أو الكتابة هناك فقط؟
لقد رأيت الكثير من التعليمات البرمجية المتعلقة بـ COM ولم يتم إجراء أي فحص في كل مكان تقريبًا.من الناحية النظرية، يمكن لأي شخص بالطبع تمرير مؤشر فارغ باعتباره هذه المعلمة، ولكن هل هناك حاجة بالفعل لمثل هذا الفحص؟
المحلول
وأنت (المتصل) لا تحتاج إلى التحقق من مؤشر لعدم NULL
.
ولكن، يجب عليك التحقق من HRESULT
عاد. إن أسلوب عودة E_POINTER
إذا كان مؤشر الناتج NULL
وE_NOINTERFACE
إذا واجهة غير معتمد.
والمستدعى يجب أن تحقق مؤشر لعدم NULL
والعودة E_POINTER
إذا كان NULL
:
MSDN : عودة القيمة:
وهذا الأسلوب بإرجاع S_OK
إذا ويدعم واجهة، وE_NOINTERFACE
خلاف ذلك. إذا ppvObject
هو NULL
، هذا الأسلوب بإرجاع E_POINTER
.
نصائح أخرى
ووفقا ل مستندات MSDN ، QueryInterface إما يعود S_OK، وفي هذه الحالة سيتم تعيين المعلمة بشكل صحيح. أو تقوم بإرجاع E_NOINTERFACE، وفي هذه الحالة لن يتم تعيين المعلمة خارج.
ووسيعود E_POINTER إذا كان الفراغ ** كنت تمر في غير فارغة.
وأود أن لا يكلف نفسه عناء التحقق من وجود باطل وليس أنا سوف تحقق قيمة الإرجاع من IUnknown :: QueryInterface
وهناك على الارجح لا ضرر في التحقق من وجود باطل، ولكن نظرا لضمانات واجهة يبدو وكأنه الاختيار زائدة عن الحاجة.
يعتمد ذلك على نوع كائن COM الذي تستخدمه (أو التطبيق الذي يستضيفك).في معظم الأحيان، يكون مجرد التحقق من HRESULT كافيًا.إذا كنت تتعامل مع كائنات تابعة لجهات خارجية (استبدال Explorer وما إلى ذلك)، فمن المحتمل أيضًا أن تتحقق من وجود NULL.يقوم Explorer بهذا، وبالتالي تحتاج إلى القيام بذلك أيضًا إذا كنت تريد تجنب الأعطال في ملحقات عربات التي تجرها الدواب: