首页 | 互联网 | IT动态 | 网络设备 | 服务器 | IDC | 安全 | Cisco | Windows | Linux | Java | .Net | Oracle | CIW | 华为 | 专题
IT技术 | 网页设计 | 平面设计 | 电子书下载 | 教学视频 | 方案 | 数字网校 | 直播室 | 虚拟考场 | 面授培训 | 搜索 | 博客 | 沙龙 | 论坛
首页 | JAVA | C# | VB | VB.NET | C/C++ | delphi | 工程管理 | 其他语言 | 论坛
免费注册一站通帐号,参与直播、论坛、下载、博客、网摘、评论,展现我的风采!
您现在的位置: 中国IT实验室 >> 桌面开发 >> VB >> 文章正文
VB“变态”用法之高效字串指针类
来源:中国IT实验室整理  时间:2007-4-4

  使用VB里的字串类型String有两大不足:第一、它的分配是由VB运行时控制,我们不能将其分配在指定内存处;第二,任何一次对字串的赋值操作都要进行内存重新分配。要实现高效、灵活的字串处理,我们必须克服这两大不足。
  
  对于第一个问题,通过修改String变量里放着的BSTR描述符指针可以实现;对于第二个问题,可以用Mid语句(注意是语句而不是函数)来赋值。不详细讲了,直接看下面的这个类:
  
  Option Explicit
  
  '********************************************************
  'clsBSTR.cls
  '作者: 熊超 ID: AdamBear 2002年3月18日
  'http://www.csdn.net/Author/AdamBear
  ' 你可以自由使用本类模块,不过请保留本声明
  '********************************************************
  
  Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
  
  '不要直接对sString赋值(可以用MID语句),将其设为公有仅为提高效率。
  Public sString As String 'BSTR描述符指针
  
  Private pStr As Long 'BSTR地址
  Private nMaxLen As Long 'BSTR最大字节数
  
  '让本字串指向特定地址
  Public Sub Attach(Addr As Long, Optional nLen As Long)
  pStr = Addr
  '修改BSTR描述符指针,使其指向Addr
  CopyMemory ByVal VarPtr(sString), Addr, 4
  
  If IsMissing(nLen) Then Exit Sub
  '设定最大字串字节数
  nMaxLen = nLen
  
  End Sub
  
  '还原本字串原BSTR描述符
  Public Sub Detach()
  CopyMemory ByVal VarPtr(sString), 0&, 4
  End Sub
  
  '让本字串指向源字串
  Public Sub AttachStr(sStr As String)
  Attach StrPtr(sStr), LenB(sStr)
  End Sub
  
  'data为缺省属性
  Public Property Let data(sVal As String)
  Dim c As Long
  c = LenB(sVal)
  '超过最大字串数,抛出错误。
  If c > nMaxLen Then Err.Raise vbObjectError + 3000, "CString::Let Data", "溢出"
  '写字串长度
  CopyMemory ByVal (pStr - 4), c, 4
  '写字串
  Mid(sString, 1) = sVal
  End Property
  
  '可以通过公有变量sString来读字串,效率更高
  Public Property Get data() As String
  data = sString
  End Property
  
  Private Sub Class_Terminate()
  Call Detach
  End Sub
  
  用法如下,假设我们已通过VitualAlloc,HeapAlloc,MapViewOfFile这样的内存管理API得到了一个4k个字节的可读写的内存地址baseAddr:
  
  Dim sShare As New clsBSTR
  '留下前4个字节用于BSTR保存字串字节数
  sShare.Attach(baseAddr+4, 4096-4)
  '下面的字串"Test"会直接写到baseAddr+4字节处
  sShare = "Test"
  Dim y As String
  '读字串时可以用sString属性或缺省属性
  y = sShare.sString
  '用AttachStr方法Attach到一个字串。
  '必须要先Detach
  sShare.Detach
  sShare.AttachStr(y)
  sShare = "Hahaha"
  Debug.Print y
  '一旦AttachStr到字串y后,对sShare的修改就相当于对y的修改。
  '并且以后对y的修改也只能用Mid语句
  Mid(y, 1) = "xxxxx"
  '不能直接赋值,这样VB会将原来y所指(也是sShare所指)内存释放,
  ' 重新分配y。这样在访问sShare时会出错。
  'y = "Test"
  
  使用这个类有几个需要注意的地方。
  
  1、读字串时可以用sString属性来读,更快。
  
  读sShare有两种方法,一种是用缺省属性Data来读,一种是直接用sString属性来读。用sString属性不重新分配内存,要快得多。
  
  2、不要直接给sString赋值,应使用缺省的data属性来赋值。
  
  之所以把sString属性暴露出来,是为了效率和方便。我们可以用Mid语句对其进行修改,但不要直接用"="来赋值。
  
  3、注意Attach的第二个参数,表示字串的最大字节数,不要让它超过已经分配的内存。
  
  4、用AttachStr将本字串对象Attach到某个字串(比如上面的y)上后,不能再对这个字串y重新赋值,也不能将其传递到会对其重新赋值的过程。
  
  这么多需要注意的问题,用起来岂不是更不方便。的确,用它的之前要考虑是不是必须的。因为建立这个类也一样有开销。所以还有一个需要注意的问题:
  
  5、它主要的应用还是在于将字串安放在指定内存处。虽然它也可以让同一个进程内几个的字串达到共享的目的,但是如果只是两三个很小的字串这样时做反而慢了。
【责编:Lili】

中国IT教育热线咨询

相关文章
解析VB的事件驱动编程
编写快速高效的VB程序
c/c++中指针学习的两个绝好例子
VB中运用反射原理优化程序代码
VB中数据集合对象的应用
递归过程在VB中的应用实例
VB/VB.NET/C#导出到Excel的方法
关于Visual Basic 9.0的动态标识符
推荐文章
· 用C#创建COM对象
· IT管理十大失误及其对策
· VC中利用MFC设计绘图程序初步
· JAVA中对象创建和初始化过程
· C语言中的位域的使用
· 浅谈Java桌面应用程序开发
· C#的前途如何?
· 几种VC++数据库开发技术的相对比较
 精彩友情推荐
·锐捷交换机报价
·锐捷交换机
·锐捷网络网络交换机
·smc交换机
·smc交换机报价
·IDC资讯大全
·机房品质万里行
·IDC托管必备知识
·全国IDC报价
·网站推广优化
最新更新 推荐文章
·Visual Basic 9.0隐式类型的局部…09-30
·JMX+J2SE5.0实现Web应用的安全管…09-30
·多线程、Socket技术及委托技术的…09-21
·Visual C#多线程参数传递浅析09-21
·浅谈Java中利用JCOM实现仿Excel编…09-21
·基于Java的界面布局DSL的设计与实…09-21
·Java开发中的事件驱动模型实例详…09-21
·并发工程原则应用到软件项目中09-06
·Delphi初学者应小心的六大陷阱09-06
·VC开发多语言界面支持的简单方法09-06
·用C#创建COM对象09-06
·用C#创建COM对象09-06
·IT管理十大失误及其对策08-30
·VC中利用MFC设计绘图程序初步08-23
·JAVA中对象创建和初始化过程08-23
·C语言中的位域的使用08-09
·浅谈Java桌面应用程序开发08-09
·C#的前途如何?08-02
·几种VC++数据库开发技术的相对比较07-12
·用Visual C#实现网络封包监视07-12
·VB.NET中的TextBox控件详解07-12
·VB.NET实现PC与掌上电脑PPC的双向通信07-05
  培训中心