「海蛇」有人在驚呼。
只見在海底深處遊來一條黑色的長長的海蛇,幾乎所有的人都在發呆。但是海蛇說了一句讓我們膽寒的話「我就是有名的VB字串,如果你們繼續下潛的話,就得想通過我」。
我習慣性的觀察著它,因為我知道要打敗一個對手,就必須深入的了解對手。
因此我寫了一段小CODE來了解它。
這個程式碼運行得很好,完全符合我的想像,在立即視窗中顯示了12,24,
Good,於是我準備在視窗中用TextOut把它印出來,至於為什麼我一定要這個函數而不用其它的,你管得著麼?所以我寫下了於下程式碼
結果我發現不對?看來是字串長度不對,想起來了,在VB中字串是BSTR型的,那麼應該用L2作長度,對不對呢,試試看就知道了。
天呀,在字符串後出現了天書,難道是上帝在暗示我什麼時候給我一個美女?
不過我想上帝沒有這麼快就會答應我,因此一定是我的程式碼有問題。
當我正在沉思的時候,所有的人都在觀注我。沒辦法,太帥了。
所以我又迅速寫下了以下的程式碼
當我快速地按下F5後,天空中便有了迴響,「Givemea美女」這句話已得到了正確的回應。
這時候我看著這條海蛇,滿有信心地向它游去,但是它卻很詭秘的一笑。
你看過蛇的笑容麼,它也很緩緩的遊過來了。
「如果你們打算就這樣通過我的話,也想得太容易了」這句話為什麼這麼熟悉呢。是不是在黃金十二宮裡的什麼人說的吧,
“給你們一個小考驗,你們知道vbNullString和“”有什麼區別麼?”
「別以為你是海蛇就了不起,你這問題也太簡單了吧」我身邊一個長得不是很難看的小伙子,人送綽號(天下第七帥),「你以為我沒讀過海洋生物指南呀(對象瀏覽器)
ConstvbNullString=""
VBA.Constants的成員
當呼叫一個外部過程,需要一個非零值的字串時,所使用的常數
「那你的意思是說是一樣的了,那vbNullChar呢?」海蛇不懷好意地看著天下第七帥。
「那當然是一樣的了,你看VB的說明麼」天下第七帥沖口而出,不過他又覺得好像有些不對。但是VB的物件瀏覽器上的確寫著
VBA.Constants的成員
那麼下面這段程式碼代表什麼呢?
海蛇給了它的代碼
天下第七帥按下F5後,他很驚訝海蛇代碼的運行結果
018992841434596
020
那麼就是說VB的說明和海蛇之間一定有人錯了。而且,對於採用S1兩個值都是零,指標指向零,長度為零,它不是一個普通意義上的零值呀。
天下第七帥於是轉過頭來看著我。
“小子,出風頭吧,來吧,我先給你們看點東西”
“你們想要打敗海蛇,就一定要了解海蛇的結構”
VB的字串是一個標準的BSTR字串,比如說」Hello」這個字串它的結構是這樣的
->-width="26">0
->-width="37">0
->-width="40">'H
->-width="35">0
->-width="48">'e'
->-width="44">0
->-width="42">'l'
->-width="40">0
->-width="40">'l'
->-width="39">0
->-width="38">'o'
->-width="35">0
->-width="35">0
->-width="38">0->
可以看到前面四個位元組代表字串實際長度所佔位元組數,它是一個Long值。
而最後兩個位元組是代表零值的結尾字元。
而中間的十個位元組正好是字串的內容。
如果我們用s1=”Hello”,那麼s1是指向什麼地方呢。
「最初我以為s1是指向第一個字節,但當我用自編的VB記憶體觀測工具來看strptr(s1)後面所跟的字節值時發現, s1是指向第五個字節,也就是我們字串真正開始的地方。
「大家都了解了海蛇的結構了,那麼它剛才提出的三種情況為什麼會有不同呢?」我向還在發呆的下潛者。
“是呀,為什麼?”
好了,拿出你們的OleView,在File->ViewTypeLib中打開VB6.DLL,你是不是看到了一個很奇妙的天地,別發呆,找到以下部分
打開他們你便會看到VB內部真正的定義了。
看到了沒有,vbNullString指向一個空字符串,但這個空字符串是零址的。而vbNullChar則是零字元(相當於C中字串中最後一個字元)。那我們來看海蛇的程式碼運行時發生了什麼
VB看到這句話時,它很清楚把S1的值變成零
VB看到這句時,它做了幾個動作,它用SysAllocStringLen在堆中分配了一個BSTR字串,然後將'/0'複製到這個字串裡。
這裡VB做了很多工作,首先,VB在編譯時,把""當成了一個常數,它必須為這個空字串內部申請一個變數。當EXE檔案載入後,也要把它設定一個位址,雖然它什麼都不代表
是一個000000000000這樣的字串,它需要6個位元組(四個頭字節和2個尾字節)
然後看到這句時再把第五個位元組的位址值傳給s3
所以,雖然你只是信手寫了一個"",結果VB多作了很多工作。 6個位元組雖然不多,但是在一個大工程裡,大家都到處寫“”,那麼也是很可觀的一筆開銷。所以下次你絕對不要再用"" ,而一定要用vbNullString
“你說,是麼,海蛇”,我輕蔑地看著它。
海蛇看到大家都恍然大悟的樣子,再此發出了它的笑聲(海蛇會笑麼?)
“了解我,並不是真正的掌控我,很多C的潛水員會對VB不屑一顧,你們知道是為什麼?”
「慢,VB的字串操作太慢了」很多潛水者都回搶著回答這個問題。
「呵呵,是的,」海蛇放聲大笑,慢慢地游向深海“ IwillBack! ”
留下我們這群潛水的人,大家在思索,我們真正了解海蛇了麼,因為VB海洋傳說中海蛇是相當可怕的,它會這麼輕易地走開麼,而且,它所說的IwillBack又是指什麼?
但我們會繼續下潛….
「看,珊瑚礁」有人在驚呼! ->