代码实现VB.NET Smartphone进程启动案例

开发 后端
这里实现了VB.NET Smartphone进程启动的案例,使用 ShellExecuteEx函数必须使用微软在VB.net中不直接提供的指针操作,所以我只好根据网上的资料改写了一个VB.net对内存指针的封装类。

学习VB.NET Smartphone时,你可能会遇到VB.net实现Smartphone中进程启动问题,这里将介绍VB.NET Smartphone进程启动问题的解决方法,在这里拿出来和大家分享一下。开始时声明时老是将ShellExecuteEx 和CreateProcess这两个熟悉得不能再熟悉的Win32在VB 6中的声明直接粘到程序中,仅是将VB6的long改为NET的int32,结果老是报错。在网上查了N天资料,才发现原来Win CE的核心API都是在一个coredll.dll文件中,使得我差点没气死!

#T#还有一点是SHELLEXECUTEINFO结构中的lpFile这种指向字符串常量的指针由于字符的编码问题不能象在Win32编程中简单声明为String类型,所在必须声明为Intptr,这样问题就出现了,使用 ShellExecuteEx函数必须使用微软在VB.net中不直接提供的指针操作,所以我只好根据网上的资料改写了一个VB.net对内存指针的封装类,详细VB.NET Smartphone代码及解释如下(新建一个模块,将以下代码粘贴进去即可使用):

  1. Imports System.Runtime.InteropServices '引及Net框架中对底层操作支持的命名空间  
  2. Public Class clsDAMSMobileMarshal '我写的内存管理类  
  3. #Region "与内存有关的API声明"  
  4. REM 以下是与内存有关的移动设备API  
  5. Public Declare Function LocalAlloc Lib "coredll.dll" Alias "LocalAlloc" (ByVal wFlags As Int32, _  
  6. ByVal wBytes As Int32) As IntPtr  
  7. Public Declare Function LocalFree Lib "coredll.dll" Alias "LocalFree" (ByVal hMem As Int32) As Int32  
  8. Public Declare Function LocalLock Lib "coredll.dll" Alias "LocalLock" (ByVal hMem As Int32) As Int32  
  9. Public Declare Function LocalReAlloc Lib "coredll.dll" Alias "LocalReAlloc" (ByVal hMem As IntPtr, _  
  10. ByVal wBytes As Int32, ByVal wFlags As Int32) As IntPtr  
  11. #End Region  
  12. #Region "API常量声明"  
  13. Public Const LMEM_FIXED = 0 
  14. Public Const LMEM_MOVEABLE = &H2  
  15. Public Const LMEM_ZEROINIT = &H40  
  16. Public Const LPTR = LMEM_FIXED Or LMEM_ZEROINIT  
  17. #End Region  
  18.  
  19. Public Shared Function fnAllocHLocal(ByVal ni_i32Size As Int32) As IntPtr  
  20. '申请本地内存,返回一个指向该内存块的指针  
  21. Return LocalAlloc(LPTR, ni_i32Size)  
  22. End Function  
  23.  
  24. Public Shared Function fnFreeHLocal(ByRef ni_pLocal As IntPtr) As Int32  
  25. REM 释放指定的内存块柄  
  26. Dim ti32FunctionReturnValue As Int32  
  27. If ni_pLocal.Equals(IntPtr.Zero) = False Then  
  28. ti32FunctionReturnValue = (LocalFree(ni_pLocal.ToInt32))  
  29. If ti32FunctionReturnValue = 0 Then  
  30. ni_pLocal = IntPtr.Zero  
  31. End If  
  32. End If  
  33. Return (ti32FunctionReturnValue)  
  34. End Function  
  35.  
  36. Public Shared Function fnReAllocHLocal(ByVal ni_pIn As IntPtr, ByVal ni_i32Size As Int32) As IntPtr  
  37. '对指定的内存块重新定义大小  
  38. Return LocalReAlloc(ni_pIn, ni_i32Size, LMEM_MOVEABLE)  
  39. End Function  
  40.  
  41. Public Shared Function fnStringToHLocalUni(ByVal ni_strIn As String) As IntPtr  
  42. '将指定的字符串复制到一个内存块中,并返回该内存块的指针,这个指针必须使用fnFreeHLocal函数释放  
  43. Dim ti32StringBufLength As Int32  
  44. Dim tpTempA As IntPtr  
  45.  
  46. If Not (ni_strIn Is Nothing) Then  
  47. If ni_strIn.Length = 0 Then  
  48. Return IntPtr.Zero  
  49. Else  
  50. ti32StringBufLength = (ni_strIn.Length + 1) * 2 ' 包括***一个中止字符  
  51. tpTempA = fnAllocHLocal(ti32StringBufLength)  
  52. If tpTempA.Equals(IntPtr.Zero) = False Then '申请内存成功  
  53. Marshal.Copy(ni_strIn.ToCharArray, 0, tpTempA, ni_strIn.Length)  
  54. Return tpTempA  
  55. End If  
  56. End If  
  57. End If  
  58. End Function  
  59. End Class  
  60.  
  61. 有了这个辅助函数,以下的API调用就简单了,只需正确声明即可,以下是ShellExecuteEx及CreateProcess涵数及其结构的正确声明(同样是将代码粘贴到一个新建模块中即可调用):  
  62.  
  63. imports System.Runtime.InteropServices  
  64. REM API常数声明-------------------------  
  65. Public Const SW_SHOWNORMAL = 1 
  66. Public Const gcNORMAL_PRIORITY_CLASS = &H20  
  67. Public Const gcINFINITE = &HFFFF  
  68. Public Const WAIT_TIMEOUT = &H102&  
  69.  
  70. #Region "Structure SHELLEXECUTEINFO"  
  71. <StructLayout(LayoutKind.Sequential)> _  
  72. Structure SHELLEXECUTEINFO  
  73. Public cbSize As Int32  
  74. Public fMask As Int32  
  75. Public hwnd As IntPtr  
  76. Public lpVerb As IntPtr 'LPCTSTR,这种类型不能声明为string,只可以老老实实声明为Intptr  
  77. Public lpFile As IntPtr 'LPCTSTR,这种类型不能声明为string,只可以老老实实声明为Intptr  
  78. Public lpParameters As IntPtr 'LPCTSTR,这种类型不能声明为string,只可以老老实实声明为Intptr  
  79. Public lpDirectory As IntPtr 'LPCTSTR,这种类型不能声明为string,只可以老老实实声明为Intptr  
  80. Public nShow As Int32  
  81. Public hInstApp As IntPtr  
  82.  
  83. 'Optional members  
  84. Public lpIDList As IntPtr 'LPVOID  
  85. Public lpClass As IntPtr 'LPCTSTR  
  86. Public hkeyClass As Int32  
  87. Public dwHotKey As Int32  
  88. Public hIcon As Int32  
  89. Public hProcess As IntPtr  
  90.  
  91. Public Sub Dispose()  
  92. '在调用后释放结构中的内存块  
  93. clsDAMSMobileMarshal.fnFreeHLocal(Me.lpVerb)  
  94. clsDAMSMobileMarshal.fnFreeHLocal(Me.lpFile)  
  95. clsDAMSMobileMarshal.fnFreeHLocal(Me.lpParameters)  
  96. clsDAMSMobileMarshal.fnFreeHLocal(Me.lpDirectory)  
  97. End Sub  
  98. End Structure  
  99. #End Region  
  100.  
  101. #Region "Structure STARTUPINFO"  
  102. <StructLayout(LayoutKind.Sequential)> _  
  103. Public Structure STARTUPINFO  
  104. Public cb As Int32  
  105. Public lpReserved As IntPtr  
  106. Public lpDesktop As IntPtr  
  107. Public lpTitle As IntPtr  
  108. Public dwX As Int32  
  109. Public dwY As Int32  
  110. Public dwXSize As Int32  
  111. Public dwYSize As Int32  
  112. Public dwXCountChars As Int32  
  113. Public dwYCountChars As Int32  
  114. Public dwFillAttribute As Int32  
  115. Public dwFlags As Int32  
  116. Public wShowWindow As Int16  
  117. Public cbReserved2 As Int16  
  118. Public lpReserved2 As Int32  
  119. Public hStdInput As Int32  
  120. Public hStdOutput As Int32  
  121. Public hStdError As Int32  
  122. End Structure  
  123. #End Region  
  124.  
  125. #Region "Structure PROCESS_INFORMATION"  
  126. <StructLayout(LayoutKind.Sequential)> _  
  127. Public Structure PROCESS_INFORMATION  
  128. Public hProcess As IntPtr  
  129. Public hThread As IntPtr  
  130. Public dwProcessId As Int32  
  131. Public dwThreadId As Int32  
  132. End Structure  
  133. #End Region  
  134.  
  135. REM api函数声明  
  136. #Region "Function CreateProcess"  
  137. public Overloads Declare Function CreateProcess Lib "coredll.dll" (ByVal imageName As String, _  
  138. ByVal cmdLine As String, _  
  139. ByVal lpProcessAttributes As IntPtr, _  
  140. ByVal lpThreadAttributes As IntPtr, _  
  141. ByVal boolInheritHandles As Int32, _  
  142. ByVal dwCreationFlags As Int32, _  
  143. ByVal lpEnvironment As IntPtr, _  
  144. ByVal lpszCurrentDir As IntPtr, _  
  145. ByRef si As STARTUPINFO, _  
  146. ByRef pi As PROCESS_INFORMATION _  
  147. ) As Integer  
  148. #End Region  
  149.  
  150. #Region "Function CloseHandle"  
  151. Public Declare Function CloseHandle Lib "CoreDll.dll" (ByVal Handle As IntPtr) As Int32  
  152. #End Region  
  153.  
  154. #Region "Function WaitForSingleObjectEx"  
  155. Public Declare Function WaitForSingleObjectEx Lib "coredll.dll" (ByVal hHandle As IntPtr, _  
  156. ByVal dwMilliseconds As Int32, _  
  157. ByVal bAlertable As Int32 _  
  158. ) As Int32  
  159. #End Region  
  160.  
  161. #Region "Function ShellExecuteEx"  
  162. Public Declare Function ShellExecuteEx Lib "coredll 
责任编辑:田树 来源: 博客
相关推荐

2009-10-27 09:31:32

VB.NET启动Sma

2009-11-03 10:18:46

VB.NET继承

2009-10-29 14:02:24

VB和VB.NET比较

2010-01-08 15:41:36

VB.NET窗口关闭

2009-10-29 09:57:16

VB.NET实现数据绑

2010-01-22 15:09:11

VB.NET下载程序

2009-10-27 10:58:00

VB.NET文件名排序

2010-01-20 13:42:10

VB.NET访问INIGetPrivateP

2009-10-26 17:38:22

VB.NET实现缩略图

2009-11-03 13:16:58

VB.NET读取文件

2010-01-14 17:03:01

VB.NET获取网卡地

2009-10-27 09:59:17

VB.NET动态代码

2009-11-02 10:53:34

VB.NET INI文

2009-10-26 17:10:53

VB.NET word

2010-01-22 17:12:08

VB.NET访问Ifr

2009-11-10 14:30:33

VB.NET多窗体

2009-10-26 11:04:36

VB.NET UDP协

2009-10-23 13:22:25

VB.NET实现拖动图

2009-10-12 14:32:40

VB.NET实现定时关

2009-10-27 15:49:11

VB.NET分辩率
点赞
收藏

51CTO技术栈公众号