VisualBasic深度下潜之海蛇缠绕
想不想get新技能酷炫一下,今天图老师小编就跟大家分享个简单的VisualBasic深度下潜之海蛇缠绕教程,一起来看看吧!超容易上手~
只见在海底深处游来一条黑色的长长的海蛇,几乎所有的人都在发呆。但是海蛇说了一句让我们胆寒的话“我就是有名的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="