分享
 
 
 

VB 深度下潜之 海蛇缠绕

王朝c#·作者佚名  2006-12-17
窄屏简体版  字體: |||超大  

下潜深度(十米,水温0°C),时间北京时间零点整。 “海蛇”有人在惊呼。

只见在海底深处游来一条黑色的长长的海蛇,几乎所有的人都在发呆。但是海蛇说了一句让我们胆寒的话“我就是有名的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后,他很惊讶海蛇代码的运行结果

0 1899284 1434596

0 2 0

那么就是说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又是指什么?

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

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有