学院首页 软件应用 编程开发 创意设计 认证培训 软件论坛
ASP ASP.NET PHP JSP SQL MYSQL Java VB

您的位置:学院 >> 编程开发 >> VB >> Visual Basic 深度下潜之海蛇缠绕


Visual Basic 深度下潜之海蛇缠绕


  海蛇”有人在惊呼。

   只见在海底深处游来一条黑色的长长的海蛇,几乎所有的人都在发呆。但是海蛇说了一句让我们胆寒的话“我就是有名的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又是指什么?

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

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


技术文章快速查找

栏目导航
软件应用
·操作系统 ·杀毒防黑 ·应用软件
·聊天软件 ·网络软件  
Web开发
·ASP ·JavaScript ·CGI
·JSP ·VbScript ·Web服务器
·PHP ·XML  
开发语言
·VB ·VC ·ASP.NET
·Java ·C/C++ ·Delphi
数据库开发
·MySQL ·SQL/Access ·PowerBuilder
·Oracle ·DB2  
网站设计
·Flash ·Dreamweaver ·HTML/CSS
·Fireworks ·FrontPage  
平面设计
·Photoshop ·CorelDraw ·AutoCAD
·FreeHand ·Illustrator ·3DsMAX
媒体动画
·Director ·Authorware ·Maya
·视频处理    


相关软件 产品库推荐
·笔记本 ·台式机 ·服务器
·数码相机 ·手机 ·GPS
·DV摄像机 ·MP3 ·MP4
·CPU ·硬盘 ·内存
·主板 ·显卡 ·显示器
·打印机 ·投影机 ·路由器

还没人留言,抢个先,哈哈!
对"Visual Basic 深度下潜之海蛇缠绕"的评论 - 快速回贴
内容:
  [完成后可按Ctrl+Enter发布]

百度中 Visual Basic 深度下潜之海蛇缠绕 相关内容
Google搜索中 Visual Basic 深度下潜之海蛇缠绕 相关内容
雅虎中 Visual Basic 深度下潜之海蛇缠绕 相关内容
Sogou搜索中 Visual Basic 深度下潜之海蛇缠绕 相关内容

相关软件 最新回复帖子:

·AutoCAD打造精致三维鸟笼实例详解
·Photoshop自定义水晶字特效样式
·AutoCAD三维基础实例教程
·PS为黑背景长发美女照片抠图换背
·用Photoshop自制个性摩托车贴花小经验
·轻松几步将美女照片处理为手工素描
·巧用Photoshop画笔轻松绘制创意特效
·用Photoshop通道将模糊肖像照片清晰化
·照片处理:Photoshop修复残破照片
·PS CS2新增形状模糊滤镜绘制花布图案


  相关软件 Visual Basic 深度下潜之海蛇缠绕相关文章
利用VB6.0开发基于IIS的应用程序 VB6中用Oracle数据控件访问Oracle
用Visual Basic6.0实现电影特效 用VB实现“木马”式隐形运行程序
利用Visual Basic操作XML数据 VB COM基础讲座之发布组件
VB COM基础讲座之创建测试程序 改善SQL Server内存管理
Visual Basic小游戏:猜英雄 用VB6.0取得系统信息技巧
VB COM基础讲座之编译的实例选项 VB+VC混合编程疑难问题解
VB COM基础讲座之测试ActiveX EXEs 利用VB6.0设计屏幕保护程序
VB COM基础讲座之ActiveX EXEs Visual Basic COM基础讲座之兼容性
VB COM基础讲座之全面测试 VB COM基础讲座之建立测试程序
VB COM基础讲座之类的测试 Visual Basic的九次蜕变