“ งูทะเล” ใครบางคนอุทาน
ฉันเห็นงูทะเลดำตัวยาวว่ายลึกลงไปในทะเล และเกือบทุกคนก็งุนงง แต่งูทะเลก็พูดอะไรบางอย่างที่ทำให้เรากลัวว่า "ฉันคือสาย VB อันโด่งดัง ถ้าจะดำน้ำต่อก็ต้องพยายามผ่านฉันไป"
ฉันสังเกตมันเป็นประจำ เพราะฉันรู้ว่าจะเอาชนะคู่ต่อสู้ได้ คุณต้องเข้าใจคู่ต่อสู้อย่างลึกซึ้ง
ดังนั้นฉันจึงเขียน CODE เล็กๆ เพื่อทำความเข้าใจ
รหัสนี้ทำงานได้ดีมากตรงตามที่ฉันจินตนาการไว้ และแสดง 12, 24,
ดี ฉันจะใช้ TextOut เพื่อพิมพ์ออกมาในหน้าต่าง ส่วนทำไมฉันต้องใช้ฟังก์ชันนี้ ไม่ใช่ฟังก์ชันอื่น คุณสนใจไหม ดังนั้นฉันจึงเขียนโค้ดต่อไปนี้
ฉันพบสิ่งผิดปกติ? ดูเหมือนว่าความยาวของสตริงจะผิด ดังนั้นใน VB สตริงจะเป็นประเภท BSTR ดังนั้นควรใช้ L2 เป็นความยาวใช่ไหม
โอ้พระเจ้า หนังสือแห่งสวรรค์ปรากฏขึ้นหลังเชือก พระเจ้ากำลังบอกเป็นนัยว่าฉันเมื่อใดที่จะมอบผู้หญิงที่สวยให้ฉัน?
แต่ฉันคิดว่าพระเจ้าจะไม่ตอบฉันเร็ว ๆ นี้ ดังนั้นรหัสของฉันต้องมีอะไรผิดปกติ
ขณะที่ฉันกำลังนั่งสมาธิ ทุกคนก็มองดูฉัน ไม่มีทาง เขาหล่อมาก
ดังนั้นฉันจึงเขียนโค้ดต่อไปนี้อย่างรวดเร็ว
เมื่อฉันกด F5 อย่างรวดเร็ว ก็เกิดเสียงสะท้อนบนท้องฟ้า และประโยค "Givemea beauty" ก็ได้รับคำตอบที่ถูกต้อง
ในเวลานี้ ฉันมองไปที่งูทะเลตัวนี้และว่ายไปหามันด้วยความมั่นใจ แต่มันก็ยิ้มอย่างลึกลับ
คุณเคยเห็นรอยยิ้มของงูไหม มันว่ายไปมาช้าๆ
“มันง่ายเกินไปสำหรับคุณที่จะผ่านฉันไปแบบนี้” ทำไมประโยคนี้ถึงคุ้นเคยขนาดนี้? มีคนในราศีทองพูดแบบนี้หรือเปล่า?
"ขอทดสอบสักหน่อย คุณทราบความแตกต่างระหว่าง vbNullString และ " " หรือไม่?
“อย่าคิดว่าคุณเป็นคนดีเพราะคุณเป็นงูทะเล คำถามของคุณง่ายเกินไป” ชายหนุ่มที่อยู่ข้างๆ ฉันซึ่งไม่น่าเกลียดและมีชื่อเล่นว่า " หนุ่มหล่อคนที่เจ็ดของโลก " กล่าวว่า " คุณคิดว่าฉันยังไม่ได้อ่าน Guide to Marine Life เหรอ " ใช่ (Object Browser)
ConstvbNullString=""
สมาชิกของ VBA ค่าคงที่
ค่าคงที่ใช้เมื่อเรียกขั้นตอนภายนอกที่ต้องใช้สตริงค่าที่ไม่ใช่ศูนย์
“ถ้าอย่างนั้นคุณหมายความว่าพวกเขาเหมือนกัน แต่แล้ว vbNullChar ล่ะ?” งูทะเลมองดูชายหนุ่มรูปงามคนที่เจ็ดในโลกด้วยเจตนาชั่วร้าย
“แน่นอน มันเหมือนกัน คุณอ่านคำแนะนำของ VB หรือเปล่า?” ชายหนุ่มรูปหล่อคนที่เจ็ดในโลกโพล่งออกมา แต่เขารู้สึกว่ามีบางอย่างผิดปกติ แต่เบราว์เซอร์วัตถุของ VB พูด
สมาชิกของ VBA ค่าคงที่
แล้วโค้ดต่อไปนี้แสดงถึงอะไร?
งูทะเลให้รหัสของมัน
หลังจากที่ชายหนุ่มรูปงามคนที่เจ็ดของโลกกด F5 เขาก็รู้สึกประหลาดใจกับผลลัพธ์ของรหัสงูทะเล
018992841434596
020
นั่นหมายความว่าต้องมีคนผิดระหว่างคำสั่งของ VB กับ Sea Snake ยิ่งไปกว่านั้น สำหรับ S1 ค่าทั้งสองเป็นศูนย์ ตัวชี้ชี้ไปที่ศูนย์ และความยาวเป็นศูนย์ ไม่ใช่ค่าศูนย์ตามความหมายทั่วไป
ชายหนุ่มรูปหล่อคนที่เจ็ดของโลกก็หันหน้ามามองฉัน
“ไอ้หนู อวดหน่อยสิ มาให้ฉันแสดงอะไรบางอย่างให้นายดูก่อน”
“หากจะปราบงูทะเลต้องเข้าใจโครงสร้างของงูทะเล”
สตริงของ VB เป็นสตริง BSTR มาตรฐาน ตัวอย่างเช่น โครงสร้างของสตริง "Hello" เป็นดังนี้
->-ความกว้าง="26">0
->-ความกว้าง="37">0
->-width="40">'H
->-ความกว้าง="35">0
->-width="48">'อี'
->-ความกว้าง="44">0
->-width="42">'l'
->-ความกว้าง="40">0
->-width="40">'l'
->-ความกว้าง="39">0
->-width="38">'o'
->-ความกว้าง="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 ช้าเกินไป" นักดำน้ำหลายคนรีบตอบคำถามนี้
“555 ใช่แล้ว” งูทะเลหัวเราะเสียงดังแล้วว่ายไปทางทะเลลึกช้าๆ “ IwillBack! ”
เราเหลือกลุ่มนักดำน้ำ และทุกคนต่างคิดว่าเราเข้าใจงูทะเลจริง ๆ หรือไม่ เพราะงูทะเลใน VB Ocean Legend ค่อนข้างน่ากลัว มันจะเดินจากไปอย่างง่ายดายไหม และ IwillBack หมายความว่าอย่างไร ?
แต่เราจะดำน้ำต่อไป….
“ดูสิ แนวปะการัง” มีคนอุทาน! -