VB深度下潛

2022-03-26 15:14:49 字數 4838 閱讀 2491

海蛇」有人在驚呼。

只見在海底深處遊來一條黑色的長長的海蛇,幾乎所有的人都在發呆。但是海蛇說了一句讓我們膽寒的話「我就是有名的

vb字串,如果你們繼續下潛的話,就得想通過我」。

我習慣性的觀察著它,因為我知道要打敗乙個對手,就必須深入的了解對手。

因此我寫了一段小

code

來了解它。

dim str as string

str = "give me a 美女"

dim l1 as long

dim l2 as long

l1 = len(str)

l2 = lenb(str)

debug.print l1, l2

這個**執行得很好,完全符合我的想像,在立即視窗中顯示了12,

24,good

,於是我準備在視窗中用

textout

把它列印出來,至於為什麼我一定要這個函式而不用其它的,你管得著麼?所以我寫下了於下**

dim str as string

str = "give me a 美女"

dim l1 as long

dim l2 as long

l1 = len(str)

l2 = lenb(str)

debug.print l1, l2

textout me.hdc, 100, 100, str, l1

結果我發現不對?看來是字串長度不對,想起來了,在

vb中字串是

bstr

型的,那麼應該用

l2作長度,對不對呢,試試就知道了。

天呀,在字串後出現了天書,難道是上帝在暗示我什麼時候給我乙個美女?

不過我想上帝沒有這麼快就會答應我,因此一定是我的**有問題。

當我正在沉思的時候,所有的人都在觀注著我。沒辦法,太帥了。

所以我又迅速寫下了以下的**

private declare function lenansi lib "kernel32" alias "lstrlena" (byval string1 as string) as long

……dim str as string

str = "give me a 美女"

dim truelen as long

truelen = lenansi(str)

textout me.hdc, 100, 100, str, truelen

當我快速地按下

f5後,天空中便有了迴響,「

give me a 美女」

這句話已得到了正確的響應。

這時候我看著這條海蛇,滿有信心地向它游去,但是它卻很詭秘的一笑。

你見過蛇的笑容麼,它也很緩緩的游過來了。

「如果你們打算就這樣通過我的話,也想得太容易了」這句話為什麼這麼熟悉呢。是不是在**十二宮裡的什麼人說的吧,

「給你們乙個小考驗,你們知道vbnullstring

「」

有什麼區別麼?」

「別以為你是海蛇就了不起,你這問題也太簡單了吧」我身邊乙個長得不是很難看的小夥子,人送外號(天下第七帥),「你以為我沒讀過海洋生物指南呀(物件瀏覽器)

const vbnullstring = ""

vba.constants

的成員當呼叫乙個外部過程,需要乙個非零值的字串時,所使用的常數

「那你的意思是說是一樣的了,那麼

vbnullchar

呢?」海蛇不懷好意地看著天下第七帥。

「那當然是一樣的了,你看

vb的說明麼」天下第七帥衝口而出,不過他又覺得好象有些不對。但是

vb的物件瀏覽器上的確寫著

const vbnullchar = ""

vba.constants

的成員那麼下面這段**代表什麼呢?

海蛇給出了它的**

dim s1 as string

dim s2 as string

dim s3 as string

s1 = vbnullstring

s2 = vbnullchar

s3 = ""

debug.print strptr(s1), strptr(s2), strptr(s3)

debug.print lenb(s1), lenb(s2), lenb(s3)

天下第七帥按下

f5後,他很驚訝海蛇**的執行結果

018992841434596

020那麼就是說

vb的說明和海蛇之間一定有人錯了。而且,對於採用

s1兩個值都是零,指標指向零,長度為零,它不是乙個普通意義上的零值呀。

天下第七帥於是轉過頭來看著我。

「小子,出風頭吧,來吧,我先給你們看點東西」

「你們想要打敗海蛇,就一定要了解海蛇的結構」

vb的字串是乙個標準的

bstr

字串,比如說

」hello」

這個字串它的結構是這樣的

a

0

0

0

h

0

e

0

l

0

l

0

o

0

0

0

可以看到前面四個位元組代表

字串實際長度所佔位元組數,它是乙個

long

值。而最後兩個位元組是代表零值的結尾字元。

而中間的十個位元組正好是字串的內容。

如果我們用

s1=」hello」

,那麼s1

是指向什麼地方呢。

「最初我以為

s1是指向第乙個位元組,但是當我用自編的

