يجب أن يكون هناك فرق بين BSTR فارغة وNULL BSTR؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

عند الحفاظ على واجهة 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 فارغة أو لن يكون هناك تسرب للذاكرة. رأيت بعض تلك مؤخرا في التعليمات البرمجية الآخر. من الصعب جدا العثور عليها، وإذا كنت لا تبحث بعناية.

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