vb.net指針釋放的簡(jiǎn)單介紹

如何在VB.net中用程序控制鼠標(biāo)移動(dòng)和點(diǎn)擊

調(diào)用api

成都創(chuàng)新互聯(lián)公司是專業(yè)的浦北網(wǎng)站建設(shè)公司,浦北接單;提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行浦北網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

在Visual Baisc.net中的聲明:

Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)

Public Const MOUSEEVENTF_LEFTDOWN = H2 '模擬鼠標(biāo)左鍵按下

Public Const MOUSEEVENTF_LEFTUP = H4 ’模擬鼠標(biāo)左鍵釋放

Public Const MOUSEEVENTF_MIDDLEDOWN = H20 '模擬鼠標(biāo)中間鍵按下

Public Const MOUSEEVENTF_MIDDLEUP = H40 '模擬鼠標(biāo)中間鍵釋放

Public Const MOUSEEVENTF_RIGHTDOWN = H8 '模擬鼠標(biāo)右鍵按下

Public Const MOUSEEVENTF_RIGHTUP = H10 '模擬鼠標(biāo)右鍵釋放

Public Const MOUSEEVENTF_MOVE = H1 '模擬鼠標(biāo)指針移動(dòng)

例:

mouse_event MOUSEEVENTF_LEFTDOWN,10,10,0,0

'在(10,10)模擬鼠標(biāo)左鍵按下

VBNET如何移動(dòng)記錄集的記錄指針?

可以先對(duì)數(shù)據(jù)庫(kù)中的表數(shù)據(jù)進(jìn)行正序排列,然后打印結(jié)果的時(shí)候?qū)rint放在循環(huán)外。

如:test表中有如下數(shù)據(jù)

現(xiàn)在要用游標(biāo)取出最后一條,也就是“5,孫七”這條。

代碼如下:

declare?@id?int?--定義變量

declare?@name?varchar(10)?--定義變量

declare?cur_c?cursor?for?select?*?from?test?order?by?id?--定義游標(biāo)

open?cur_c?--打開(kāi)游標(biāo)

fetch?next?from?cur_c?into?@id,@name?--取游標(biāo)值到變量

while?@@fetch_status?=?0?--循環(huán)退出條件

begin?--循環(huán)開(kāi)始

fetch?next?from?cur_c?into?@id,@name??--繼續(xù)取游標(biāo)值到變量

end?--循環(huán)結(jié)束

print?cast(@id?as?varchar)+','+@name?--打印最后一條結(jié)果

close?cur_c?--關(guān)閉游標(biāo)

deallocate?cur_c?--釋放游標(biāo)

結(jié)果如圖:

用最簡(jiǎn)單的代碼介紹一下指針在VB.net里面的用法?

例1:以下程序我們申請(qǐng)幾個(gè)指向不同類型的指針:

’使用StructLayout(LayoutKind.Sequential)屬性告訴net編譯器:結(jié)構(gòu)的元素在內(nèi)存中按其出現(xiàn)的順序排列

StructLayout(LayoutKind.Sequential) _

Public Structure DEFUDT_Test

Public bytb As Byte

Public i32a As Int32

End Structure

Public Function fnGetIntptr1() As IntPtr

’取得一個(gè)4字節(jié)數(shù)組指針

Dim tabytTest(3) As Byte

’以下語(yǔ)句告訴net垃圾回收進(jìn)程不對(duì)tabytTest進(jìn)行處理,也就是說(shuō)tabytTest占用的內(nèi)存區(qū)域固定不變。

Dim thObject As GCHandle = GCHandle.Alloc(tabytTest, GCHandleType.Pinned)

Dim tpObject As IntPtr = thObject.AddrOfPinnedObject() ’取得指向字節(jié)數(shù)組的指針

’取得一個(gè)指向32位內(nèi)存數(shù)據(jù)的指針,

’由于使用gchandle取指針的方法只能對(duì)引用的對(duì)象有效,

’所以對(duì)如int32等值類型必須使用將其封裝成為一個(gè)對(duì)象的方法以變?yōu)橐妙愋?/p>

Dim ti32Test As Object = Convert.ToInt32(0)

’以下語(yǔ)句告訴net垃圾回收進(jìn)程不對(duì)ti32test進(jìn)行處理,也就是說(shuō)ti32Test的內(nèi)存位置固定不變。

Dim thObject1 As GCHandle = GCHandle.Alloc(ti32Test, GCHandleType.Pinned)

Dim tpObject1 As IntPtr = thObject1.AddrOfPinnedObject() ’取得ti32Test的首地址

Dim tudtTest1 As DEFUDT_Test

’由于結(jié)構(gòu)是一種值類型變量,為保證指針申請(qǐng)方便,我們申請(qǐng)

’取得一個(gè)和結(jié)構(gòu)tudtTest1大小一致的字節(jié)數(shù)組指針,只要空間占用長(zhǎng)度和結(jié)構(gòu)一樣就可以了

