調用api
成都創(chuàng)新互聯公司是專業(yè)的浦北網站建設公司,浦北接單;提供成都網站設計、成都網站建設,網頁設計,網站設計,建網站,PHP網站建設等專業(yè)做網站服務;采用PHP框架,可快速的進行浦北網站開發(fā)網頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網站,專業(yè)的做網站團隊,希望更多企業(yè)前來合作!
在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 '模擬鼠標左鍵按下
Public Const MOUSEEVENTF_LEFTUP = H4 ’模擬鼠標左鍵釋放
Public Const MOUSEEVENTF_MIDDLEDOWN = H20 '模擬鼠標中間鍵按下
Public Const MOUSEEVENTF_MIDDLEUP = H40 '模擬鼠標中間鍵釋放
Public Const MOUSEEVENTF_RIGHTDOWN = H8 '模擬鼠標右鍵按下
Public Const MOUSEEVENTF_RIGHTUP = H10 '模擬鼠標右鍵釋放
Public Const MOUSEEVENTF_MOVE = H1 '模擬鼠標指針移動
例:
mouse_event MOUSEEVENTF_LEFTDOWN,10,10,0,0
'在(10,10)模擬鼠標左鍵按下
可以先對數據庫中的表數據進行正序排列,然后打印結果的時候將print放在循環(huán)外。
如:test表中有如下數據
現在要用游標取出最后一條,也就是“5,孫七”這條。
代碼如下:
declare?@id?int?--定義變量
declare?@name?varchar(10)?--定義變量
declare?cur_c?cursor?for?select?*?from?test?order?by?id?--定義游標
open?cur_c?--打開游標
fetch?next?from?cur_c?into?@id,@name?--取游標值到變量
while?@@fetch_status?=?0?--循環(huán)退出條件
begin?--循環(huán)開始
fetch?next?from?cur_c?into?@id,@name??--繼續(xù)取游標值到變量
end?--循環(huán)結束
print?cast(@id?as?varchar)+','+@name?--打印最后一條結果
close?cur_c?--關閉游標
deallocate?cur_c?--釋放游標
結果如圖:
例1:以下程序我們申請幾個指向不同類型的指針:
’使用StructLayout(LayoutKind.Sequential)屬性告訴net編譯器:結構的元素在內存中按其出現的順序排列
StructLayout(LayoutKind.Sequential) _
Public Structure DEFUDT_Test
Public bytb As Byte
Public i32a As Int32
End Structure
Public Function fnGetIntptr1() As IntPtr
’取得一個4字節(jié)數組指針
Dim tabytTest(3) As Byte
’以下語句告訴net垃圾回收進程不對tabytTest進行處理,也就是說tabytTest占用的內存區(qū)域固定不變。
Dim thObject As GCHandle = GCHandle.Alloc(tabytTest, GCHandleType.Pinned)
Dim tpObject As IntPtr = thObject.AddrOfPinnedObject() ’取得指向字節(jié)數組的指針
’取得一個指向32位內存數據的指針,
’由于使用gchandle取指針的方法只能對引用的對象有效,
’所以對如int32等值類型必須使用將其封裝成為一個對象的方法以變?yōu)橐妙愋?/p>
Dim ti32Test As Object = Convert.ToInt32(0)
’以下語句告訴net垃圾回收進程不對ti32test進行處理,也就是說ti32Test的內存位置固定不變。
Dim thObject1 As GCHandle = GCHandle.Alloc(ti32Test, GCHandleType.Pinned)
Dim tpObject1 As IntPtr = thObject1.AddrOfPinnedObject() ’取得ti32Test的首地址
Dim tudtTest1 As DEFUDT_Test
’由于結構是一種值類型變量,為保證指針申請方便,我們申請
’取得一個和結構tudtTest1大小一致的字節(jié)數組指針,只要空間占用長度和結構一樣就可以了
’由于net在結構封裝中會插入額外的數據位,所以一定要用sizeof方法得到結構在非托管使用時的實際大小
Dim tudtTest(Marshal.SizeOf(tudtTest1)) As Byte
Dim thObject2 As GCHandle = GCHandle.Alloc(tudtTest, GCHandleType.Pinned)
Dim tpObject2 As IntPtr = thObject2.AddrOfPinnedObject() ’取得指向結構的指針
’在這兒你可以寫對指針處理的任意代碼(在例2中會給予補充)……
’在使用完畢后一定要釋放指針指向的內存塊,讓垃圾回收器可對這個內存塊回收處理
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、 定義一個具有合適內存長度的引用變量(關于引用變量和值變量的差異可以參觀VB.NET的書籍)
2、使用GCHandle.Alloc方法將變量的內存區(qū)域固定下來。
3、使用GCHandle對象的AddrOfPinnedObject取得該內存區(qū)域的首地址并賦值給指針變量.
4、對指針進行操作
5、使用GCHandle對象的free方法釋放指針指向的內存區(qū)域以便net垃圾回收器可以回收這個內存空間
2、指針所指向數據的存取
在.net中,對指針指向數據的存儲函數都封裝在marshal類中,主要的函數包括:Copy、PtrToStringUni 、PtrToStructure 、OffsetOf、WriteXXX,RreadXXX等,其中WriteXXX的表示向指針所表示的地址中寫入XXX類型的數據,而ReadXXX中作用就是將指針所在地址的數據以XXX類型方式讀出??蠢?,我們使用這些方法演示對例1那幾個指向不同類型數據的指針作數據存/取操作。
例2:演示向例1申請得到的幾個指針執(zhí)行寫入及讀取數據的操作.
Marshal.WriteInt32(tpObject1, 0, Convert.ToInt32(77)) ’向ti32Test變量指向的地址寫入32位整數77
MsgBox("現在ti32Test的值為:" ti32Test) ’因為變量存儲地址的數據已改為77,所以顯示為77
’以下這句之所以可行,因為ti32Test是32位整數,而tpObject指向的tabytTest數組剛好有4個元素
’而每一個byte元素都占用8位,合起來就是32位,和ti32Test占用的空間一樣。這就印證了前面提’
’到的net中指針沒有指向類型的說明。
Marshal.WriteInt32(tpObject, 0, ti32Test)
’以下代碼再將tabytTest字節(jié)數組的內容理解為一個int32整數,
’并將值賦值給tudtTest結構中的int32元素
’我們使用Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32以取得i32a元素在結構中的內存偏移位置
’所以New IntPtr(tpObject2.ToInt32 + Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32)就臨時產生了
’一個指針并指向i32a所在的內存地址(, 這個方法也說明了指針可以以字節(jié)為單位進行加減計算以指向合適的變量。
’Marshal.ReadInt32的作用是從指針中讀取一個32整數。
Marshal.WriteInt32(New IntPtr(tpObject2.ToInt32 + Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32), _
0, Marshal.ReadInt32(tpObject))
’這兒可以將字節(jié)數組的內容復制到真正的結構中
MsgBox(Marshal.OffsetOf(tudtTest1.GetType, "i32a").ToInt32)
tudtTest1 = CType(Marshal.PtrToStructure(tpObject2, GetType(DEFUDT_Test)), DEFUDT_Test)
MsgBox("結構tidtTest1中i32a元素的值為:" tudtTest1.i32a) ’此處將顯示剛賦的值77
當前文章:vb.net指針釋放的簡單介紹
文章來源:http://www.rwnh.cn/article2/dohhgoc.html
成都網站建設公司_創(chuàng)新互聯,為您提供關鍵詞優(yōu)化、品牌網站建設、網站導航、網站建設、虛擬主機、用戶體驗
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