代碼實(shí)現(xiàn)VB.NET Smartphone進(jìn)程啟動(dòng)案例
學(xué)習(xí)VB.NET Smartphone時(shí),你可能會(huì)遇到VB.net實(shí)現(xiàn)Smartphone中進(jìn)程啟動(dòng)問(wèn)題,這里將介紹VB.NET Smartphone進(jìn)程啟動(dòng)問(wèn)題的解決方法,在這里拿出來(lái)和大家分享一下。開(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)氣死!
#T#還有一點(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è)VB.net對(duì)內(nèi)存指針的封裝類,詳細(xì)VB.NET Smartphone代碼及解釋如下(新建一個(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
 - 有了這個(gè)輔助函數(shù),以下的API調(diào)用就簡(jiǎn)單了,只需正確聲明即可,以下是ShellExecuteEx及CreateProcess涵數(shù)及其結(jié)構(gòu)的正確聲明(同樣是將代碼粘貼到一個(gè)新建模塊中即可調(diào)用):
 - imports System.Runtime.InteropServices
 - REM API常數(shù)聲明-------------------------
 - Public Const SW_SHOWNORMAL = 1
 - Public Const gcNORMAL_PRIORITY_CLASS = &H20
 - Public Const gcINFINITE = &HFFFF
 - Public Const WAIT_TIMEOUT = &H102&
 - #Region "Structure SHELLEXECUTEINFO"
 - <StructLayout(LayoutKind.Sequential)> _
 - Structure SHELLEXECUTEINFO
 - Public cbSize As Int32
 - Public fMask As Int32
 - Public hwnd As IntPtr
 - Public lpVerb As IntPtr 'LPCTSTR,這種類型不能聲明為string,只可以老老實(shí)實(shí)聲明為Intptr
 - Public lpFile As IntPtr 'LPCTSTR,這種類型不能聲明為string,只可以老老實(shí)實(shí)聲明為Intptr
 - Public lpParameters As IntPtr 'LPCTSTR,這種類型不能聲明為string,只可以老老實(shí)實(shí)聲明為Intptr
 - Public lpDirectory As IntPtr 'LPCTSTR,這種類型不能聲明為string,只可以老老實(shí)實(shí)聲明為Intptr
 - Public nShow As Int32
 - Public hInstApp As IntPtr
 - 'Optional members
 - Public lpIDList As IntPtr 'LPVOID
 - Public lpClass As IntPtr 'LPCTSTR
 - Public hkeyClass As Int32
 - Public dwHotKey As Int32
 - Public hIcon As Int32
 - Public hProcess As IntPtr
 - Public Sub Dispose()
 - '在調(diào)用后釋放結(jié)構(gòu)中的內(nèi)存塊
 - clsDAMSMobileMarshal.fnFreeHLocal(Me.lpVerb)
 - clsDAMSMobileMarshal.fnFreeHLocal(Me.lpFile)
 - clsDAMSMobileMarshal.fnFreeHLocal(Me.lpParameters)
 - clsDAMSMobileMarshal.fnFreeHLocal(Me.lpDirectory)
 - End Sub
 - End Structure
 - #End Region
 - #Region "Structure STARTUPINFO"
 - <StructLayout(LayoutKind.Sequential)> _
 - Public Structure STARTUPINFO
 - Public cb As Int32
 - Public lpReserved As IntPtr
 - Public lpDesktop As IntPtr
 - Public lpTitle As IntPtr
 - Public dwX As Int32
 - Public dwY As Int32
 - Public dwXSize As Int32
 - Public dwYSize As Int32
 - Public dwXCountChars As Int32
 - Public dwYCountChars As Int32
 - Public dwFillAttribute As Int32
 - Public dwFlags As Int32
 - Public wShowWindow As Int16
 - Public cbReserved2 As Int16
 - Public lpReserved2 As Int32
 - Public hStdInput As Int32
 - Public hStdOutput As Int32
 - Public hStdError As Int32
 - End Structure
 - #End Region
 - #Region "Structure PROCESS_INFORMATION"
 - <StructLayout(LayoutKind.Sequential)> _
 - Public Structure PROCESS_INFORMATION
 - Public hProcess As IntPtr
 - Public hThread As IntPtr
 - Public dwProcessId As Int32
 - Public dwThreadId As Int32
 - End Structure
 - #End Region
 - REM api函數(shù)聲明
 - #Region "Function CreateProcess"
 - public Overloads Declare Function CreateProcess Lib "coredll.dll" (ByVal imageName As String, _
 - ByVal cmdLine As String, _
 - ByVal lpProcessAttributes As IntPtr, _
 - ByVal lpThreadAttributes As IntPtr, _
 - ByVal boolInheritHandles As Int32, _
 - ByVal dwCreationFlags As Int32, _
 - ByVal lpEnvironment As IntPtr, _
 - ByVal lpszCurrentDir As IntPtr, _
 - ByRef si As STARTUPINFO, _
 - ByRef pi As PROCESS_INFORMATION _
 - ) As Integer
 - #End Region
 - #Region "Function CloseHandle"
 - Public Declare Function CloseHandle Lib "CoreDll.dll" (ByVal Handle As IntPtr) As Int32
 - #End Region
 - #Region "Function WaitForSingleObjectEx"
 - Public Declare Function WaitForSingleObjectEx Lib "coredll.dll" (ByVal hHandle As IntPtr, _
 - ByVal dwMilliseconds As Int32, _
 - ByVal bAlertable As Int32 _
 - ) As Int32
 - #End Region
 - #Region "Function ShellExecuteEx"
 - Public Declare Function ShellExecuteEx Lib "coredll
 















 
 
 
 
 
 
 