’由于net在結(jié)構(gòu)封裝中會(huì)插入額外的數(shù)據(jù)位,所以一定要用sizeof方法得到結(jié)構(gòu)在非托管使用時(shí)的實(shí)際大小

Dim tudtTest(Marshal.SizeOf(tudtTest1)) As Byte

Dim thObject2 As GCHandle = GCHandle.Alloc(tudtTest, GCHandleType.Pinned)

Dim tpObject2 As IntPtr = thObject2.AddrOfPinnedObject() ’取得指向結(jié)構(gòu)的指針

’在這兒你可以寫(xiě)對(duì)指針處理的任意代碼(在例2中會(huì)給予補(bǔ)充)……

’在使用完畢后一定要釋放指針指向的內(nèi)存塊,讓垃圾回收器可對(duì)這個(gè)內(nèi)存塊回收處理

If thObject.IsAllocated Then

thObject.Free()

End If

If thObject1.IsAllocated Then

thObject1.Free()

End If

If thObject2.IsAllocated Then

thObject2.Free()

End If

End Function

上例中指針流程處理可以歸納為:

1、 定義一個(gè)具有合適內(nèi)存長(zhǎng)度的引用變量(關(guān)于引用變量和值變量的差異可以參觀VB.NET的書(shū)籍)

2、使用GCHandle.Alloc方法將變量的內(nèi)存區(qū)域固定下來(lái)。

3、使用GCHandle對(duì)象的AddrOfPinnedObject取得該內(nèi)存區(qū)域的首地址并賦值給指針變量.

4、對(duì)指針進(jìn)行操作

5、使用GCHandle對(duì)象的free方法釋放指針指向的內(nèi)存區(qū)域以便net垃圾回收器可以回收這個(gè)內(nèi)存空間

2、指針?biāo)赶驍?shù)據(jù)的存取

在.net中,對(duì)指針指向數(shù)據(jù)的存儲(chǔ)函數(shù)都封裝在marshal類中,主要的函數(shù)包括:Copy、PtrToStringUni 、PtrToStructure 、OffsetOf、WriteXXX,RreadXXX等,其中WriteXXX的表示向指針?biāo)硎镜牡刂分袑?xiě)入XXX類型的數(shù)據(jù),而ReadXXX中作用就是將指針?biāo)诘刂返臄?shù)據(jù)以XXX類型方式讀出。看例程2,我們使用這些方法演示對(duì)例1那幾個(gè)指向不同類型數(shù)據(jù)的指針作數(shù)據(jù)存/取操作。

例2:演示向例1申請(qǐng)得到的幾個(gè)指針執(zhí)行寫(xiě)入及讀取數(shù)據(jù)的操作.

Marshal.WriteInt32(tpObject1, 0, Convert.ToInt32(77)) ’向ti32Test變量指向的地址寫(xiě)入32位整數(shù)77

MsgBox("現(xiàn)在ti32Test的值為:" ti32Test) ’因?yàn)樽兞看鎯?chǔ)地址的數(shù)據(jù)已改為77,所以顯示為77

’以下這句之所以可行,因?yàn)閠i32Test是32位整數(shù),而tpObject指向的tabytTest數(shù)組剛好有4個(gè)元素

’而每一個(gè)byte元素都占用8位,合起來(lái)就是32位,和ti32Test占用的空間一樣。這就印證了前面提’

’到的net中指針沒(méi)有指向類型的說(shuō)明。

Marshal.WriteInt32(tpObject, 0, ti32Test)

’以下代碼再將tabytTest字節(jié)數(shù)組的內(nèi)容理解為一個(gè)int32整數(shù),

’并將值賦值給tudtTest結(jié)構(gòu)中的int32元素

’我們使用Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32以取得i32a元素在結(jié)構(gòu)中的內(nèi)存偏移位置

’所以New IntPtr(tpObject2.ToInt32 + Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32)就臨時(shí)產(chǎn)生了

’一個(gè)指針并指向i32a所在的內(nèi)存地址(, 這個(gè)方法也說(shuō)明了指針可以以字節(jié)為單位進(jìn)行加減計(jì)算以指向合適的變量。

’Marshal.ReadInt32的作用是從指針中讀取一個(gè)32整數(shù)。

Marshal.WriteInt32(New IntPtr(tpObject2.ToInt32 + Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32), _

0, Marshal.ReadInt32(tpObject))

’這兒可以將字節(jié)數(shù)組的內(nèi)容復(fù)制到真正的結(jié)構(gòu)中

MsgBox(Marshal.OffsetOf(tudtTest1.GetType, "i32a").ToInt32)

tudtTest1 = CType(Marshal.PtrToStructure(tpObject2, GetType(DEFUDT_Test)), DEFUDT_Test)

MsgBox("結(jié)構(gòu)tidtTest1中i32a元素的值為:" tudtTest1.i32a) ’此處將顯示剛賦的值77

當(dāng)前文章:vb.net指針釋放的簡(jiǎn)單介紹
文章來(lái)源:http://bm7419.com/article2/dohhgoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化品牌網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航網(wǎng)站建設(shè)、虛擬主機(jī)用戶體驗(yàn)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作