网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Visual Basic
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.(空字串)、Null、Empty、与Nothi.
.使用$-类型字符串函数会更快.
.VB编程步步高-打印篇(二).
.VB中调用WindowsAPI的注意事项.
.VB6.0初学者的10个编程小技巧.
.VisualBasic设计图形浏览器示例.
.一组VB应用技巧.
.用VB计算1 1=2.
.如何获得系统光驱的盘符.
.再谈VB程序的加密.
.VisualBasicCOM基础讲座之事件.
.在有剪贴板的应用程序间移动数据.
.VB通用数据表格输出程序的设计.
.VB“超频”秘籍之隐藏的Variant变.
.VisualBasicCOM基础讲座之类的建.
.理解面向对象编程.
.用VB开发CAI软件的小经验.
.VB5.0应用程序的启动与退出设计.
.清除字符串中指定的字符.
.如何使用文件复制对话框.

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

发表日期:2006-2-27


使用VB里的字串类型String有两大不足:第一、它的分配是由VB运行时控制,我们不能将其分配在指定内存处;第二,任何一次对字串的赋值操作都要进行内存重新分配。要实现高效、灵活的字串处理,我们必须克服这两大不足。

  对于第一个问题,通过修改String变量里放着的BSTR描述符指针可以实现;对于第二个问题,可以用Mid语句(注意是语句而不是函数)来赋值。不详细讲了,直接看下面的这个类:
  

  OptionExplicit

  

  '********************************************************

  'clsBSTR.cls

  '作者:熊超ID:AdamBear2002年3月18日

  'http://www.csdn.net/Author/AdamBear

  '你可以自由使用本类模块,不过请保留本声明

  '********************************************************

  

  PrivateDeclareSubCopyMemoryLib"kernel32"Alias"RtlMoveMemory"(DestinationAsAny,SourceAsAny,ByValLengthAsLong)

  

  '不要直接对sString赋值(可以用MID语句),将其设为公有仅为提高效率。

  PublicsStringAsString'BSTR描述符指针

  

  PrivatepStrAsLong'BSTR地址

  PrivatenMaxLenAsLong'BSTR最大字节数

  
  '让本字串指向特定地址

  PublicSubAttach(AddrAsLong,OptionalnLenAsLong)

  pStr=Addr

  '修改BSTR描述符指针,使其指向Addr

  CopyMemoryByValVarPtr(sString),Addr,4

  

  IfIsMissing(nLen)ThenExitSub

  '设定最大字串字节数

  nMaxLen=nLen

  

  EndSub

  

  '还原本字串原BSTR描述符

  PublicSubDetach()

   CopyMemoryByValVarPtr(sString),0&,4

  EndSub

  

  '让本字串指向源字串

  PublicSubAttachStr(sStrAsString)

   AttachStrPtr(sStr),LenB(sStr)

  EndSub

  

  'data为缺省属性

  PublicPropertyLetdata(sValAsString)

   DimcAsLong

   c=LenB(sVal)

   '超过最大字串数,抛出错误。

   Ifc>nMaxLenThenErr.RaisevbObjectError 3000,"CString::LetData","溢出"

   '写字串长度

   CopyMemoryByVal(pStr-4),c,4

   '写字串

   Mid(sString,1)=sVal

  EndProperty

  

  '可以通过公有变量sString来读字串,效率更高

  PublicPropertyGetdata()AsString

   data=sString

  EndProperty

  

  PrivateSubClass_Terminate()

   CallDetach

  EndSub


  用法如下,假设我们已通过VitualAlloc,HeapAlloc,MapViewOfFile这样的内存管理API得到了一个4k个字节的可读写的内存地址baseAddr:

  DimsShareAsNewclsBSTR

  '留下前4个字节用于BSTR保存字串字节数

  sShare.Attach(baseAddr 4,4096-4)

  '下面的字串"Test"会直接写到baseAddr 4字节处

  sShare="Test"

  DimyAsString

  '读字串时可以用sString属性或缺省属性

  y=sShare.sString

  '用AttachStr方法Attach到一个字串。

  '必须要先Detach

  sShare.Detach

  sShare.AttachStr(y)

  sShare="Hahaha"

  Debug.Printy

  '一旦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、它主要的应用还是在于将字串安放在指定内存处。虽然它也可以让同一个进程内几个的字串达到共享的目的,但是如果只是两三个很小的字串这样时做反而慢了。

  后计:

  数组指针和字串指针我们已经谈过了,对于普通的数值类型变量的指针没有什么Hack的必要,但是它关系到一个有用的技术,下篇文章再谈。

->

上一篇:如何编写高质量的VB代码 人气:3484
下一篇:提高VisualBasic访问数据库的效率 人气:3704
浏览全部Visual Basic的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