日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

VB深度下潜

發(fā)布時(shí)間:2025/7/14 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VB深度下潜 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

下潛深度(十米,水溫0°C),時(shí)間北京時(shí)間零點(diǎn)整。

? 海蛇”有人在驚呼。

? 只見在海底深處游來一條黑色的長長的海蛇,幾乎所有的人都在發(fā)呆。但是海蛇說了一句讓我們膽寒的話“我就是有名的VB字符串,如果你們繼續(xù)下潛的話,就得想通過我”。

? 我習(xí)慣性的觀察著它,因?yàn)槲抑酪驍∫粋€(gè)對手,就必須深入的了解對手。

? 因此我寫了一段小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

? 這個(gè)代碼運(yùn)行得很好,完全符合我的想像,在立即窗口中顯示了1224

? Good,于是我準(zhǔn)備在窗口中用TextOut把它打印出來,至于為什么我一定要這個(gè)函數(shù)而不用其它的,你管得著么?所以我寫下了于下代碼

? 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

? 結(jié)果我發(fā)現(xiàn)不對?看來是字符串長度不對,想起來了,在VB中字符串是BSTR型的,那么應(yīng)該用L2作長度,對不對呢,試試就知道了。

?? 天呀,在字符串后出現(xiàn)了天書,難道是上帝在暗示我什么時(shí)候給我一個(gè)美女?

?? 不過我想上帝沒有這么快就會答應(yīng)我,因此一定是我的代碼有問題。

?? 當(dāng)我正在沉思的時(shí)候,所有的人都在觀注著我。沒辦法,太帥了。

?? 所以我又迅速寫下了以下的代碼

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

當(dāng)我快速地按下F5后,天空中便有了回響,“Give me a 美女這句話已得到了正確的響應(yīng)。

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

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

“如果你們打算就這樣通過我的話,也想得太容易了”這句話為什么這么熟悉呢。是不是在黃金十二宮里的什么人說的吧,

“給你們一個(gè)小考驗(yàn),你們知道vbNullString “” 有什么區(qū)別么?”

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

Const vbNullString = ""

??? VBA.Constants 的成員

??? 當(dāng)調(diào)用一個(gè)外部過程,需要一個(gè)非零值的字符串時(shí),所使用的常數(shù)

“那你的意思是說是一樣的了,那么vbNullChar呢?”海蛇不懷好意地看著天下第七帥。

“那當(dāng)然是一樣的了,你看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后,他很驚訝海蛇代碼的運(yùn)行結(jié)果

? 0???????????? 1899284?????? 1434596

??0???????????? 2???????????? 0

那么就是說VB的說明和海蛇之間一定有人錯(cuò)了。而且,對于采用S1兩個(gè)值都是零,指針指向零,長度為零,它不是一個(gè)普通意義上的零值呀。

天下第七帥于是轉(zhuǎn)過頭來看著我。

“小子,出風(fēng)頭吧,來吧,我先給你們看點(diǎn)東西”

“你們想要打敗海蛇,就一定要了解海蛇的結(jié)構(gòu)”

VB的字符串是一個(gè)標(biāo)準(zhǔn)的BSTR字符串,比如說”Hello”這個(gè)字符串它的結(jié)構(gòu)是這樣的

A

0

0

0

‘H’

0

‘e’

0

‘l’

0

‘l’

0

‘o’

0

0

0

可以看到前面四個(gè)字節(jié)代表 字符串實(shí)際長度所占字節(jié)數(shù),它是一個(gè)Long值。

而最后兩個(gè)字節(jié)是代表零值的結(jié)尾字符。

而中間的十個(gè)字節(jié)正好是字符串的內(nèi)容。

如果我們用s1=”Hello”,那么s1是指向什么地方呢。

“最初我以為s1是指向第一個(gè)字節(jié),但是當(dāng)我用自編的VB內(nèi)存觀測工具來看strptr(s1)后面所跟的字節(jié)值時(shí)發(fā)現(xiàn),s1是指向第五個(gè)字節(jié),也就是我們字符串真正開始的地方。

“大家都了解了海蛇的結(jié)構(gòu)了,那么它剛才提出的三種情況為什么會有不同呢?”我向還在發(fā)呆的下潛者。

“是呀,為什么?”

好了,拿出你們的OleView,在File-> View TypeLib中打開VB6.DLL,你是不是看到了一個(gè)很奇妙的天地,別發(fā)呆,找到以下部分

Modules->Modules Constants

打開他們你便會看到VB內(nèi)部真正的定義了。

[helpcontext(0x0010aa32)] const LPSTR vbNullString = "";

[helpcontext(0x0010aa32)] const LPSTR vbNullChar = "\0";

看到了沒有,vbNullString指向一個(gè)空字串,但這個(gè)空字串是零址的。而vbNullChar則是一個(gè)零字符(相當(dāng)于C中字符串中最后一個(gè)字符)。那么我們來看海蛇的代碼運(yùn)行時(shí)發(fā)生了什么

s1 = vbNullString

VB看到這句時(shí),它很清楚把S1的值變成了零

s2 = vbNullChar

VB看到這句時(shí),它做了幾個(gè)動作,它用SysAllocStringLen在堆中分配了一個(gè)BSTR字符串,然后將’\0’復(fù)制到這個(gè)字符串里。

s3 = ""

這里VB做了很多工作,首先,VB在編譯時(shí),把””當(dāng)成了一個(gè)常量,它必須為這個(gè)空字符串內(nèi)部申請一個(gè)變量。當(dāng)EXE文件加載后,也得把它設(shè)定一個(gè)地址,雖然它什么都不代表

是一個(gè) 00 00 00 00 00 00 這樣的字符串,它需要6個(gè)字節(jié)(四個(gè)頭字節(jié)和2個(gè)尾字節(jié))

然后當(dāng)看到這句時(shí)再把第五個(gè)字節(jié)的地址值傳給s3

所以,雖然你只是信手寫了一個(gè)””,結(jié)果VB多作了很多工作。6個(gè)字節(jié)雖然不多,但是在一個(gè)大工程里,大家都到處寫“”,那么也是很可觀的一筆開銷。所以下次你絕對不要再用””,而一定要用vbNullString

你說,是么,海蛇,我輕蔑地看著它。

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

“了解我,并不是真正的掌控我,很多C的潛水員會對VB不屑一顧,你們知道是為什么?”

“慢,VB的字符串操作太慢了”很多潛水者都回?fù)屩卮疬@個(gè)問題。

“呵呵,是的,”海蛇放聲大笑,慢慢地游向深海“I will Back!

留下我們這群潛水的人,大家在思索,我們真正了解海蛇了么,因?yàn)?/span>VB海洋傳說中海蛇是相當(dāng)可怕的,它會這么輕易地走開么,而且,它所說的 I will Back又是指什么?

但是我們會繼續(xù)下潛…….

“看,珊瑚礁”有人在驚呼!

??????? 以上是轉(zhuǎn)貼。
??????? 最初不明白len()與lenb()有什么區(qū)別,查看MSDN發(fā)現(xiàn)Len()返回字符串的數(shù)量,不管是漢字、字母或者其他的字符都算一個(gè)字,而LenB()返回的是字符串的字節(jié)數(shù),想來這個(gè)因該是和機(jī)器有關(guān)的吧,在我的系統(tǒng)上(winxp+vb6)測試不管漢字或字母均為兩個(gè)字節(jié)。

轉(zhuǎn)載于:https://www.cnblogs.com/happy555/archive/2004/12/08/74204.html

總結(jié)

以上是生活随笔為你收集整理的VB深度下潜的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。