يجب أن يكون هناك فرق بين BSTR فارغة وNULL BSTR؟
سؤال
عند الحفاظ على واجهة COM
ينبغي أن تعامل على BSTR
فارغة بنفس طريقة NULL
؟
وبعبارة أخرى ينبغي أن تكون هذه المكالمات الدالة اثنين تنتج نفس النتيجة؟
// Empty BSTR
CComBSTR empty(L""); // Or SysAllocString(L"")
someObj->Foo(empty);
// NULL BSTR
someObj->Foo(NULL);
المحلول
ونعم - فارغة BSTR هو نفس واحد فارغ. أتذكر كان لدينا كل أنواع الأخطاء التي تم الكشف عنها عندما تحولنا من VS6 إلى عام 2003 - كانت الطبقة CComBSTR تغيير منشئ الافتراضية التي خصصت باستخدام NULL بدلا من سلسلة فارغة. يحدث هذا عند على سبيل المثال علاج BSTR كسلسلة C أسلوب العادية وتمريرها لبعض الوظائف مثل strlen
، أو محاولة التهيئة لstd::string
معها.
واريك ليبرت يناقش في BSTR بقدر كبير من التفصيل في دليل اريك الكامل ل BSTR الدلالة :
<اقتباس فقرة>واسمحوا لي أن قائمة الخلافات أولا و ثم مناقشة كل نقطة في التفاصيل مبرحة.
1) يجب أن يكون مطابقا BSTR دلالات لNULL و "". A PWSZ في كثير من الأحيان لديها دلالات مختلفة ل هؤلاء.
يجب أن2) أن تخصيص BSTR وحررت مع الأسرة SysAlloc * من المهام. A PWSZ يمكن أن يكون العازلة التخزين التلقائي من كومة أو المخصصة مع malloc، جديد، LocalAlloc أو أي ذاكرة أخرى مخصص.
و3) BSTR هو من طول ثابت. A PWSZ قد يكون من أي طول، وقلة فقط من قبل مقدار الذاكرة صالحة في تقريرها العازلة.
و4) نقاط وBSTR دائما إلى الأول حرف صالح في المخزن المؤقت. A PWSZ قد يكون مؤشر إلى منتصف أو نهاية منطقة عازلة السلسلة.
و5) عندما تخصيص لن بايت BSTR لك لديك غرفة للن / 2 أحرف كبيرة. عند تخصيص ن بايت لPWSZ يمكنك تخزين ن / 2-1 حرفا - عليك أن تترك مجالا لاغية.
و6) قد تحتوي على BSTR أي بيانات Unicode بما في ذلك الحرف الصفر. A PWSZ لا يحتوي على حرف صفر باستثناء ما هو علامة نهاية السلسلة. كل من BSTR وPWSZ يكون دائما الصفر الطابع بعد آخر صالحة لهم حرف، ولكن في BSTR صالح قد يكون شخصية ذات طابع الصفر.
و7) قد تحتوي على BSTR الواقع الغريب عدد وحدات البايت - يمكن استخدامه ل نقل البيانات الثنائية حولها. A PWSZ غير دائما تقريبا حتى عدد البايتات وتستخدم فقط لتخزين يونيكود السلاسل.
اقتباس فقرة>نصائح أخرى
وأسهل طريقة للتعامل مع هذه المعضلة هو استخدام CComBSTR وتحقق ل. طول () أن يكون صفرا. أن يعمل كل القيم الفارغة وفارغة.
ومع ذلك، نضع في اعتبارنا، يجب الإفراج عن BSTR فارغة أو لن يكون هناك تسرب للذاكرة. رأيت بعض تلك مؤخرا في التعليمات البرمجية الآخر. من الصعب جدا العثور عليها، وإذا كنت لا تبحث بعناية.