WEB开发网      濠电姷鏁告慨鐑藉极閸涘﹦绠鹃柍褜鍓氱换娑欐媴閸愬弶鎼愮痪鍓ф嚀閳规垿鎮╃€圭姴顥濋梺姹囧€楅崑鎾诲Φ閸曨垰绠涢柛顐f礃椤庡秹姊虹粙娆惧剳闁哥姵鍔欐俊鐢稿礋椤栨艾鍞ㄩ梺闈浤涙担鎻掍壕闁圭儤顨嗛埛鎺楁煕閺囥劌浜滄い蹇e弮閺屸€崇暆鐎n剛鏆犻柧浼欑到閵嗘帒顫濋悡搴d画缂佹鍨垮缁樻媴缁涘娈┑顔斤公缁犳捇銆佸鎰佹▌濠电姭鍋撳ù锝囩《閺€浠嬫煟濡鍤嬬€规悶鍎辫灃闁绘ê寮堕崯鐐电磼閸屾氨效鐎规洘绮忛ˇ瀵哥棯閹佸仮鐎殿喖鐖煎畷鐓庘槈濡警鐎崇紓鍌欑劍椤ㄥ棗鐣濋幖浣歌摕闁绘棃顥撻弳瀣煟濡も偓閻楀棗鈻撳Δ鍛拺閻犲洠鈧櫕鐏€闂佸搫鎳愭慨鎾偩閻ゎ垬浜归柟鐑樼箖閺呮繈姊洪棃娑氬婵☆偅鐟╅、娆掔疀閺冨倻鐦堥梺姹囧灲濞佳勭閿曞倹鐓曢柕濞垮劤閸╋絾顨ラ悙鏉戝妤犵偞锕㈤、娆撴嚃閳哄骞㈤梻鍌欐祰椤鐣峰Ο鑲╃煋妞ゆ棁锟ユ禍褰掓煙閻戞ɑ灏ù婊冪秺濮婅櫣绱掑Ο铏逛桓闂佹寧娲嶉弲娑滅亱闂佸憡娲﹂崹閬嶅煕閹达附鐓欓柤娴嬫櫅娴犳粌鈹戦垾鐐藉仮闁诡喗顨呴埥澶愬箳閹惧褰囩紓鍌欑贰閸犳牠顢栭崨鎼晣闁稿繒鍘х欢鐐翠繆椤栨粎甯涙繛鍛喘濮婄粯鎷呴悷閭﹀殝缂備浇顕ч崐鍨嚕缂佹ḿ绡€闁搞儯鍔嶅▍鍥⒑缁嬫寧婀扮紒瀣崌瀹曘垽鎮介崨濠勫幗闁瑰吋鐣崹濠氬煀閺囥垺鐓ユ慨妯垮煐閻撶喖鐓崶銉ュ姢缂佸宕电槐鎺旂磼濡偐鐣虹紓浣虹帛缁诲牆鐣峰鈧俊姝岊槺缂佽鲸绻堝缁樻媴缁涘娈愰梺鎼炲妺閸楀啿鐣烽鐐茬骇闁瑰濮靛▓楣冩⒑缂佹ɑ鈷掗柍宄扮墦瀵偊宕掗悙瀵稿幈闂佹娊鏁崑鎾绘煛閸涱喚鎳呮俊鍙夊姇铻i悶娑掑墲閺傗偓闂備胶绮崝鏇炍熸繝鍥у惞闁绘柨鐨濋弨鑺ャ亜閺冨洦顥夐柛鏂诲€濋幗鍫曟倷閻戞ḿ鍘遍梺鍝勬储閸斿本鏅堕鐐寸厱婵炲棗绻掔粻濠氭煛鐏炵晫效鐎规洦鍋婂畷鐔碱敆閳ь剙鈻嶉敐鍥╃=濞达絾褰冩禍鐐節閵忥絾纭炬い鎴濇川缁粯銈i崘鈺冨幍闁诲孩绋掑玻璺ㄧ不濮椻偓閺屻劌鈽夊Ο澶癸絾銇勯妸锝呭姦闁诡喗鐟╅、鏃堝礋椤撴繄绀勯梻鍌欐祰椤曟牠宕伴弽顐ょ濠电姴鍊婚弳锕傛煙椤栫偛浜版俊鑼额嚙閳规垿鍩勯崘銊хシ濡炪値鍘鹃崗妯侯嚕鐠囨祴妲堥柕蹇曞閳哄懏鐓忓璺虹墕閸旀挳鏌涢弬娆炬Ш缂佽鲸鎸婚幏鍛矙鎼存挸浜鹃柛婵勫劤閻挾鎲搁悧鍫濈瑨闁哄绶氶弻鐔煎礈瑜忕敮娑㈡煛閸涱喗鍊愰柡灞诲姂閹倝宕掑☉姗嗕紦 ---闂傚倸鍊搁崐鎼佸磹閻戣姤鍊块柨鏃堟暜閸嬫挾绮☉妯哄箻婵炲樊浜滈悡娑㈡煕濞戝崬骞樻い鏂挎濮婅櫣鎹勯妸銉︾彚闂佺懓鍤栭幏锟�
开发学院WEB开发综合 VisualBasic深度下潜之海蛇缠绕 阅读

