VB不妨訪問內存
發表時間:2024-02-19 來源:明輝站整理相關軟件相關文章人氣:
[摘要]有人說vb不能操作內存,效率低下,我不是太贊同.vb跟c比當然效率比較低下了,但是如果使用得當還是有不少的效率提高的. 在開發windows上的應用時(注意啊,不是驅動),理論上來說,用vb可以做任何軟件.因為vb本身沒有的,可以使用api,而win32 api時可以實現windows上的...
有人說vb不能操作內存,效率低下,我不是太贊同.vb跟c比當然效率比較低下了,但是如果使用得當還是有不少的效率提高的.
在開發windows上的應用時(注意啊,不是驅動),理論上來說,用vb可以做任何軟件.因為vb本身沒有的,可以使用api,而win32 api時可以實現windows上的任何應用功能的.當然這和使用者的功力有很大的關系,如果c/c++的功力很好,你甚至可以用vb實現內存拷貝的功能,因為long類型可以做指針.
最近在做界面, 對vb有點研究, 給個例子吧.比如10進制轉換2進制.
用vb的一般用除法這么做:
public function o2b(byval long nValue) as string
dim nValueCopy as long
dim nTmp as byte '商
dim sReturn as string '返回值
nValueCopy = nValue
'也有用nValue - 2^N 方式的,這里就不多說了
do while nValueCopy > 0
nTmp = nValueCopy / 2
sReturn = cstr( nValueCopy - nTmp / 2 ) & sReturn '反向累計
nValueCopy = nTmp
loop
o2b = sReturn
end function
而用c比較熟的人一般按位去做:
public function o2b(byref long nValue) as string
dim nBit( 0 to 7 ) as byte ' 最小的單位是byte了,放掩碼
dim nByte( 1 to 4 ) as byte ' 分解nValue到字節的
dim nTmp as byte
dim pValue as long ' 指針
dim sReturn as string ' 返回值
dim i as byte, j as byte
nBit(0) = 1 '00000001
nBit(1) = 2 '00000010
nBit(2) = 4 '00000100
nBit(3) = 8 '00001000
nBit(4) = 16 '00010000
nBit(5) = 32 '00100000
nBit(6) = 64 '01000000
nBit(7) = 128 '10000000
' 取 nValue 的地址
pValue = VarPtr( nValue )
' win32 api, 將nValue的4個字節分別復制到nByte中,byref 就相當于指針
CopyMemory( nByte(1), byref pValue, 4 )
for i = 4 to 1 '低字節在前
for j = 7 to 0 '高位開始
' 方法一, 減法
nTmp = 0
if nByte(i) > nBit(j) then
nByte = nByte(i) - nBit(j)
nTmp = 1 ' 這一位二進制是1
end if
sReturn = sReturn & cstr(nTmp)
' 方法二,按位與 效率更高
nTmp = 1
if ( not ( nByte(i) imp nBit(j) ) ) = nBit(j) then
' 我沒有找到vb按位與的函數,只有按位"同與"(不記得是不是)的imp
nTmp = 0
end if
sReturn = sReturn & cstr(nTmp)
next j, i
o2b = sReturn
end function
在網吧里,沒有環境,隨手寫寫,有錯誤請見諒,主要是思路.