vb記憶體觀測工具來看

strptr(s1)

後面所跟的位元組值時發現s1是指向第五個位元組,也就是我們字串真正開始的地方。

「大家都了解了海蛇的結構了,那麼它剛才提出的三種情況為什麼會有不同呢?」我向還在發呆的下潛者。

「是呀,為什麼?」

好了,拿出你們的

oleview

,在file-> view typelib

中開啟vb6.dll

,你是不是看到了乙個很奇妙的天地,別發呆,找到以下部分

modules->modules constants

開啟他們你便會看到

vb內部真正的定義了。

[helpcontext(0x0010aa32)] const lpstr vbnullstring = "";

[helpcontext(0x0010aa32)] const lpstr vbnullchar = "\0";

看到了沒有,

vbnullstring

指向乙個空字串,但這個空字串是零址的。而

vbnullchar

則是乙個零字元(相當於

c中字串中最後乙個字元)。那麼我們來看海蛇的**執行時發生了什麼

s1 = vbnullstring

vb看到這句時,它很清楚把

s1的值變成了零

s2 = vbnullchar

vb看到這句時,它做了幾個動作,它用

sysallocstringlen

在堆中分配了乙個

bstr

字串,然後將

』\0』

複製到這個字串裡。

s3 = ""

這裡vb

做了很多任務作,首先,

vb在編譯時,把

」」當成了乙個常量,它必須為這個空字串內部申請乙個變數。當

exe檔案載入後,也得把它設定乙個位址,雖然它什麼都不代表

是乙個00 00 00 00 00 00

這樣的字串,它需要

6個位元組(四個頭位元組和

2個尾位元組)

然後當看到這句時再把第五個位元組的位址值傳給

s3所以,雖然你只是信手寫了乙個

」」,結果

vb多作了很多任務作。

6個位元組雖然不多,但是在乙個大工程裡,大家都到處寫「」,那麼也是很可觀的一筆開銷。所以下次你絕對不要再用」」,而一定要用

vbnullstring

「你說,是麼,海蛇

」,我輕蔑地看著它。

海蛇看到大家都恍然大悟的樣子,再此發出了它的笑聲(海蛇會笑麼?)

「了解我,並不是真正的掌控我,很多

c的潛水員會對

vb不屑一顧,你們知道是為什麼?」

「慢,vb

的字串操作太慢了」很多潛水者都回搶著回答這個問題。

「呵呵,是的,」海蛇放聲大笑,慢慢地游向深海「i will back!

留下我們這群潛水的人,大家在思索,我們真正了解海蛇了麼,因為

vb海洋傳說中海蛇是相當可怕的,它會這麼輕易地走開麼,而且,它所說的

i will back

又是指什麼?

但是我們會繼續下潛

…….「看,珊瑚礁」有人在驚呼!

以上是轉貼。

最初不明白len()與lenb()有什麼區別,檢視msdn發現len()返回字串的數量,不管是漢字、字母或者其他的字元都算乙個字,而lenb()返回的是字串的位元組數,想來這個因該是和機器有關的吧,在我的系統上(winxp+vb6)測試不管漢字或字母均為兩個位元組。

VB 深度下潛之 海蛇纏繞

海蛇 有人在驚呼。只見在海底深處遊來一條黑色的長長的海蛇,幾乎所有的人都在發呆。但是海蛇說了一句讓我們膽寒的話 我就是有名的 vb字串,如果你們繼續下潛的話,就得想通過我 我習慣性的觀察著它,因為我知道要打敗乙個對手,就必須深入的了解對手。因此我寫了一段小 code 來了解它。dim str as ...

深度拷貝和潛拷貝

淺 復 制 在複製操作時,對於被複製的物件的每一層複製都是指標複製。深 復 制 在複製操作時,對於被複製的物件至少有一層複製是物件複製。完全複製 在複製操作時,對於被複製的物件的每一層複製都是物件複製。注 1 在複製操作時,對於物件有n層是物件複製,我們可稱作n級深複製,此處n應大於等於1。2 對於...

VB工程下的各個檔案

ctl vb 使用者控制項 的 檔案 儲存了其中的 屬性等 ctx vb 使用者控制項 的資源檔案 儲存了該使用者控制項中使用的 ico等資源 frm vb 窗體 的 檔案 儲存了其中的 屬性等 frx vb 窗體 的資源檔案 儲存了該使用者控制項中使用的 ico等資源 bas vb 模組 的 檔案...