学习VB.NET时,你可能会遇到VB.NET内存指针问题,这里将介绍VB.NET内存指针问题的解决方法,在这里拿出来和大家分享一下。近日心血来潮,花巨资购进多普达智能手机一台, 系统为微软的Smartphone2003 ,由于对"瘟倒死"操作系统的熟悉,很快已步入正轨,各种图片、程序安装了一大堆后,开始发挥自己的程序特长,试着为爱机写一个资源管理器的简单程序。

目前创新互联已为1000+的企业提供了网站建设、域名、网站空间、网站改版维护、企业网站设计、阳城网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
我选择的编程工具当然是Visual Basic NET2003,实话说Microsoft .NET Framework SDK 提供的功能实在不感恭维,微软好象又要将所有走上光明大道的.NET程序员拖入API的黑暗时代,指针、句柄、地址操作,最令人恼火就是没有为VB.NET程序做WinCE的API 声明(令人怀念VB6的API浏览器)很快我就在如何启动手机中的应用程序的代码上困住了,Net没有为WinCE提供Process 对象这种不付责任的做法害得我好苦啊!
开始时声明时老是将ShellExecuteEx 和CreateProcess这两个熟悉得不能再熟悉的Win32在VB 6中的声明直接粘到程序中,仅是将VB6的long改为NET的int32,结果老是报错。在网上查了N天资料,才发现原来Win CE的核心API都是在一个coredll.dll文件中,使得我差点没气死!还有一点是SHELLEXECUTEINFO结构中的lpFile这种指向字符串常量的指针由于字符的编码问题不能象在Win32编程中简单声明为String类型,所在必须声明为Intptr,这样问题就出现了,使用 ShellExecuteEx函数必须使用微软在VB.NET中不直接提供的指针操作,所以我只好根据网上的资料改写了一个对VB.NET内存指针的封装类,详细代码及解释如下(新建一个模块,将以下代码粘贴进去即可使用):
- Imports System.Runtime.InteropServices '引及Net框架中对底层操作支持的命名空间
 - Public Class clsDAMSMobileMarshal '我写的内存管理类
 - #Region "与内存有关的API声明"
 - REM 以下是与内存有关的移动设备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
 - '申请本地内存,返回一个指向该内存块的指针
 - Return LocalAlloc(LPTR, ni_i32Size)
 - End Function
 - Public Shared Function fnFreeHLocal(ByRef ni_pLocal As IntPtr) As Int32
 - REM 释放指定的内存块柄
 - 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- '对指定的内存块重新定义大小
 - Return LocalReAlloc(ni_pIn, ni_i32Size, LMEM_MOVEABLE)
 - End Function
 - Public Shared Function fnStringToHLocalUni(ByVal ni_strIn As String) As IntPtr
 - '将指定的字符串复制到一个内存块中,并返回该内存块的指针,这个指针必须使用fnFreeHLocal函数释放
 - 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 ' 包括***一个中止字符
 - tpTempA = fnAllocHLocal(ti32StringBufLength)
 - If tpTempA.Equals(IntPtr.Zero) = False Then '申请内存成功
 - Marshal.Copy(ni_strIn.ToCharArray, 0, tpTempA, ni_strIn.Length)
 - Return tpTempA
 - End If
 - End If
 - End If
 - End Function
 - End Class
 
                网页题目:自己动手改写VB.NET内存指针
                
                文章链接:http://www.csdahua.cn/qtweb/news13/215213.html
            
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网