全面攻略VB.NET指针应用

经过长时间学习VB.NET,于是和大家分享一下VB.NET指针应用,看完本文你肯定有不少收获,希望本文能教会你更多东西。VB里使用指针不象C里那样灵活,用指针处理数据时都需要用CopyMemory将数据在指针和VB能够处理的变量之间来回拷贝,这需要很大的额外开销。因此不是所有C里的指针操作都可以移值到VB里来,我们只应在需要的时候才在VB里使用指针。

目前创新互联建站已为上千家的企业提供了网站建设、域名、网络空间、网站托管、服务器托管、企业网站设计、自贡网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

1、VB.NET指针应用动态内存分配:完全不可能、可能但不可行,VB标准

在C和C++里频繁使用指针的一个重要原因是需要使用动态内存分配,用Malloc或New来从堆栈里动态分配内存,并得到指向这个内存的指针。在VB里我们也可以自己用API来实现动态分配内存,并且实现象C里的指针链表。

但我们不可能象C那样直接用指针来访问这样动态分配的内存,访问时我们必须用CopyMemory将数据拷贝到VB的变量内,大量的使用这种技术必然会降低效率,以至于要象C那样用指针来使用动态内存根本就没有可行性。要象C、PASCAL那样实现动态数据结构,在VB里还是应该老老实实用对象技术来实现。

#T#本文配套代码中的LinkedList里有完全用指针实现的链表,它是使用HeapAlloc从堆栈中动态分配内存,另有一个调用FindFirstUrlCacheEntry这个API来操作IE的Cache的小程序IECache,它使用了VirtualAlloc来动态分配内存。但实际上这都不是必须的,VB已经为我们提供了标准的动态内存分配的方法,那就是:对象、字符串和字节数组限于篇幅,关于对象的技术这里不讲,LinkedList的源代码里有用对象实现的链表,你可以参考。字符串可以用Space$函数来动态分配,VB的文档里就有详细的说明。关于字节数组,这里要讲讲,它非常有用。我们可用Redim来动态改变它的大小,并将指向它***个元素的指针传给需要指针的API,如下:

 
 
  1. dim ab() As Byte , ret As long  
  2. '传递Null值API会返回它所需要的缓冲区的长度。  
  3. ret = SomeApiNeedsBuffer(vbNullString)  
  4. '动态分配足够大小的内存缓冲区  
  5. ReDim ab(ret) As Byte  
  6. '再次把指针传给API,此时传字节数组***个元素的指针。  
  7. SomeApiNeedsBuffer(ByVal VarPtr(ab(1))) 

在本文配套程序中的IECache中,我也提供了用字节数组来实现动态分配缓冲区的版本,比用VirtualAlloc来实现更安全更简单。

2、VB.NET指针应用突破限制

下面是一个突破VB类型检查来实现特殊功能的经典应用,出自Bruce Mckinney的《HardCore Visual Basic》一书。

将一个Long长整数的低16位作为Interger型提取出来,

 
 
  1. '标准的方法,也是高效的方法,但不容易理解。  
  2. Function LoWord(ByVal dw As Long) As Integer  
  3. If dw And &H8000& Then  
  4. LoWord = dw Or &HFFFF0000  
  5. Else  
  6. LoWord = dw And &HFFFF&  
  7. End If  
  8. End Function  
  9.  
  10. '用指针来做效率虽不高,但思想清楚。  
  11. Function LoWord(ByVal dw As Long) As Integer  
  12. CopyMemory ByVal VarPtr(LoWord), ByVal VarPtr(dw), 2  
  13. End Function  

当前题目:全面攻略VB.NET指针应用
文章来源:http://www.gawzjz.com/qtweb/news41/175291.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联