VB之高效字串指针类

时间:2010-01-28 13:49:38  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:变量里放着的BSTR描述符指针可以实现;对于第二个问题,可以用Mid语句(注意是语句而不是函数)来赋值。不详细讲了,直接看下面的这个类:      Option Explicit      '********************************************************   'clsBSTR.cls   '作者: 熊超 ID: AdamBear 2002年3月18日   'http://www.csdn.net/Autho...
  正文:使用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 photoshop/ target=_blank class=infotextkey>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的第二个参数,表示字串的最大字节数,不要让它超过已经分配的内存。

VB之高效字串指针类》由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Language/VB/12556.html


关键字:

关于《VB之高效字串指针类》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td