您的位置:逆风者 VB 正文
原作者:www.upwinder.com 添加时间:2007-09-12 原文发表:2007-08-31 人气:55 来源:未知

本文章共2081字,分2页,当前第1页,快速翻页:
 
  使用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时会出错。
 

本文章更多内容1 - 2 - 下一页>>
相关文章

Visual Basic代码优化的六条军规
使用Objptr函数快速查找集合中的对象
使用ObjPtr检测2个对象变量是否指向同一对象
重定义编译DLL文件的基地址
你真正理解 Allow Unrounded Floating Poin
固定长度字符串数组:赋值快,释放快!
快速清除数组部分内容
创建新表时,快速拷贝字段
用InStr函数实现代码减肥
静态变量慢于动态变量
如何去优化你的VB程序
字体对象克隆招法
Friend过程快于Public过程
如何编写高质量的VB代码
提高Visual Basic访问数据库效率
在数据库中不用 EOF 以加快记录循环
提高Visual Basic访问数据库的效率
VB“超频”秘籍之给字符串提速
读取文件内容的简洁方法
快速调入TreeView控件以及ListView控件的子

相关评论


本文章所属分类:首页 VB

  热门关键字: