هناك العديد من العبارات المتشابهة في VB6: Let، Set، LSet، وRSet.
Let يستخدم لتعيين المتغيرات العامة:
انسخ رمز الكود كما يلي:
[دع] فارنام = التعبير
في معظم الحالات، نحذف Let ونخصص القيم مباشرة بعلامة التساوي، لذلك لا يعرف الكثير من الناس حتى وجود Let.
يتم استخدام المجموعة لتعيين الكائن، وتوجيه المتغير إلى الكائن وزيادة العدد المرجعي للكائن. كثير من الناس لا يعرفون ما هو العد المرجعي.
إذن ما هو استخدام LSet؟ للوهلة الأولى، يبدو أنه مزيج من Let and Set، لكنه ليس كذلك. حرف L في LSet هو اختصار لـ Left، ونظيره هو RLet. تسألني كيف أعرف أن L هو اختصار لليسار؟ ماذا تقول الوثيقة:
انسخ رمز الكود كما يلي:
بيان LSet
يقوم اليسار بمحاذاة سلسلة داخل متغير سلسلة، أو نسخ متغير من نوع محدد من قبل المستخدم إلى متغير آخر من نوع مختلف محدد من قبل المستخدم.
بيان RSet
يقوم اليمين بمحاذاة سلسلة داخل متغير سلسلة.
لدى LSet دالة واحدة أكثر من RSet، دعونا لا ننظر إلى هذا أولًا، فلننظر إلى نفس الجزء أولًا. ماذا يعني ذلك؟ في الحقيقة، أنا لا أفهم ذلك بمجرد قراءة الوثائق، فلنختبره عمليًا:
انسخ رمز الكود كما يلي:
فرعي رئيسي()
عنوان URL خافت كسلسلة
خافت كسلسلة
دع عنوان url = "//www.VeVB.COM"
ق = سلسلة $(20، "*")
LSet s = url
تصحيح الأخطاء.طباعة ق
RSet s = url
تصحيح الأخطاء.طباعة ق
نهاية الفرعية
الإخراج (لاحظ المسافات):
انسخ رمز الكود كما يلي:
//www.VeVB.COM
//www.VeVB.COM
إنها بالفعل محاذاة إلى اليسار ومحاذاة إلى اليمين، وتم استبدال العلامة النجمية * بمسافة. ما فائدة هذا؟ في رأيي، يبدو أنه قد يكون عديم الفائدة حقًا، ولا أعرف ما رأي المصمم.
ومع ذلك، هناك وظيفة أخرى لـ LSet قوية جدًا، حيث يمكنها نسخ متغير نوع محدد من قبل المستخدم إلى متغير نوع آخر محدد من قبل المستخدم. ماذا يعني هذا؟
دعني أعطيك مثالاً هل تعرف عنوان IP؟ عنوان IP الذي تم إرجاعه عن طريق اختبار اتصال Baidu هنا هو 61.135.169.125. عنوان IP بهذا التنسيق مخصص للعرض البشري فقط، ويتم تمثيله فعليًا بواسطة عدد صحيح 32 بت داخل الكمبيوتر. كيفية استخدام VB لتحويل عنوان IP بتنسيق xxx.xxx.xxx.xxx إلى عدد صحيح 32 بت؟ بعد البحث في Google، يمكنك كتابة رمز مشابه لهذا:
انسخ رمز الكود كما يلي:
فرعي رئيسي()
Debug.Print IPToLong("61.135.169.125")
نهاية الفرعية
وظيفة خاصة IPToLong (IPStr كسلسلة) طويلة
Dim Str () كسلسلة، HEXStr كسلسلة، TempStr كسلسلة
خافت × طالما
Str = سبليت (IPStr، ".")
HEXStr = ""
لـ x = 0 إلى UBound(Str)
TempStr = سداسي عشري (Str(x))
HEXStr = HEXStr & String(2 - Len(TempStr), "0") & TempStr
التالي ×
IPToLong = CLng("&H" & HEXStr)
وظيفة النهاية
الكود يعمل بشكل جيد، ولا يوجد أي خطأ فيه، ولكن يمكننا كتابة المزيد من التعليمات البرمجية "المتقدمة" باستخدام عبارة LSet:
انسخ رمز الكود كما يلي:
نوع خاص myBytes
B1 كبايت
B2 كبايت
B3 كبايت
B4 كبايت
نوع النهاية
نوع خاص myLong
فال طالما
نوع النهاية
'بواسطة شيطان
"http://VeVB.COM
الوظيفة العامة IP2Long (ip كسلسلة) طالما
خافت () كسلسلة
خافت ب كما myBytes
خافت ل كما myLong
أ = سبليت (ip، ".")
"لاحظ ليتل إنديان."
b.B1 = CByte(a(3))
b.B2 = CByte(a(2))
b.B3 = CByte(a(1))
b.B4 = CByte(a(0))
LSet ل = ب
IP2Long = l.Val
وظيفة النهاية
استخدم LSet لنسخ متغير من النوع myBytes إلى متغير من النوع myLong وهو جيد جدًا وقوي. ألق نظرة على رمز التجميع الذي تم إنشاؤه:
انسخ رمز الكود كما يلي:
00401A0E lea eax, dword ptr [ebp-0x20]; عنوان المتغير b
00401A11 دفع إيكس
00401A12 lea eax, dword ptr [ebp-0x14]; عنوان المتغير l
00401A15 دفع إيكس
00401A16 ادفع 0x4
00401A18 اتصل بـ __vbaCopyBytes؛ jmp إلى MSVBVM60.__vbaCopyBytes
ما يسمى هو __vbaCopyBytes في MSVBVM60.DLL المعلمة الأولى هي البايت المراد نسخه، والمعلمة الثانية هي عنوان الهدف، والمعلمة الثالثة هي عنوان المصدر، وهي تشبه وظيفة memcpy في مكتبة C القياسية. باستثناء أن ترتيب المعلمات مختلف، وتنفيذها الداخلي ليس أكثر من تعليمات نقل سلسلة في التجميع:
انسخ رمز الكود كما يلي:
72A1A0F3 > mov ecx، dword ptr [esp+0x4]
72A1A0F7 ادفع esi
72A1A0F8 mov esi، dword ptr [esp+0x10]
72A1A0FC دفع edi
72A1A0FD mov edi، dword ptr [esp+0x10]
72A1A101 موف إياكس، إيكس
72A1A103 mov edx، edi
72A1A105 شريككس، 0x2
72A1A108 مندوب movs dword ptr es:[edi], dword ptr [esi]
72A1A10A موف إيكس، إياكس
72A1A10C موف إياكس، إدكس
72A1A10E و إي إكس، 0x3
72A1A111 مندوب movs بايت ptr es:[edi]، بايت ptr [esi]
72A1A113 بوبيدي
72A1A114 البوب esi
72A1A115 ريتن 0xC
تجدر الإشارة إلى أن الوثائق تحذرنا:
انسخ رمز الكود كما يلي:
تحذير: لا يوصى باستخدام LSet لنسخ متغير من نوع محدد من قبل المستخدم إلى متغير من نوع آخر محدد من قبل المستخدم. قد يؤدي نسخ بيانات نوع بيانات واحد في مساحة محجوزة لنوع بيانات مختلف إلى نتائج غير متوقعة.
عندما تقوم بنسخ متغير من نوع محدد بواسطة المستخدم إلى آخر، يتم نسخ البيانات الثنائية من متغير واحد إلى مساحة ذاكرة المتغير الآخر، بغض النظر عن أنواع البيانات المحددة للعناصر.
لا يُنصح باستخدام LSet لنسخ متغيرات النوع المعرفة من قبل المستخدم وقد يؤدي إلى نتائج غير متوقعة (مثل الهياكل غير المحاذية)، لذا لا تستخدم عبارة LSet إلا إذا كنت تعرف ما تفعله.