صاح أحدهم " ثعبان البحر".
رأيت ثعبان البحر الأسود الطويل يسبح في أعماق البحر، وكان الجميع تقريبًا في حالة ذهول. لكن ثعبان البحر قال شيئًا جعلنا خائفين، "أنا سلسلة VB الشهيرة. إذا واصلت الغوص، عليك أن تحاول تجاوزي."
ألاحظ ذلك بشكل معتاد، لأنني أعلم أنه لكي تهزم خصمًا، يجب عليك أن تفهم الخصم بعمق.
لذلك كتبت رمزًا صغيرًا لفهمه.
يعمل هذا الرمز بشكل جيد جدًا، تمامًا كما تخيلت، ويعرض 12، 24،
حسنًا، سأستخدم TextOut لطباعته في النافذة. أما لماذا يجب علي استخدام هذه الوظيفة وليس غيرها، هل يهمك؟ لذلك كتبت الكود التالي
لقد وجدت شيئا خاطئا؟ يبدو أن طول السلسلة خاطئ، ثم أفكر في ذلك، في VB، السلسلة من نوع BSTR، لذا يجب استخدام L2 كطول. هل هذا صحيح؟
يا إلهي، كتاب السماء يظهر بعد الوتر، هل الله يلمح لي متى يرزقني امرأة جميلة؟
لكنني أعتقد أن الله لن يجيبني بهذه السرعة، لذا لا بد أن يكون هناك خطأ ما في الكود الخاص بي.
بينما كنت أتأمل، كان الجميع يراقبونني. مستحيل، فهو وسيم جداً.
لذلك قمت بكتابة الكود التالي بسرعة
عندما ضغطت بسرعة على F5، كان هناك صدى في السماء، وحصلت الجملة "Givemea beauty" على الاستجابة الصحيحة.
في هذا الوقت، نظرت إلى هذا الثعبان البحري وسبحت نحوه بثقة، لكنه ابتسم في ظروف غامضة.
هل سبق لك أن رأيت ابتسامة ثعبان يسبح ببطء؟
"سيكون من السهل جدًا عليك أن تمر بي بهذه الطريقة." لماذا هذه الجملة مألوفة جدًا؟ هل قال أحد من البرج الذهبي هذا؟
"سأجري لك اختبارًا صغيرًا، هل تعرف الفرق بين vbNullString و"" ؟"
"لا تظن أنك شخص عظيم لأنك ثعبان البحر. سؤالك بسيط للغاية." قال شاب بجانبي ليس قبيحًا ويلقب بـ " الرجل الوسيم السابع في العالم ". هل تعتقد أنني لم أقرأ دليل الحياة البحرية "نعم (متصفح الكائنات)؟"
كونستفبنولسترينغ = ""
أعضاء VBA.Constants
الثابت المستخدم عند استدعاء إجراء خارجي يتطلب سلسلة ذات قيمة غير صفرية
"إذًا تقصد أنهم متماثلون، لكن ماذا عن vbNullChar؟" نظر ثعبان البحر إلى الرجل الوسيم السابع في العالم بنوايا شريرة.
"بالطبع هو نفسه. هل قرأت تعليمات VB؟" قال الرجل الوسيم السابع في العالم، لكنه شعر أن هناك خطأ ما. لكن متصفح كائنات VB يقول ذلك
أعضاء VBA.Constants
إذن ماذا يمثل الكود التالي؟
ثعبان البحر يعطي رمزه
بعد أن قام الرجل الوسيم السابع في العالم بالضغط على F5، تفاجأ بنتائج كود ثعبان البحر.
018992841434596
020
وهذا يعني أن شخصًا ما يجب أن يكون مخطئًا بين تعليمات VB وSea Snake. علاوة على ذلك، بالنسبة إلى S1، تكون كلتا القيمتين صفرًا، ويشير المؤشر إلى الصفر، والطول صفر، وهي ليست قيمة صفرية بالمعنى العادي.
ثم أدار الرجل الوسيم السابع في العالم رأسه ونظر إلي.
"يا فتى، تباهى. هيا، دعني أريك شيئًا أولاً."
"إذا كنت تريد هزيمة ثعبان البحر، عليك أن تفهم هيكل ثعبان البحر."
سلسلة VB هي سلسلة BSTR قياسية على سبيل المثال، بنية السلسلة "Hello" كما يلي
->-العرض = "26">0
->-العرض = "37">0
->-العرض = "40">'ح
->-العرض = "35">0
->-العرض = "48">'ه'
->-العرض = "44">0
->-العرض = "42">'l'
->-العرض = "40">0
->-العرض = "40">'l'
->-العرض = "39">0
->-العرض = "38">'س'
->-العرض = "35">0
->-العرض = "35">0
->-العرض = "38">0->
يمكنك أن ترى أن البايتات الأربع الأولى تمثل عدد البايتات التي يشغلها الطول الفعلي للسلسلة، وهي قيمة طويلة.
والبايتتان الأخيرتان هما الأحرف اللاحقة التي تمثل القيمة صفر.
البايتات العشرة في المنتصف هي بالضبط محتوى السلسلة.
إذا استخدمنا s1='Hello'، فإلى أين يشير s1.
"في البداية اعتقدت أن s1 يشير إلى البايت الأول، ولكن عندما استخدمت أداة مراقبة ذاكرة VB المكتوبة ذاتيًا للنظر في قيمة البايت التالية strptr(s1) ، وجدت أن s1 يشير إلى البايت الخامس، وهو المكان الذي لدينا فيه تبدأ السلسلة حقًا."
"الجميع يعرف بنية ثعبان البحر، فلماذا تختلف المواقف الثلاثة التي اقترحها للتو؟" سألت الغواص الذي كان لا يزال في حالة ذهول.
"نعم، لماذا؟"
حسنًا، أخرج OleView الخاص بك وافتح VB6.DLL في File->ViewTypeLib. هل رأيت عالمًا رائعًا؟ لا تكن في حالة ذهول وابحث عن الأجزاء التالية.
افتحها وسترى التعريفات الحقيقية داخل VB.
هل رأيت أن vbNullString يشير إلى سلسلة فارغة، لكن هذه السلسلة الفارغة لها عنوان صفري . وvbNullChar هو حرف صفري (أي ما يعادل الحرف الأخير في سلسلة في C). لذلك دعونا نلقي نظرة على ما يحدث عند تشغيل كود Sea Snake.
عندما رأى VB هذه الجملة، فمن الواضح أنه غير قيمة S1 إلى الصفر.
عندما رأى VB هذه الجملة، اتخذ عدة إجراءات واستخدم SysAllocStringLen لتخصيص سلسلة BSTR في الكومة، ثم قام بنسخ '/0' إلى هذه السلسلة.
لقد قام VB بالكثير من العمل هنا، أولاً، يعامل VB "" كثابت عند الترجمة، ويجب عليه تخصيص متغير داخليًا لهذه السلسلة الفارغة. عند تحميل ملف EXE، يجب أيضًا تعيينه على عنوان، على الرغم من أن هذا لا يعني أي شيء.
عبارة عن سلسلة مثل 000000000000، والتي تتطلب 6 بايت (أربع بايت رأس و2 بايت ذيل)
ثم عندما ترى هذه الجملة، قم بتمرير قيمة عنوان البايت الخامس إلى s3
لذلك، على الرغم من أنك كتبت للتو "" يدويًا، انتهى الأمر بـ VB إلى القيام بالكثير من العمل. على الرغم من أن 6 بايت ليس كثيرًا، إلا أنه في مشروع كبير حيث يكتب الجميع "" في كل مكان، فهو أيضًا تكلفة كبيرة. لذلك في المرة القادمة يجب عليك عدم استخدام "" ، ولكن تأكد من استخدام vbNullString
"لقد قلت ذلك يا ثعبان البحر" نظرت إليه بازدراء.
عندما رأى ثعبان البحر إدراك الجميع المفاجئ، ضحك مرة أخرى (هل تستطيع ثعابين البحر أن تضحك؟)
"فهمي لا يعني التحكم بي حقًا. العديد من غواصي C سوف يحتقرون VB. هل تعرف السبب؟"
"بطيئة، عمليات سلسلة VB بطيئة للغاية." سارع العديد من الغواصين للإجابة على هذا السؤال.
"هاها، نعم،" ضحك ثعبان البحر بصوت عالٍ وسبح ببطء نحو البحر العميق " سوف أعود! "
بقينا مع مجموعة من الغواصين، والجميع يفكر، هل نفهم حقًا ثعبان البحر، لأن ثعبان البحر في VB Ocean Legend مخيف جدًا، هل سيبتعد بهذه السهولة، وماذا يعني ذلك بـ IwillBack؟ ؟
ولكننا سنواصل الغوص....
"انظروا، الشعاب المرجانية" صاح أحدهم! ->