首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 操作系统-> 注册表教程
vb“变态”用法之高效字串指针类_visualbasic教程
作者:网友供稿 点击:0
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
使用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语句),将其设为公有仅为提高效率。

  PublicsStringAsStringBSTR描述符指针

  

  PrivatepStrAsLongBSTR地址

  PrivatenMaxLenAsLongBSTR最大字节数

  
  让本字串指向特定地址

  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的必要,但是它关系到一个有用的技术,下篇文章再谈。

->


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·更改internet explorer的图标
·C#中的类型转换-.NET教程,C#语言
·找回flash的序列号sn
·更改ie的图标
·如何让你的VB6 IDE支持鼠标滚轮(过程)-.NET教程,VB.Net语言
·正则表达式Replace-.NET教程,Asp.Net开发
·Windows 2003下不注册组件用ASP发邮件-ASP教程,邮件相关
·防止ie被恶意修改的初级技巧
·asp.net实现分组全选部分复选框-ASP教程,ASP应用
·清理ie网址列表
最新文章
·seo新手教程:title的写法_seo网站优化
·从注册表下手 切断一切黑客入侵的路径_注册表教程
·用flash 8 as代码写摄像头拍照功能_flash教程
·小站长赚钱思路:ip不到1000,一个月赚940元_网赚技巧
·陈艺光:网络游戏平台与游戏网站实现共赢_站长访谈
·留住访客 如何最优化设计网站的首页?(2)_站长心得
·为什么在google上搜不到我的网页?_google推广
·google的秘密 搜索引擎利用软件的魔力加快奔跑_google推广
·域名与网站排名_站长心得
·怎样避免被搜索引擎视为作弊_站长心得
相关主题
  • vb“变态”用法之有用技术和没用指针_visualbasic教程
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