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->
搞出這幾種普通數值類型的指針類有什麼用?基本上沒有什麼大用。不過是證明一種方法的可行性,和演示技術。這種技術還有什麼用,需要的時候還會再談。->