VisualBasic深度下潜之海蛇缠绕

 2006-02-27 11:50:04 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹妞嬪孩顐芥慨姗嗗厳缂傛氨鎲稿鍫罕闂備礁婀遍搹搴ㄥ窗閺嶎偆涓嶆い鏍仦閻撱儵鏌i弴鐐测偓鍦偓姘炬嫹闂傚倸鍊搁崐鎼佸磹妞嬪海鐭嗗〒姘e亾妤犵偛顦甸弫鎾绘偐閹绘帞鈧參姊哄Ч鍥х仼闁诲繑鑹鹃悾鐑藉蓟閵夛妇鍘甸梺瑙勵問閸犳牠銆傛總鍛婄厱閹艰揪绱曟牎闂侀潧娲ょ€氫即鐛幒妤€绠f繝闈涘暙娴滈箖鏌i姀鈶跺湱澹曟繝姘厵闁绘劦鍓氶悘杈ㄤ繆閹绘帞澧涚紒缁樼洴瀹曞崬螖閸愬啠鍓濈换娑樼暆婵犱胶鏁栫紓浣介哺閹瑰洤鐣烽幒鎴僵闁瑰吀鐒﹂悗鎼佹⒒娴g儤鍤€闁搞倖鐗犻獮蹇涙晸閿燂拷濠电姷鏁告慨鐑藉极閸涘﹥鍙忔い鎾卞灩缁狀垶鏌涢幇闈涙灈鐎瑰憡绻冮妵鍕箻鐎靛摜鐣奸梺纭咁潐濞茬喎顫忕紒妯肩懝闁逞屽墮宀h儻顦查悡銈夋煏閸繃鍋繛宸簻鎯熼梺瀹犳〃閼冲爼宕濋敃鈧—鍐Χ閸℃鐟愰梺鐓庡暱閻栧ジ宕烘繝鍥у嵆闁靛骏绱曢崢顏堟⒑閹肩偛鍔楅柡鍛⊕缁傛帟顦寸紒杈ㄥ笚濞煎繘鍩℃担閿嬵潟闂備浇妗ㄩ悞锕傚箲閸ヮ剙鏋侀柟鍓х帛閺呮悂鏌ㄩ悤鍌涘闂傚倸鍊搁崐鎼佸磹妞嬪孩顐芥慨姗嗗厳缂傛氨鎲稿鍫罕闂備礁婀遍搹搴ㄥ窗閺嶎偆涓嶆い鏍仦閻撱儵鏌i弴鐐测偓鍦偓姘炬嫹  闂傚倸鍊搁崐鎼佸磹閻戣姤鍤勯柤鍝ユ暩娴犳氨绱撻崒娆掑厡缂侇噮鍨堕妴鍐川閺夋垹鍘洪悗骞垮劚椤︻垶宕¢幎鑺ョ厪闊洦娲栨牎闂佽瀵掗崜鐔奉潖閾忓湱纾兼俊顖氭惈椤矂姊洪崷顓涙嫛闁稿妫濋幆鈧い蹇撴祩濡嫰姊洪崫鍕拱婵炲弶岣块幑銏犫攽婵犲嫮鏉搁梺鍝勬川婵兘鎮伴妷鈺傗拻濞达絽鎼敮璺侯熆閻熷府鏀荤紒鍌氱Т楗即宕煎锝呬壕闁哄啫鐗嗙粈鍐┿亜韫囧海顦﹀ù婊堢畺閺屻劌鈹戦崱娑扁偓妤€顭胯閸犳牠婀侀梺缁樕戦悷銉р偓姘煎枤缁粯銈i崘鈺冨幈濡炪倖鍔戦崐鏇㈠几鎼淬劍鐓熼煫鍥ь儏閸旀粓鏌曢崶褍顏€殿喗娼欒灒闁告繂瀚濠碉紕鍋戦崐鎴﹀垂濞差亝鍋¢柍鍝勬噹缁犳牠鏌嶉埡浣告殲闁稿海鍠栭弻鏇㈠炊瑜嶇花濠氭煙閸戙倖瀚�
核心提示:“海蛇”有人在惊呼,只见在海底深处游来一条黑色的长长的海蛇,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="\0";->

  看到了没有,vbNullString指向一个空字串,但这个空字串是零址的。而vbNullChar则是一个零字符(相当于C中字符串中最后一个字符)。那么我们来看海蛇的代码运行时发生了什么

->s1=vbNullString->

  VB看到这句时,它很清楚把S1的值变成了零

->s2=vbNullChar->

  VB看到这句时,它做了几个动作,它用SysAllocStringLen在堆中分配了一个BSTR字符串,然后将'\0'复制到这个字符串里。

->s3=""->

  这里VB做了很多工作,首先,VB在编译时,把""当成了一个常量,它必须为这个空字符串内部申请一个变量。当EXE文件加载后,也得把它设定一个地址,虽然它什么都不代表

  是一个000000000000这样的字符串,它需要6个字节(四个头字节和2个尾字节)

  然后当看到这句时再把第五个字节的地址值传给s3

  所以,虽然你只是信手写了一个"",结果VB多作了很多工作。6个字节虽然不多,但是在一个大工程里,大家都到处写“”,那么也是很可观的一笔开销。所以下次你绝对不要再用"",而一定要用vbNullString

  “你说,是么,海蛇”,我轻蔑地看着它。

  海蛇看到大家都恍然大悟的样子,再此发出了它的笑声(海蛇会笑么?)

  “了解我,并不是真正的掌控我,很多C的潜水员会对VB不屑一顾,你们知道是为什么?”

  “慢,VB的字符串操作太慢了”很多潜水者都回抢着回答这个问题。

  “呵呵,是的,”海蛇放声大笑,慢慢地游向深海“IwillBack!

  留下我们这群潜水的人,大家在思索,我们真正了解海蛇了么,因为VB海洋传说中海蛇是相当可怕的,它会这么轻易地走开么,而且,它所说的IwillBack又是指什么?

  但是我们会继续下潜…….

  “看,珊瑚礁”有人在惊呼!->

Tags:VisualBasic 深度 下潜

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接