自己動(dòng)手改寫VB.NET內(nèi)存指針
學(xué)習(xí)VB.NET時(shí),你可能會(huì)遇到VB.NET內(nèi)存指針問(wèn)題,這里將介紹VB.NET內(nèi)存指針問(wèn)題的解決方法,在這里拿出來(lái)和大家分享一下。近日心血來(lái)潮,花巨資購(gòu)進(jìn)多普達(dá)智能手機(jī)一臺(tái), 系統(tǒng)為微軟的Smartphone2003 ,由于對(duì)"瘟倒死"操作系統(tǒng)的熟悉,很快已步入正軌,各種圖片、程序安裝了一大堆后,開(kāi)始發(fā)揮自己的程序特長(zhǎng),試著為愛(ài)機(jī)寫一個(gè)資源管理器的簡(jiǎn)單程序。
我選擇的編程工具當(dāng)然是Visual Basic NET2003,實(shí)話說(shuō)Microsoft .NET Framework SDK 提供的功能實(shí)在不感恭維,微軟好象又要將所有走上光明大道的.NET程序員拖入API的黑暗時(shí)代,指針、句柄、地址操作,最令人惱火就是沒(méi)有為VB.NET程序做WinCE的API 聲明(令人懷念VB6的API瀏覽器)很快我就在如何啟動(dòng)手機(jī)中的應(yīng)用程序的代碼上困住了,Net沒(méi)有為WinCE提供Process 對(duì)象這種不付責(zé)任的做法害得我好苦??!
開(kāi)始時(shí)聲明時(shí)老是將ShellExecuteEx 和CreateProcess這兩個(gè)熟悉得不能再熟悉的Win32在VB 6中的聲明直接粘到程序中,僅是將VB6的long改為NET的int32,結(jié)果老是報(bào)錯(cuò)。在網(wǎng)上查了N天資料,才發(fā)現(xiàn)原來(lái)Win CE的核心API都是在一個(gè)coredll.dll文件中,使得我差點(diǎn)沒(méi)氣死!還有一點(diǎn)是SHELLEXECUTEINFO結(jié)構(gòu)中的lpFile這種指向字符串常量的指針由于字符的編碼問(wèn)題不能象在Win32編程中簡(jiǎn)單聲明為String類型,所在必須聲明為Intptr,這樣問(wèn)題就出現(xiàn)了,使用 ShellExecuteEx函數(shù)必須使用微軟在VB.NET中不直接提供的指針操作,所以我只好根據(jù)網(wǎng)上的資料改寫了一個(gè)對(duì)VB.NET內(nèi)存指針的封裝類,詳細(xì)代碼及解釋如下(新建一個(gè)模塊,將以下代碼粘貼進(jìn)去即可使用):
- Imports System.Runtime.InteropServices '引及Net框架中對(duì)底層操作支持的命名空間
- Public Class clsDAMSMobileMarshal '我寫的內(nèi)存管理類
- #Region "與內(nèi)存有關(guān)的API聲明"
- REM 以下是與內(nèi)存有關(guān)的移動(dòng)設(shè)備API
- Public Declare Function LocalAlloc Lib "coredll.dll" Alias "LocalAlloc"
(ByVal wFlags As Int32, _ByVal wBytes As Int32) As IntPtr- Public Declare Function LocalFree Lib "coredll.dll" Alias "LocalFree"
(ByVal hMem As Int32) As Int32- Public Declare Function LocalLock Lib "coredll.dll" Alias "LocalLock"
(ByVal hMem As Int32) As Int32- Public Declare Function LocalReAlloc Lib "coredll.dll" Alias "LocalReAlloc"
(ByVal hMem As IntPtr, _ByVal wBytes As Int32, ByVal wFlags As Int32) As IntPtr- #End Region
- #Region "API常量聲明"
- Public Const LMEM_FIXED = 0
- Public Const LMEM_MOVEABLE = &H2
- Public Const LMEM_ZEROINIT = &H40
- Public Const LPTR = LMEM_FIXED Or LMEM_ZEROINIT
- #End Region
- Public Shared Function fnAllocHLocal(ByVal ni_i32Size As Int32) As IntPtr
- '申請(qǐng)本地內(nèi)存,返回一個(gè)指向該內(nèi)存塊的指針
- Return LocalAlloc(LPTR, ni_i32Size)
- End Function
- Public Shared Function fnFreeHLocal(ByRef ni_pLocal As IntPtr) As Int32
- REM 釋放指定的內(nèi)存塊柄
- Dim ti32FunctionReturnValue As Int32
- If ni_pLocal.Equals(IntPtr.Zero) = False Then
- ti32FunctionReturnValue = (LocalFree(ni_pLocal.ToInt32))
- If ti32FunctionReturnValue = 0 Then
- ni_pLocal = IntPtr.Zero
- End If
- End If
- Return (ti32FunctionReturnValue)
- End Function
- Public Shared Function fnReAllocHLocal
(ByVal ni_pIn As IntPtr, ByVal ni_i32Size As Int32) As IntPtr- '對(duì)指定的內(nèi)存塊重新定義大小
- Return LocalReAlloc(ni_pIn, ni_i32Size, LMEM_MOVEABLE)
- End Function
- Public Shared Function fnStringToHLocalUni(ByVal ni_strIn As String) As IntPtr
- '將指定的字符串復(fù)制到一個(gè)內(nèi)存塊中,并返回該內(nèi)存塊的指針,這個(gè)指針必須使用fnFreeHLocal函數(shù)釋放
- Dim ti32StringBufLength As Int32
- Dim tpTempA As IntPtr
- If Not (ni_strIn Is Nothing) Then
- If ni_strIn.Length = 0 Then
- Return IntPtr.Zero
- Else
- ti32StringBufLength = (ni_strIn.Length + 1) * 2 ' 包括***一個(gè)中止字符
- tpTempA = fnAllocHLocal(ti32StringBufLength)
- If tpTempA.Equals(IntPtr.Zero) = False Then '申請(qǐng)內(nèi)存成功
- Marshal.Copy(ni_strIn.ToCharArray, 0, tpTempA, ni_strIn.Length)
- Return tpTempA
- End If
- End If
- End If
- End Function
- End Class
【編輯推薦】