VB“变态”用法之高效字串指针类

出处:Examlink收集整理 作者:罗志中 日期:2007年06月08日 16时00分
  使用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    
最后更新时间:2008-05-28 11:52:49
文章评论
共有 0 位网友发表了评论
用户名: 新注册) 密码: 匿名评论 [查看所有评论]

评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
您可以用以下几种方式找到此文章

考试全流程