程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> VisualBasic深度下潛之海蛇纏繞

VisualBasic深度下潛之海蛇纏繞

編輯:VB綜合教程
海蛇”有人在驚呼。
  
  只見在海底深處游來一條黑色的長長的海蛇,幾乎所有的人都在發呆。但是海蛇說了一句讓我們膽寒的話“我就是有名的VB字符串,如果你們繼續下潛的話,就得想通過我”。
  
  我習慣性的觀察著它,因為我知道要打敗一個對手,就必須深入的了解對手。
  
  因此我寫了一段小CODE來了解它。
  
  -> DimstrAsString
  str="Givemea美女"
  DimL1AsLong
  DimL2AsLong
  L1=Len(str)
  L2=LenB(str)
  Debug.PrintL1,L2->
  這個代碼運行得很好,完全符合我的想像,在立即窗口中顯示了12,24,
  
  Good,於是我准備在窗口中用TextOut把它打印出來,至於為什麼我一定要這個函數而不用其它的,你管得著麼?所以我寫下了於下代碼
  
  ->DimstrAsString
  str="Givemea美女"
  DimL1AsLong
  DimL2AsLong
  L1=Len(str)
  L2=LenB(str)
  Debug.PrintL1,L2
  TextOutMe.hDC,100,100,str,L1->
  結果我發現不對?看來是字符串長度不對,想起來了,在VB中字符串是BSTR型的,那麼應該用L2作長度,對不對呢,試試就知道了。
  
  天呀,在字符串後出現了天書,難道是上帝在暗示我什麼時候給我一個美女?
  
  不過我想上帝沒有這麼快就會答應我,因此一定是我的代碼有問題。
  
  當我正在沉思的時候,所有的人都在觀注著我。沒辦法,太帥了。
  
  所以我又迅速寫下了以下的代碼
  
  ->PrivateDeclareFunctionLenANSILib"kernel32"Alias"lstrlenA"(ByValstring1AsString)AsLong
  ……
  DimstrAsString
  str="Givemea美女"
  DimTrueLenAsLong
  TrueLen=LenANSI(str)
  TextOutMe.hDC,100,100,str,TrueLen->
  當我快速地按下F5後,天空中便有了回響,“Givemea美女”這句話已得到了正確的響應。
  
  這時候我看著這條海蛇,滿有信心地向它游去,但是它卻很詭秘的一笑。
  
  你見過蛇的笑容麼,它也很緩緩的游過來了。
  
  “如果你們打算就這樣通過我的話,也想得太容易了”這句話為什麼這麼熟悉呢。是不是在黃金十二宮裡的什麼人說的吧,
  
  “給你們一個小考驗,你們知道vbNullString和“”有什麼區別麼?”
  
  “別以為你是海蛇就了不起,你這問題也太簡單了吧”我身邊一個長得不是很難看的小伙子,人送外號(天下第七帥),“你以為我沒讀過海洋生物指南呀(對象浏覽器)
  
  ConstvbNullString=""
  
  VBA.Constants的成員
  
  當調用一個外部過程,需要一個非零值的字符串時,所使用的常數
  
  “那你的意思是說是一樣的了,那麼vbNullChar呢?”海蛇不懷好意地看著天下第七帥。
  
  “那當然是一樣的了,你看VB的說明麼”天下第七帥沖口而出,不過他又覺得好象有些不對。但是VB的對象浏覽器上的確寫著
  
  ->ConstvbNullChar=""->
  VBA.Constants的成員
  
  那麼下面這段代碼代表什麼呢?
  
  海蛇給出了它的代碼
  
  ->Dims1AsString
  Dims2AsString
  Dims3AsString
  s1=vbNullString
  s2=vbNullChar
  s3=""
  
  Debug.PrintStrPtr(s1),StrPtr(s2),StrPtr(s3)
  Debug.PrintLenB(s1),LenB(s2),LenB(s3)->
  天下第七帥按下F5後,他很驚訝海蛇代碼的運行結果
  
  018992841434596
  
  020
  
  那麼就是說VB的說明和海蛇之間一定有人錯了。而且,對於采用S1兩個值都是零,指針指向零,長度為零,它不是一個普通意義上的零值呀。
  
  天下第七帥於是轉過頭來看著我。
  
  “小子,出風頭吧,來吧,我先給你們看點東西”
  
  “你們想要打敗海蛇,就一定要了解海蛇的結構”
  
  VB的字符串是一個標准的BSTR字符串,比如說”Hello”這個字符串它的結構是這樣的
  
  -width="24">A->-width="30">0
  ->-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,你是不是看到了一個很奇妙的天地,別發呆,找到以下部分
  
  ->Modules->ModulesConstants->
  打開他們你便會看到VB內部真正的定義了。
  
  ->[helpcontext(0x0010aa32)]constLPSTRvbNullString="";
  
  [helpcontext(0x0010aa32)]constLPSTRvbNullChar="
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved