程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> VB“變態”用法之有用技術和沒用指針

VB“變態”用法之有用技術和沒用指針

編輯:VB綜合教程
BillMcCarthy在那篇《ModifyaVarialbe'sPointer》裡用SafeArray實現多進程的數組共享內存,他考慮了數組變量的類型,因此可以兼容大部分數值類型的數組,是一個非常不錯的東西。我這裡不講它實現的具體方法,只是想和大家一起看看SafeArray還能做什麼。
  
  修改SafeArray結構的pvData指針卻是一個非常有用的技術,通過修改pvData,就能夠通過數組直接訪問指定的內存。
  
  和上一篇文章包裝字串指針類一樣,通過修改pvData,我們也可以包裝一些普通數值類型變量的指針類。
  
  我在指針的第一篇文章裡說過,要想實現C語言裡'*'這個取指針所指變量值功能,必須要用CopyMemory。實際上,我說錯了,我們完全可以實現和C裡一樣的指針,如下:
  
  ->//C語言
  LongL;
  Long*pL=&L;
  *pL=12;
  printf("L=d*pL=d",l,*pl);
  'VB裡
  DimpLAsNewpLong,LAsLong
  pL.AttachL
  '也可以pL.Ptr=VarPtr(L)
  pL=12
  Debug.Print"L=";L;"*pL=";pL->
  結果都能夠通過修改pL指針,達到修改變量L的目的。
  
  上面VB代碼裡的pLong就是一個包裝好的Long型變量的指針類,下面看看如何來實現它:
  
  ->OptionExplicit
  '********************************************************
  'pLong.cls
  '包裝一個Long型指針的類
  '作者:熊超ID:AdamBear2002年3月18日
  'http://www.csdn.net/Author/AdamBear
  '你可以自由使用本類模塊,不過請保留本聲明
  '********************************************************
  
  PrivateDeclareSubCopyMemoryLib"kernel32"Alias"RtlMoveMemory"(DestinationAsAny,SourceAsAny,ByValLengthAsLong)
  
  Privatem_Arr(0)AsLong
  
  
  '缺省屬性
  PublicPropertyGetData()AsLong
  Data=m_Arr(0)
  EndProperty
  
  PublicPropertyLetData(ByValValueAsLong)
  m_Arr(0)=Value
  EndProperty
  
  PublicSubAttach(TargetAsLong)
  Ptr=VarPtr(Target)
  EndSub
  
  PublicPropertyLetPtr(ByValTargetAsLong)
  DimpSAAsLong
  
  '得到SafeArray結構指針pSA
  CopyMemorypSA,ByValVarPtrArray(m_Arr),4
  '這個指針偏移12個字節後就是pvData指針
  CopyMemoryByVal(pSA 12),Target,4
  
  EndProperty
  
  PublicPropertyGetPtr()AsLong
  Ptr=m_SA.pvData
  EndProperty
  
  
  PrivateSubClass_Terminate()
  CopyMemoryByValVarPtrArray(m_Arr),0&,4
  EndSub->
  要將它改成Byte的指針類,只需要將上面的代碼中m_Arr數組的類型,Data屬性和Attach方法中的參數類型改為Byte型即可。
  
  當我們這樣做出pLong、pByte、pInteger後,我們就能夠玩點和C裡一樣的花樣了。
  
  ->SubMain()
  DimpBAsNewpByte,BAsByte
  DimpIAsNewpInteger,IAsInteger
  DimpLAsNewpLong,LAsLong
  
  '用Attach方法將經過類型檢查,直接用Ptr屬性則可以繞過類型檢查
  pB.AttachB
  pI.AttachI
  pL.AttachL
  
  '試試指針
  B=1
  Debug.Print"B=";B;"*pB=";pB
  
  pB=1
  Debug.Print"B=";B;"*pB=";pB
  
  I=1000
  Debug.Print"I=";I;"*pI=";pI
  
  pI=2000
  Debug.Print"I=";I;"*pI=";pI
  
  L=40000
  Debug.Print"L=";L;"*pL=";pL
  
  pL=60000
  Debug.Print"L=";L;"*pL=";pL
  
  '試試C裡的類型轉換
  '用Integer指針訪問Long型變量
  pI.Ptr=VarPtr(L)
  Debug.Print"*pI=";pI
  
  EndSub->
  搞出這幾種普通數值類型的指針類有什麼用?基本上沒有什麼大用。不過是證明一種方法的可行性,和演示技術。這種技術還有什麼用,需要的時候還會再談。->

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved