هل يستحق التحقق من وجود مؤشر فارغ في تطبيق QueryInterface()؟

StackOverflow https://stackoverflow.com/questions/1426393

سؤال

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 بهذا، وبالتالي تحتاج إلى القيام بذلك أيضًا إذا كنت تريد تجنب الأعطال في ملحقات عربات التي تجرها الدواب:

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